{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом язык гоу",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.ru\/blogs\/tags\/yazyk-gou\/",
    "feed_url": "https:\/\/blogengine.ru\/blogs\/tags\/yazyk-gou\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.ru\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "126353",
            "url": "https:\/\/bolknote.ru\/all\/upravlenie-alisoy\/",
            "title": "Управление «Алисой»",
            "content_html": "<p>Хочу попробовать решить одну прикладную задачу, пока не буду описывать какую. Для этого надо научиться управлять яндексовской «Алисой» из локальной сети. В идеале — проговаривать произвольную фразу. Почитал интернет, посмотрел как это делается.<\/p>\n<p>Официальный документации нет, но хорошие люди провели обратную разработку и задача выглядит как будто бы не очень сложно. Получаем токен, в сети через <i>mDNS<\/i> по имени <tt>_yandexio._tcp.local.<\/tt> ищем нужную колонку, находим, команды отдаём по протоколу <i>WebSocket<\/i>.<\/p>\n<p>Так как я сейчас <a href=\"https:\/\/bolknote.ru\/all\/kniga-protiv-kompyutera\/\">стараюсь<\/a> больше времени проводить за книгой, чем за компьютером, всё, что успел — освоить модуль <tt>zeroconf<\/tt> для Гоу, чтобы по имени колонки получать её айпи-адрес и порт.<\/p>\n<p>Получившийся код выглядит так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"go\">import &quot;github.com\/grandcat\/zeroconf&quot;\n\/\/ …тут остальные импорты…\n\nconst Service = &quot;_yandexio._tcp&quot;\nconst Domain = &quot;local.&quot;\n\nfunc getAlisaAddr(instance string) (*zeroconf.ServiceEntry, error) {\n    resolver, err := zeroconf.NewResolver(nil)\n    if err != nil {\n        log.Fatalln(&quot;Failed to initialize resolver:&quot;, err)\n    }\n\n    entries := make(chan *zeroconf.ServiceEntry)\n    ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\n\n    err = resolver.Lookup(ctx, instance, Service, Domain, entries)\n    if err != nil {\n        return nil, err\n    }\n\n    entry := &lt;-entries\n    cancel()\n\n    &lt;-ctx.Done()\n\n    if entry == nil {\n        return nil, fmt.Errorf(\n              &quot;Failed to lookup for service instance &#039;%s&#039;&quot;,\n              instance\n       )\n    }\n\n    return entry, nil\n}<\/code><\/pre><p>Теперь надо разобраться где взять токен и как выглядят команды.<\/p>\n",
            "date_published": "2024-03-21T23:19:58+05:00",
            "date_modified": "2024-03-21T23:19:55+05:00",
            "tags": [
                "программирование",
                "язык гоу",
                "яндекс.алиса"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Thu, 21 Mar 2024 23:19:58 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "126353",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}