sidebar_position: 15
title: "Weixin (WeChat)"
description: "Connect Hermes Agent to personal WeChat accounts via the iLink Bot API"
lang: ru
Вейсинь (WeChat)
Подключите Hermes к WeChat (微信), платформе персональных сообщений Tencent. Адаптер использует iLink Bot API от Tencent для личных учетных записей WeChat — это отличается от WeCom (Enterprise WeChat). Сообщения доставляются посредством длительного опроса, поэтому не требуется общедоступная конечная точка или веб-перехватчик.
:::информация
Этот адаптер предназначен для личных учетных записей WeChat (微信). Если вам нужен корпоративный/корпоративный WeChat, вместо этого воспользуйтесь адаптером WeCom.
:::предупреждение об идентификации бота iLink — обычные группы WeChat могут не работать
Вход с помощью QR подключает Hermes к идентификатору бота iLink (например, a5ace6fd482e@im.bot), а не к обычной личной учетной записи WeChat, полностью поддерживающей сценарии. Последствия:
Бота iLink, как правило, нельзя пригласить в обычные группы WeChat, как это можно сделать с обычным контактом.
iLink обычно не доставляет обычные групповые события WeChat (включая @-упоминания личной учетной записи, используемой для входа в QR-код) на шлюз для большинства учетных записей типа бота.
@-упоминание личной учетной записи WeChat, используемой для сканирования QR-кода, не то же самое, что @-упоминание бота iLink — бот представляет собой отдельную личность.
Приведенные ниже настройки WEIXIN_GROUP_POLICY / WEIXIN_GROUP_ALLOWED_USERS вступают в силу только тогда, когда iLink действительно возвращает групповые события для вашего типа учетной записи. В противном случае групповые сообщения никогда не дойдут до Hermes, независимо от политики.
На практике в большинстве развертываний надежно работают только DM с ботом iLink. Если групповая доставка не работает после настройки, ограничение существует на стороне iLink, а не в Hermes. Шлюз регистрирует WARNING при запуске всякий раз, когда для WEIXIN_GROUP_POLICY установлено любое значение, кроме disabled.
Предварительные условия
Личный аккаунт WeChat
Пакеты Python: aiohttp и cryptography.
Отображение QR-кода терминала включено, когда Hermes установлен с дополнением messaging.
Установите необходимые зависимости:
pipinstallaiohttpcryptography
# Optional: for terminal QR code display
pipinstallhermes-agent[messaging]
Настройка
1. Запустите мастер установки.
Самый простой способ подключить свою учетную запись WeChat — через интерактивную настройку:
hermesgatewaysetup
При появлении запроса выберите Weixin. Мастер:
Запросите QR-код у iLink Bot API.
Отобразите QR-код на своем терминале (или укажите URL-адрес).
Подождите, пока вы отсканируете QR-код с помощью мобильного приложения WeChat.
Предложить подтвердить вход на телефоне.
Автоматически сохраните учетные данные в ~/.hermes/weixin/accounts/.
После подтверждения вы увидите сообщение типа:
微信连接成功,account_id=your-account-id
Мастер сохраняет account_id, token и base_url, поэтому вам не нужно настраивать их вручную.
2. Настройка переменных среды
После первоначального входа в систему QR установите как минимум идентификатор учетной записи в ~/.hermes/.env:
WEIXIN_ACCOUNT_ID=your-account-id
# Optional: override the token (normally auto-saved from QR login)# WEIXIN_TOKEN=your-bot-token# Optional: restrict accessWEIXIN_DM_POLICY=open
WEIXIN_ALLOWED_USERS=user_id_1,user_id_2
# Optional: restore legacy multiline splitting behavior# WEIXIN_SPLIT_MULTILINE_MESSAGES=true# Optional: home channel for cron/notificationsWEIXIN_HOME_CHANNEL=chat_id
WEIXIN_HOME_CHANNEL_NAME=Home
3. Запустите шлюз
hermesgateway
Адаптер восстановит сохраненные учетные данные, подключится к API iLink и начнет длительный опрос сообщений.
Особенности
Транспорт с длинным опросом – не требуется общедоступная конечная точка, веб-перехватчик или WebSocket.
Вход по QR-коду — настройка сканирования для подключения через hermes gateway setup
Сообщения в DM — настраиваемые политики доступа; групповой обмен сообщениями зависит от того, действительно ли iLink доставляет групповые события для подключенного удостоверения (часто это не относится к учетным записям ботов iLink — см. предупреждение выше).
Поддержка мультимедиа — изображения, видео, файлы и голосовые сообщения.
CDN с шифрованием AES-128-ECB — автоматическое шифрование/дешифрование для всех передач мультимедиа.
Постоянство токена контекста — непрерывность ответа на диске при перезапуске.
Форматирование Markdown — сохраняет Markdown, включая заголовки, таблицы и блоки кода, поэтому клиенты WeChat, поддерживающие Markdown, могут отображать его в исходном виде.
Умное разбиение сообщений — сообщения остаются в виде одного пузырька, если лимит меньше; только негабаритные полезные нагрузки разделяются по логическим границам
Индикаторы ввода — показывают статус «ввод…» в клиенте WeChat, пока агент обрабатывает
Защита SSRF — URL-адреса исходящих мультимедиа проверяются перед загрузкой.
Автоматическая повторная попытка с отсрочкой — восстановление после временных ошибок API.
Параметры конфигурации
Установите их в config.yaml под platforms.weixin.extra:
Ключ
По умолчанию
Описание
account_id
—
Идентификатор учетной записи бота iLink (обязательно)
token
—
Токен iLink Bot (обязательно, автоматически сохраняется при входе в QR)
base_url
https://ilinkai.weixin.qq.com
iLink API base URL
cdn_base_url
https://novac2c.cdn.weixin.qq.com/c2c
Базовый URL-адрес CDN для передачи мультимедиа
dm_policy
open
Доступ в ЛС: open, allowlist, disabled, pairing
group_policy
disabled
Групповой доступ: open, allowlist, disabled
allow_from
[]
Идентификаторы пользователей, разрешенные для личных сообщений (когда dm_policy=allowlist)
group_allow_from
[]
Идентификаторы групп разрешены (когда group_policy=allowlist)
split_multiline_messages
false
При true многострочные ответы разделяются на несколько сообщений чата (устаревшее поведение). При false сохраняйте многострочные ответы как одно сообщение, если они не превышают ограничение по длине.
Политики доступа
Политика DM
Определяет, кто может отправлять прямые сообщения боту:
Значение
Поведение
open
Любой может отправить сообщение боту (по умолчанию)
allowlist
Только идентификаторы пользователей в allow_from могут отправлять сообщения
Определяет, в каких группах реагирует бот когда iLink доставляет групповые события для подключенного удостоверения. Для идентификаторов бота iLink с QR-входом (например, ...@im.bot) групповые события обычно не доставляются вообще, поэтому эта политика может не иметь эффекта — см. предупреждение об ограничении бота iLink в верхней части страницы.
Значение
Поведение
open
Бот отвечает во всех группах (если проводятся мероприятия)
allowlist
Бот отвечает только на группы с идентификаторами, указанными в group_allow_from (если события доставляются)
disabled
Все групповые сообщения игнорируются (по умолчанию)
WEIXIN_GROUP_POLICY=allowlist
# NOTE: this is a comma-separated list of group chat IDs, NOT member user IDs,# despite the variable name containing "USERS". Keep this in mind when configuring.WEIXIN_GROUP_ALLOWED_USERS=group_id_1,group_id_2
:::примечание
Групповая политика по умолчанию для Weixin — disabled (в отличие от WeCom, где по умолчанию используется open). Это сделано намеренно: личные учетные записи WeChat могут входить во многие группы, а идентификаторы ботов iLink обычно вообще не могут получать обычные групповые сообщения WeChat. Шлюз регистрирует WARNING при запуске, если вы установили для WEIXIN_GROUP_POLICY любое значение, кроме disabled.
Медиа-поддержка
Входящий (прием)
Адаптер получает мультимедийные вложения от пользователей, загружает их из WeChat CDN, расшифровывает и локально кэширует для обработки агентом:
Тип
Как это решается
Изображения
Загружено, расшифровано AES и кэшировано в формате JPEG.
Видео
Загружено, расшифровано AES и кэшировано как MP4.
Файлы
Скачивается, расшифровывается по AES и кэшируется. Исходное имя файла сохраняется.
Голос
Если доступна текстовая транскрипция, она извлекается как текст. В противном случае аудио (формат SILK) загружается и кэшируется.
Цитируемые сообщения. Медиафайлы из цитируемых (ответных) сообщений также извлекаются, поэтому агент имеет контекст о том, на что отвечает пользователь.
CDN с шифрованием AES-128-ECB
Медиа-файлы WeChat передаются через зашифрованную CDN. Адаптер обрабатывает это прозрачно:
Входящие: Зашифрованные медиафайлы загружаются из CDN с использованием URL-адресов encrypted_query_param, затем расшифровываются с помощью AES-128-ECB с использованием ключа для каждого файла, указанного в полезных данных сообщения.
Исходящие: файлы шифруются локально с помощью случайного ключа AES-128-ECB, загружаются в CDN, а зашифрованная ссылка включается в исходящее сообщение.
Ключ AES имеет длину 16 байт (128 бит). Ключи могут поступать в необработанном формате Base64 или в шестнадцатеричном формате — адаптер обрабатывает оба формата.
Для этого требуется пакет cryptography Python.
Никакой настройки не требуется — шифрование и дешифрование происходят автоматически.
Исходящие (отправка)
Метод
Что он отправляет
send
Текстовые сообщения в формате Markdown
send_image / send_image_file
Собственные графические сообщения (через загрузку CDN)
send_document
Вложения файлов (через загрузку CDN)
send_video
Видеосообщения (через загрузку CDN)
Все исходящие медиафайлы проходят через зашифрованный поток загрузки CDN:
Сгенерируйте случайный ключ AES-128.
Зашифруйте файл с заполнением AES-128-ECB + PKCS#7.
Запросите URL-адрес загрузки у iLink API (getuploadurl)
Загрузите зашифрованный текст в CDN.
Отправьте сообщение с зашифрованной ссылкой на медиафайл.
Сохранение токена контекста
API-интерфейс iLink Bot требует, чтобы context_token возвращался с каждым исходящим сообщением для данного узла. Адаптер поддерживает хранилище контекстных токенов на диске:
Токены сохраняются для каждой учетной записи + узла в ~/.hermes/weixin/accounts/<account_id>.context-tokens.json.
При запуске восстанавливаются ранее сохраненные токены
Каждое входящее сообщение обновляет сохраненный токен для этого отправителя.
Исходящие сообщения автоматически включают последний токен контекста.
Это обеспечивает непрерывность ответа даже после перезапуска шлюза.
Форматирование уценки
Клиенты WeChat, подключенные через API iLink Bot, могут отображать Markdown напрямую, поэтому адаптер сохраняет Markdown, а не переписывает его:
Заголовки остаются заголовками Markdown (#, ##, ...)
Таблицы остаются в виде таблиц Markdown.
Ограждения кода остаются изолированными блоками кода.
Чрезмерные пустые строки сворачиваются в двойные символы новой строки за пределами изолированных блоков кода.
Разбиение сообщений на части
Сообщения доставляются как одно сообщение чата, если они соответствуют ограничениям платформы. Для доставки разделяются только негабаритные грузы:
Максимальная длина сообщения: 4000 символов.
Сообщения, не превышающие лимит, остаются нетронутыми, даже если они содержат несколько абзацев или разрывов строк.
Слишком большие сообщения разбиваются по логическим границам (абзацы, пустые строки, границы кода).
Ограждения кода по возможности сохраняются нетронутыми (никогда не разделяйте средний блок, если только ограждение не превышает лимит)
Отдельные блоки слишком большого размера возвращаются к логике усечения базового адаптера.
Задержка между блоками 0,3 с предотвращает снижение ограничения скорости WeChat при отправке нескольких фрагментов.
Индикаторы набора текста
Адаптер показывает статус набора текста в клиенте WeChat:
При поступлении сообщения адаптер получает typing_ticket через API getconfig.
Билеты на набор текста кэшируются по 10 минут на каждого пользователя.
Шлюз автоматически активирует индикаторы набора текста, пока агент обрабатывает сообщение.
Соединение с длинным опросом
Адаптер использует длинный опрос HTTP (не WebSocket) для получения сообщений:
Как это работает
Подключение: проверяет учетные данные и запускает цикл опроса.
Опрос: Вызывает getupdates с таймаутом 35 секунд; сервер удерживает запрос до тех пор, пока не поступят сообщения или не истечет тайм-аут
Отправка: Входящие сообщения отправляются одновременно через asyncio.create_task.
Буфер синхронизации: Постоянный курсор синхронизации (get_updates_buf) сохраняется на диске, поэтому после перезапуска адаптер возобновляет работу с правильного положения.
Повторная попытка
При ошибках API адаптер использует простую стратегию повтора:
Состояние
Поведение
Переходная ошибка (1–2)
Повторить попытку через 2 секунды
Повторные ошибки (3+)
Выключитесь на 30 секунд, затем сбросьте счетчик
Сессия истекла (errcode=-14)
Пауза на 10 минут (может потребоваться повторный вход)
Тайм-аут
Немедленно повторите опрос (обычное поведение при длительном опросе)
Дедупликация
Входящие сообщения дедуплицируются с использованием идентификаторов сообщений с 5-минутным окном. Это предотвращает двойную обработку во время сбоев в сети или перекрытия ответов на опросы.
Блокировка токена
Только один экземпляр шлюза Weixin может использовать данный токен одновременно. Адаптер получает блокировку области при запуске и снимает ее при завершении работы. Если другой шлюз уже использует тот же токен, запуск завершается с информативным сообщением об ошибке.
Все переменные среды
Переменная
Требуется
По умолчанию
Описание
WEIXIN_ACCOUNT_ID
✅
—
Идентификатор учетной записи бота iLink (из входа в систему QR)
WEIXIN_TOKEN
✅
—
Токен iLink Bot (автоматически сохраняется при входе в QR)
WEIXIN_BASE_URL
—
https://ilinkai.weixin.qq.com
iLink API base URL
WEIXIN_CDN_BASE_URL
—
https://novac2c.cdn.weixin.qq.com/c2c
Базовый URL-адрес CDN для передачи мультимедиа
WEIXIN_DM_POLICY
—
open
Политика доступа к DM: open, allowlist, disabled, pairing
WEIXIN_GROUP_POLICY
—
disabled
Политика группового доступа: open, allowlist, disabled
WEIXIN_ALLOWED_USERS
—
(пусто)
Идентификаторы пользователей, разделенные запятыми, для белого списка DM
WEIXIN_GROUP_ALLOWED_USERS
—
(пусто)
Разделенные запятыми идентификаторы групповых чатов (не идентификаторы пользователей-участников) для белого списка группы. Имя переменной является устаревшим — оно ожидает идентификаторы групп, а не идентификаторы пользователей.
WEIXIN_HOME_CHANNEL
—
—
Идентификатор чата для вывода cron/уведомлений
WEIXIN_HOME_CHANNEL_NAME
—
Home
Отображаемое имя домашнего канала
WEIXIN_ALLOW_ALL_USERS
—
—
Флаг уровня шлюза, разрешающий всем пользователям (используется мастером установки)
Поиск неисправностей
Проблема
Исправить
Weixin startup failed: aiohttp and cryptography are required
Установите оба: pip install aiohttp cryptography
Weixin startup failed: WEIXIN_TOKEN is required
Запустите hermes gateway setup, чтобы завершить вход по QR, или установите WEIXIN_TOKEN вручную
Weixin startup failed: WEIXIN_ACCOUNT_ID is required
Установите WEIXIN_ACCOUNT_ID в своем .env или запустите hermes gateway setup
Another local Hermes gateway is already using this Weixin token
Сначала остановите другой экземпляр шлюза — разрешен только один опросчик на каждый токен
Сессия истекла (errcode=-14)
Срок действия вашего сеанса входа в систему истек. Повторно запустите hermes gateway setup, чтобы отсканировать новый QR-код
Срок действия QR-кода истек во время установки
QR автоматически обновляется до 3 раз. Если срок его действия продолжает истекать, проверьте сетевое соединение
Бот не отвечает в личные сообщения
Проверьте WEIXIN_DM_POLICY — если установлено значение allowlist, отправитель должен находиться в WEIXIN_ALLOWED_USERS
Бот игнорирует групповые сообщения
По умолчанию групповая политика имеет значение disabled. Установите WEIXIN_GROUP_POLICY=open или allowlist — но учтите, что идентификаторы ботов iLink с QR-входом (...@im.bot) обычно вообще не могут получать обычные групповые сообщения WeChat. Если в журналах шлюза не отображаются необработанные входящие события для групповых сообщений, ограничение существует на стороне iLink, а не в Hermes.
Загрузка/загрузка мультимедиа не удалась
Убедитесь, что cryptography установлен. Проверьте доступ к сети novac2c.cdn.weixin.qq.com
Blocked unsafe URL (SSRF protection)
URL-адрес исходящего мультимедиа указывает на частный/внутренний адрес. Разрешены только общедоступные URL-адреса
Голосовые сообщения отображаются в виде текста
Если WeChat предоставляет транскрипцию, адаптер использует текст. Это ожидаемое поведение
Сообщения дублируются
Адаптер выполняет дедупликацию по идентификатору сообщения. Если вы видите дубликаты, проверьте, запущено ли несколько экземпляров шлюза
iLink POST ... HTTP 4xx/5xx
Ошибка API сервиса iLink. Проверьте действительность вашего токена и подключение к сети
QR-код терминала не отображается
Переустановите с дополнительными сообщениями: pip install hermes-agent[messaging]. Либо откройте URL-адрес, напечатанный над QR