? Изображение Docker |
Небольшой веб-перехватчик-робот WeChat помогает устранить множество препятствий на пути вашего собственного развития. Он основан на http-запросах. Он отличается от перехватчиков WeChat, поскольку он основан на веб-API, его преимущество заключается в том, что его можно развернуть на таких устройствах, как Arm. архитектура.
Осторожность
В настоящее время проект основан на веб-сайте WeChat, который сам по себе может быть ограничен. Кроме того, он отключается примерно раз в два дня. Помимо обычного ремонта функций, он не принимает запросы на новые функции. Протокол Windows находится в стадии разработки и должен быть доступен для вас в ближайшем будущем!
Функция | веб-протокол | протокол Windows |
---|---|---|
Текущая доступность | ✅ | |
ветка кода | основной | окна |
Докер-тег | последний | окна |
<Отправить сообщение> | ✅Один/несколько/группа | ✅Один/несколько/группа |
Отправить текст | ✅ | ✅ |
Отправить фотографии | ✅ Анализ локального изображения/URL-изображения | ✅ Анализ локального изображения/URL-изображения |
Отправить видео (mp4) | ✅ Анализ локального видео/URL-видео | |
Отправить документы | ✅ Парсинг локального файла/URL-файла | ✅ Парсинг локального файла/URL-файла |
<Получить сообщение> | ||
получить текст | ✅ | ✅ |
получить голос | ✅ | |
получать фотографии | ✅ | |
получить видео | ✅ | |
получать файлы | ✅ | |
Получить ссылку на твит общедоступного аккаунта | ✅ | |
Получать системные уведомления | ✅ Онлайн-уведомление/офлайн-уведомление/ненормальное уведомление | |
Приобретение аватара | ✅ | |
Быстрый ответ | ✅ | ✅ |
<Управление группой> | ||
<Управление друзьями> | ||
Получить запрос на добавление в друзья | ✅ | |
Запрос через друга | ✅ | |
Получить список контактов | ||
<Другие функции> | ||
Автоматический вход без отключения | ✅ | |
API-аутентификация | ✅ | ✅ |
n8n бесшовный доступ | ✅ | |
Поддержка развертывания докера | ✅ рука64 / amd64 | ✅ amd64 |
Экспорт файла журнала | ✅ | ✅ |
Упомянутые выше функции еще не реализованы. Они ограничены ограничениями протокола WeChat. Разные протоколы поддерживают разные функции. Не все функции можно подключить, например:
npx wechatbot-webhook
Если соединение не отключено, по умолчанию будет сохранен последний вход в систему. Чтобы изменить свою учетную запись, выполните следующую команду:
npx wechatbot-webhook -r
Если вы столкнулись с ошибкой установки, убедитесь, что версия вашего узла >= 18.14.1 #227.
Скопируйте API push-сообщения из командной строки, например http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]
Откройте новый терминал и попробуйте следующий скрипт. Измените значения полей to и token на нужные значения.
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' { "to": "测试昵称", data: { "content": "Hello World!" }} '
Важный
Менеджер пакетов перенесен на pnpm. Используйте его для установки зависимостей для поддержки некоторых нестандартных временных исправлений пакетов и ускорения установки зависимостей.
docker pull dannicool/docker-wechatbot-webhook
# 启动容器并映射日志目录,日志按天维度生成,e.g: app.2024-01-01.log
docker run -d --name wxBotWebhook -p 3001:3001
-v ~ /wxBot_logs:/app/log
dannicool/docker-wechatbot-webhook
wget -O docker-compose.yml https://cdn.jsdelivr.net/gh/danni-cool/wechatbot-webhook@main/docker-compose.yml && docker-compose down && docker-compose -p wx_bot_webhook up
docker logs -f wxBotWebhook
Найдите адрес входа в систему с помощью QR-кода, часть URL-адреса под изображением, откройте его с помощью браузера, отсканируйте код, чтобы войти в wx.
https://localhost:3001/login?token=[ВАШ_ПЕРСОНАЛЬНЫЙ_ТОКЕН]
Советы. Вам необходимо добавить параметры, используя -e, и разделить несколько строк с помощью , например -e RECVD_MSG_API="https://example.com/your/url"
Функция | переменная | Примечание |
---|---|---|
Уровень журнала | LOG_LEVEL=информация | Уровень журнала, по умолчанию — информация, влияет только на текущий вывод журнала. Для подробного вывода рассмотрите возможность использования отладки. Независимо от того, как изменяется это значение, в файл журнала всегда записываются журналы уровня отладки. |
API получения сообщений | RECVD_MSG_API=https://example.com/your/url | Если вы хотите самостоятельно обрабатывать логику получения сообщений, например связывание на основе сообщений, укажите URL-адрес логики обработки. |
API получения сообщений для приема сообщений, отправленных вами самостоятельно. | ACCEPT_RECVD_MSG_MYSELF=ложь | RECVD_MSG_API Следует ли получать сообщения от самого себя (установлено значение true, то есть получено, по умолчанию — false) |
Пользовательский токен API входа в систему | LOGIN_API_TOKEN=abcdefg123 | Вы также можете настроить свой собственный токен входа. Если вы его не настроите, он будет сгенерирован по умолчанию. |
Отключить автоматический вход | DISABLE_AUTO_LOGIN=истина | Чтобы исключить учетные записи, не относящиеся к WeChat, вы можете полагаться на текущий сеанс входа в систему, чтобы избежать входа в систему . Если вы хотите каждый раз сканировать QR-код для входа в систему, добавьте эту конфигурацию. |
В интерфейс версии v2 добавлена функция групповой отправки. Для интерфейса версии v1 перейдите к устаревшему API.
POST
application/json
payload
Отправьте текст или файлы по внешним ссылкам, и внешние ссылки будут преобразованы в изображения или файлы.
параметр | иллюстрировать | тип данных | значение по умолчанию | Может ли он быть пустым? | Дополнительные параметры |
---|---|---|---|---|---|
к | Для получателя сообщения входящая String будет отправлена на никнейм по умолчанию (то же самое относится и к имени группы). Структура входящего Object может быть отправлена человеку, сделавшему заметку, например: {alias: '备注名'} . Имя группы не поддерживает имя заметки. | String Object | - | Н | - |
isRoom | Отправлять ли сообщение группе , этот параметр определяет, ищете ли вы при поиске кого-то группу или человека, ведь никнейм фактически совпадает с названием группы с точки зрения технической обработки. | Boolean | false | Да | true false |
данные | Структуру тела сообщения см. в payload.data ниже. | Array Object | false | Н | true false |
payload.data
параметр | иллюстрировать | тип данных | значение по умолчанию | Может ли он быть пустым? | Дополнительные параметры |
---|---|---|---|---|---|
тип | Тип сообщения . Оставьте поле пустым и преобразуйте его в обычный текст. | String text | - | Да | URL-адрес text fileUrl |
содержание | Содержимое сообщения . Если вы хотите отправить несколько URL-адресов и проанализировать их, укажите тип fileUrl. При этом заполните URL-адреса в содержимом и разделите их английскими запятыми. | String | - | Н | - |
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": { "content": "你好" }
} '
В некоторых случаях прямая отправка имени файла URL-адреса может быть не тем, что нам нужно. Параметр запроса
$alias
можно использовать для объединения URL-адреса и указания имени файла, отправляемого в цель (примечание: псевдонимы не выполняют преобразование файлов).
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": {
"type": "fileUrl" ,
"content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg?$alias=cloud.jpg"
}
} '
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testGroup",
"isRoom": true,
"data": { "type": "fileUrl" , "content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg" },
} '
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": [
{
"type": "text",
"content": "你好"
},
{
"type": "fileUrl",
"content": "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
}
]
} '
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' [
{
"to": "testUser1",
"data": {
"content": "你好"
}
},
{
"to": "testUser2",
"data": [
{
"content": "你好"
},
{
"content": "近况如何?"
}
]
}
] '
response
на возвращаемое значениеsuccess
: сообщение отправлено успешно или нет. Даже если часть группового сообщения отправлена успешно, оно вернет true
message
: сообщение, появляющееся при возникновении ошибки.task
: отправить детали задачиtask.successCount
: количество отправленных успешных сообщений.task.totalCount
: общее количество сообщенийtask.failedCount
: количество неудачных сообщений для отправки.task.reject
: параметры и сообщения об ошибках из-за неудачной проверки параметров.task.sentFailed
: поскольку отправка не удалась и появилось сообщение об ошибке.task.notFound
: поскольку пользователь или группа не найдены и выдается сообщение об ошибке.Обеспечьте согласованность отправки одного сообщения. Если не проверить определенный параметр, все задачи отправки сообщений будут прекращены.
{
"success" : true ,
"message" : " " ,
"task" : {
"successCount" : 0 ,
"totalCount" : 0 ,
"failedCount" : 0 ,
"reject" : [],
"sentFailed" : [],
"notFound" : []
}
}
Чтение файлов в настоящее время поддерживает только однократную отправку.
POST
multipart/form-data
payload
параметр | иллюстрировать | тип данных | значение по умолчанию | Может ли он быть пустым? | Необязательное значение |
---|---|---|---|---|---|
к | Для получателя сообщения входящая String по умолчанию отправляется на псевдоним (то же самое относится и к имени группы). Структура входящей строки Json поддерживает отправку человеку, сделавшему заметку, например: --form 'to=). "{alias: "小号"}" ', имя группы не поддерживает имена комментариев. | String | - | Н | - |
isRoom | Отправлять ли групповые сообщения , обычный текст formData может использовать только тип String , 1 означает «да», 0 представляет «нет», | String | 0 | Да | 1 0 |
содержание | Файл , локальный файл можно отправлять только по одному, несколько файлов вызываются вручную несколько раз. | Binary | - | Н | - |
curl --location --request POST ' http://localhost:3001/webhook/msg?token=[YOUR_PERSONAL_TOKEN] '
--form ' to=testGroup '
--form content=@ " $HOME /demo.jpg "
--form ' isRoom=1 '
response
возвращаемого значения {
"success" : true ,
"message" : " Message sent successfully "
}
payload
POST
multipart/form-data
данные формы | иллюстрировать | тип данных | Необязательное значение | Пример |
---|---|---|---|---|
тип | Тип функции
Другие типы
Тип системы
| String | text file urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
содержание | Перенесенное содержимое, текст или переданные файлы используют это поле совместно. См. пример сопоставления структуры. | String Binary | Пример | |
источник | Данные отправителя, связанные с сообщением, строка JSON | String | Пример | |
isMentioned | Это сообщение @mymessage #38. | String | 1 0 | - |
isMsgFromSelf | Это сообщение от вас №159? | String | 1 0 | - |
Обработка formData на стороне сервера обычно требует соответствующих обработчиков. Предполагая, что вы выполнили этот шаг, вы получите следующий запрос.
{
"type" : " text " ,
"content" : "你好" ,
"source" : " { " room " : "" , " to " :{ " _events " :{}, " _eventsCount " :0, " id " : " @f387910fa45 " , " payload " :{ " alias " : "" , " avatar " : " /cgi-bin/mmwebwx-bin/webwxgeticon?seq=1302335654&username=@f38bfd1e0567910fa45&skey=@crypaafc30 " , " friend " :false, " gender " :1, " id " : " @f38bfd1e10fa45 " , " name " : " ch. " , " phone " :[], " star " :false, " type " :1}}, " from " :{ " _events " :{}, " _eventsCount " :0, " id " : " @6b5111dcc269b6901fbb58 " , " payload " :{ " address " : "" , " alias " : "" , " avatar " : " /cgi-bin/mmwebwx-bin/webwxgeticon?seq=123234564&username=@6b5dbb58&skey=@crypt_ec356afc30 " , " city " : " Mars " , " friend " :false, " gender " :1, " id " : " @6b5dbd3facb58 " , " name " : " Daniel " , " phone " :[], " province " : " Earth " , " signature " : "" , " star " :false, " weixin " : "" , " type " :1}}} " ,
"isMentioned" : " 0 " ,
"isMsgFromSelf" : " 0 " ,
"isSystemEvent" : " 0 " // 考虑废弃,请使用type类型判断系统消息
}
Пример API Curl получения сообщения (непосредственно импортированный в почтальон для отладки)
curl --location 'https://your.recvdapi.com'
--form 'type="file"'
--form 'content=@"/Users/Downloads/13482835.jpeg"'
--form 'source="{\"room\":\"\",\"to\":{\"_events\":{},\"_eventsCount\":0,\"id\":\"@f387910fa45\",\"payload\":{\"alias\":\"\",\"avatar\":\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1302335654&username=@f38bfd1e0567910fa45&skey=@crypaafc30\",\"friend\":false,\"gender\":1,\"id\":\"@f38bfd1e10fa45\",\"name\":\"ch.\",\"phone\":[],\"star\":false,\"type\":1}},\"from\":{\"_events\":{},\"_eventsCount\":0,\"id\":\"@6b5111dcc269b6901fbb58\",\"payload\":{\"address\":\"\",\"alias\":\"\",\"avatar\":\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=123234564&username=@6b5dbb58&skey=@crypt_ec356afc30\",\"city\":\"Mars\",\"friend\":false,\"gender\":1,\"id\":\"@6b5dbd3facb58\",\"name\":\"Daniel\",\"phone\":[],\"province\":\"Earth\",\"signature\":\"\",\"star\":false,\"weixin\":\"\",\"type\":1}}}"'
--form 'isMentioned="0"'
response
возвращаемого значения (необязательно)Если вы ожидаете немедленного ответа ( быстрый ответ ) после получения сообщения с использованием
RECVD_MSG_API
, верните возвращаемое значение в соответствии со следующей структурой. Если возвращаемое значение отсутствует, на сообщение не будет получен ответ.
json
параметр | иллюстрировать | тип данных | значение по умолчанию | Может ли он быть пустым? | Дополнительные параметры |
---|---|---|---|---|---|
успех | Независимо от того, успешен запрос или нет, возвращается значение false или оно не содержит этого поля, и ответ не будет обработан. Некоторые специальные сообщения также контролируются с помощью этого поля, например, добавление приглашений в друзья. Если возвращается true , запрос на добавление в друзья будет выполнен. быть обработаны. | Boolean | - | Да | true false |
данные | Если вам нужно ответить на сообщение, вам необходимо определить поле данных | Объект Object Array Object | - | Да |
response.data
параметр | иллюстрировать | тип данных | значение по умолчанию | Может ли он быть пустым? | Дополнительные параметры |
---|---|---|---|---|---|
тип | Тип сообщения . Если это поле не заполнено, по умолчанию будет передаваться текстовый тип. | String | text | Да | URL-адрес text fileUrl |
содержание | Содержимое сообщения . Если вы хотите отправить несколько URL-адресов и проанализировать их, укажите тип fileUrl. При этом заполните URL-адреса в содержимом и разделите их английскими запятыми. | String | - | Н | - |
Если вы ответите на одно сообщение
{
"success" : true ,
"data" : {
"type" : " text " ,
"content" : " hello world! "
}
}
Объединение ответов на несколько сообщений
{
"success" : true ,
"data" : [
{
"type" : " text " ,
"content" : " hello world! "
},
{
"type" : " fileUrl " ,
"content" : " https://samplelib.com/lib/preview/mp3/sample-3s.mp3 "
}
]
}
В дополнение к настройке токена при запуске Docker, в случае токена по умолчанию, токен по умолчанию будет сгенерирован по умолчанию и записан в файл
.env
.
/login
GET
200
Вернуть json, содержащий текущего пользователя
{ "success" : true , "message" : " Contact<TestUser>is already login " }
Отобразить кодовую страницу сканирования входа в WeChat
Вы можете активно опрашивать интерфейс, чтобы проверить, нормально ли работает служба.
/healthz
GET
200
Если вход в WeChat выполнен, будет возвращен простой текст healthy
, в противном случае будет возвращен unHealthy
.
Начиная с версии 2.8.0, вы можете получить доступ к статическим ресурсам, таким как аватары, через этот интерфейс. Подробности см. в поле аватара в примере структуры данных Recvd_api.
Обратите внимание, что все адреса статических ресурсов, сообщаемые в Recvd_api, по умолчанию не будут иметь токенов, и их необходимо будет объединить самостоятельно, в противном случае будет возвращена ошибка 401. Убедитесь, что вы вошли в систему WeChat и вам необходимо получить ресурсы через. состояние входа.
Адрес : /resouces
методы : GET
запрос :
/avatar/1234567890.jpg
закодированный как avatar%2F1234567890.jpg
статус : 200
404
401
пример : http://localhost:3001/resouces?media=%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxgetheadimg%3Fseq%3D83460%26username%3D%40%4086815a%26skey%3D&token=[YOUR_PERSONAL_TOKEN]
200
Успешно получить ресурсы и вернуть статические файлы ресурсов.
404
Не удалось получить ресурсы
401
не содержит токена входа { "success" : false , "message" : " Unauthorized: Access is denied due to invalid credentials. " }
401
Статус входа в WeChat истек {
"success" : false , "message" : " you must login first "
}
Спасибо всем нашим участникам!
См. CHANGELOG для обновленного контента.