Адаптер WeChatMp - Документация по функциональности платформы
Основная информация
- Название модуля:
ErisPulse-WechatMpAdapter - Идентификатор платформы:
mp(альтернативное имя:wechat_mp) - Версия модуля: 4.1.0
- Разработчик: ErisPulse
- Зависимости:
cryptography
Обновление парадигмы v5 (4.2.0)
- Наследование BaseConverter: Общие поля конвертера строятся фреймворком build_base_event
- Минимальный набор DSL-команд API: get_self_info (appid) / get_status / get_version / get_supported_actions
- Мягкая зависимость фреймворка: Во время выполнения проверяется наличие ErisPulse>=2.7.1 и выводится предупреждение; при запуске выводится лог версии
Поддерживаемые возможности платформ
- Прием: Обратные сообщения от публичного аккаунта и события подписки/отписки и т.д. (в открытом виде/в защищенном режиме), проверка подлинности подписи
- Отправка: Сообщения службы поддержки (Text/Image и т.д., через Send DSL)
- API: Информация о счете (appid) и состояние выполнения (минимальный набор)
Поддерживаемые типы отправки сообщений
| Метод | Описание | API WeChat |
|---|---|---|
Text(text) |
Отправка текста | Клиентская поддержка message/custom/send |
Image(file) |
Отправка изображения (автоматическая загрузка для получения media_id) | Клиентская поддержка + media/upload |
Voice(file) |
Отправка голосового сообщения (автоматическая загрузка для получения media_id) | Клиентская поддержка + media/upload |
Video(file, title, description) |
Отправка видео (автоматическая загрузка для получения media_id) | Клиентская поддержка + media/upload |
Music(url, title, description, ...) |
Отправка музыки | Клиентская поддержка |
News(articles) |
Отправка сообщения с изображением и текстом | Клиентская поддержка |
Template(template_id, data, url) |
Отправка шаблонного сообщения | message/template/send |
Menu(head_content, list, tail_content) |
Отправка сообщения с меню | Клиентская поддержка msgmenu |
Raw_ob12(message) |
Отправка сообщения в формате OneBot12 | - |
Описание медиафайлов
- Поддерживаются три типа параметров:
strURL (начинается сhttp://илиhttps://): автоматически загружается и загружается на серверstrлокальный путь к файлу: автоматически читается и загружается на серверbytesдвоичные данные: загружаются напрямуюstrmedia_id: с префиксомmedia:можно повторно использовать уже загруженный media_id
- После загрузки получается временный материал
media_id, срок действия которого составляет 3 дня
Важные ограничения
- Сообщения клиентской поддержки можно отправлять только в течение 48 часов после взаимодействия пользователя с публикацией
- После истечения 48 часов необходимо использовать шаблонные сообщения (требуется сценарий авторизации пользователя)
- Непроверенные сервисные аккаунты (с
verified=false) не могут отправлять сообщения активно, могут только отвечать пассивно (см. выше «Проверенные сервисные аккаунты и пассивные ответы»)
Типы событий
События сообщений (message)
Все сообщения от пользователей имеют detail_type: private (сценарий 1v1 для публичных аккаунтов).
| Тип сообщения WeChat | Тип сегмента сообщения | Описание |
|---|---|---|
text |
text |
Текстовое сообщение |
image |
image |
Сообщение с изображением |
voice |
voice |
Голосовое сообщение (с результатом распознавания речи) |
video |
video |
Видеосообщение |
shortvideo |
video |
Короткое видео (отмечено mp_shortvideo) |
location |
location |
Сообщение с геолокацией |
link |
text |
Сообщение с ссылкой (преобразуется в текст) |
События уведомлений (notice)
Типы событий различаются по полю mp_event.
| Событие WeChat | mp_event |
Описание |
|---|---|---|
subscribe |
subscribe |
Подписка на публичный аккаунт |
unsubscribe |
unsubscribe |
Отмена подписки |
SCAN |
scan |
Сканирование QR-кода с параметрами |
LOCATION |
location_report |
Отправка геолокации |
CLICK |
menu_click |
Нажатие на пользовательское меню |
VIEW |
menu_view |
Переход по ссылке из меню |
TEMPLATESENDJOBFINISH |
template_send_finish |
Результат отправки шаблонного сообщения |
MASSSENDJOBFINISH |
mass_send_finish |
Результат массовой рассылки сообщений |
Расширение платформы
Поле, специфичное для WeChat, в объекте события (префикс mp_):
| Поле | Тип | Описание |
|---|---|---|
mp_raw |
str | Исходные XML-данные |
mp_raw_type |
str | Тип исходного сообщения/события |
mp_msg_id |
str | ID сообщения WeChat |
mp_event |
str | Тип события (только для уведомлений о событиях) |
mp_event_key |
str | Ключ события (нажатие меню/сканирование и т.д.) |
mp_to_user |
str | Ответный微信号 (оригинальный ID публичного аккаунта) |
mp_from_user |
str | Отправитель OpenID |
mp_data |
dict | Данные XML, разобранные в словарь |
Методы расширения событий
Регистрируются с помощью register_event_mixin("mp", ...), после чего можно напрямую вызывать на объекте события:
| Метод | Возвращаемое значение | Описание |
|---|---|---|
get_openid() |
str | OpenID отправителя |
get_msg_type() |
str | Тип исходного сообщения WeChat |
get_event() |
str | Тип события (только для уведомлений о событиях) |
get_content() |
str | Содержимое сообщения в виде обычного текста |
get_raw_xml() |
str | Исходные данные в формате XML |
Параметры конфигурации
Конфигурация нескольких аккаунтов
Каждый аккаунт соответствует одному публичному аккаунту:
[WechatMpAdapter.accounts.main]
appid = "wx1234567890abcdef"
appsecret = "your_app_secret_here"
token = "your_callback_token"
encoding_aes_key = "" # Требуется только для режима безопасности/совместимости (43 символа)
callback_path = "/mp/main" # Путь обратного вызова
verified = true # Является ли аккаунтом с подтвержденной сертификацией (влияет на возможность отправки сообщений)
enable = true
[WechatMpAdapter.accounts.secondary]
appid = "wx0987654321fedcba"
appsecret = "another_app_secret"
token = "another_callback_token"
callback_path = "/mp/secondary"
enable = true
Описание полей конфигурации
| Поле | Обязательно | Описание |
|---|---|---|
appid |
Да | AppID публичного аккаунта |
appsecret |
Да | AppSecret (secret) публичного аккаунта |
token |
Нет | Токен для проверки обратного вызова (рекомендуется использовать для включения проверки подписи) |
encoding_aes_key |
Нет | Ключ для шифрования и дешифрования сообщений (43 символа, требуется в режиме безопасности) |
callback_path |
Нет | Шаблон пути обратного вызова, по умолчанию /mp/{account}, где {account} заменяется именем аккаунта |
verified |
Нет | Является ли аккаунтом с подтвержденной сертификацией, по умолчанию true (см. ниже) |
enable |
Нет | Включена ли конфигурация, по умолчанию true |
Подтвержденный сервисный аккаунт и пассивные ответы (verified)
verified = true(по умолчанию, подтвержденный сервисный аккаунт): можно использовать сообщения службы поддержки для отправки активных сообщений (в течение 48 часов) и шаблонные сообщения.verified = false(не подтвержденный аккаунт подписки):- Сообщения службы поддержки / шаблонные сообщения можно отправлять только в контексте пассивного ответа webhook (в течение 15 секунд после получения сообщения от пользователя, один раз) — адаптер автоматически перехватывает отправку и преобразует её в пассивный ответ.
- Активная отправка (например, по расписанию) вернет ошибку с кодом
retcode=34003.
Описание режимов шифрования
Мини-приложение WeChat предоставляет три режима шифрования и расшифровки сообщений:
| Режим | Описание | encoding_aes_key | Проверяемое поле |
|---|---|---|---|
| Режим в открытом виде | XML передается в открытом виде | Не требуется | signature |
| Совместимый режим | Существуют как открытые, так и зашифрованные сообщения | Необязателен | signature / msg_signature |
| Безопасный режим | Все сообщения зашифрованы | Обязателен | msg_signature |
Адаптер автоматически обрабатывает:
- Режим в открытом виде: проверяет
signatureи напрямую анализирует XML - Безопасный/совместимый режим: обнаруживает поле
Encrypt, проверяетmsg_signatureи расшифровывает с помощью AES-256-CBC - Расшифровка зависит от библиотеки
cryptography(уже указана в зависимостях)
Callback-маршруты
Адаптер регистрирует два маршрута (GET и POST) для каждого включённого аккаунта:
- GET: Проверка подключения сервера WeChat, после проверки подписи возвращает
echostr - POST: Приём сообщений и событий от пользователя, проверка подписи → расшифровка (при необходимости) → преобразование → emit
Фактические пути доступа автоматически добавляют префикс модуля, например, путь регистрации /mp/main,
фактические пути доступа будут /mp_{account}_verify/mp/main и /mp_{account}_message/mp/main.
API-ответ
Все вызовы call_api возвращают стандартизированный ответ:
- Успех:
status: "ok",retcode: 0 - Ошибка:
status: "failed",retcode: 34000+errcode - Всегда включает
mp_raw(сырой ответ) иmessage_id