¿Preguntas frecuentes sobre el paquete NPM?
Un pequeño webhook de robot WeChat le ayuda a eliminar muchos obstáculos para su propio desarrollo. Se basa en solicitudes http. Se diferencia de los ganchos WeChat porque se basa en una API web y la ventaja es que se puede implementar en dispositivos como arm. arquitectura.
Precaución
El proyecto se basa actualmente en la web WeChat, que a su vez corre el riesgo de estar restringido. Además, está fuera de línea aproximadamente una vez cada dos días. Además de las reparaciones de funciones normales, no aceptará solicitudes de nuevas funciones. ¡El protocolo de Windows está bajo WIP y debería estar disponible para recibirlo en un futuro próximo!
Función | protocolo web | protocolo de windows |
---|---|---|
Disponibilidad actual | ✅ | |
rama de código | principal | ventanas |
Etiqueta acoplable | el último | ventanas |
<Enviar mensaje> | ✅Único/Múltiple/Grupo | ✅Único/Múltiple/Grupo |
Enviar texto | ✅ | ✅ |
enviar fotos | ✅ Análisis de imagen local/imagen de URL | ✅ Análisis de imagen local/imagen de URL |
Enviar vídeo (mp4) | ✅ Análisis de vídeo local/URL | |
Enviar documentos | ✅ Análisis de archivos locales/archivos URL | ✅ Análisis de archivos locales/archivos URL |
<Recibir mensaje> | ||
recibir texto | ✅ | ✅ |
recibir voz | ✅ | |
recibir fotos | ✅ | |
recibir vídeo | ✅ | |
recibir archivos | ✅ | |
Recibir enlace de tweet de cuenta pública | ✅ | |
Recibir notificaciones del sistema | ✅ Notificación en línea / notificación fuera de línea / notificación anormal | |
Adquisición de avatar | ✅ | |
Respuesta rápida | ✅ | ✅ |
<Gestión de grupos> | ||
<Gestión de amigos> | ||
Recibir solicitud de amistad | ✅ | |
Solicitar vía amigo | ✅ | |
Obtener lista de contactos | ||
<Otras funciones> | ||
Inicio de sesión automático sin desconexión | ✅ | |
Autenticación API | ✅ | ✅ |
acceso perfecto n8n | ✅ | |
Admite la implementación de Docker | ✅arm64/amd64 | ✅ amd64 |
Exportación de archivos de registro | ✅ | ✅ |
Las funciones mencionadas anteriormente aún no se han implementado. Están limitadas por las restricciones del protocolo WeChat. Los diferentes protocolos admiten diferentes funciones. No todas las funciones se pueden conectar, por ejemplo:
npx wechatbot-webhook
A menos que esté desconectado, el último inicio de sesión se recordará de forma predeterminada. Para cambiar su cuenta, ejecute el siguiente comando
npx wechatbot-webhook -r
Si encuentra un error de instalación, asegúrese de que la versión de su nodo sea >= 18.14.1 #227
Copie la API de mensajes push desde la línea de comando, por ejemplo http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]
Abra una nueva terminal y pruebe el siguiente curl. Cambie los valores de los campos to y token a los valores que desee.
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' { "to": "测试昵称", data: { "content": "Hello World!" }} '
Importante
El administrador de paquetes se ha migrado a pnpm. Úselo para instalar dependencias para admitir algunos parches de paquetes temporales irregulares y acelerar la instalación de dependencias.
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
Busque la dirección de inicio de sesión del código QR, la parte de la URL debajo de la imagen, acceda a ella con un navegador, escanee el código para iniciar sesión en wx
https://localhost:3001/login?token=[TU_TOKEN_PERSONAL]
Sugerencias: debe agregar parámetros usando -e y separar varias líneas con , por ejemplo -e RECVD_MSG_API="https://example.com/your/url"
Función | variable | Observación |
---|---|---|
Nivel de registro | LOG_LEVEL=información | Nivel de registro, el valor predeterminado es información, solo afecta la salida del registro actual; considere usar la depuración para obtener una salida detallada. No importa cómo cambie este valor, el archivo de registro siempre registra registros de nivel de depuración. |
Recibir mensaje API | RECVD_MSG_API=https://ejemplo.com/tu/url | Si desea manejar la lógica de recibir mensajes usted mismo, como los enlaces basados en mensajes, complete la URL de su lógica de procesamiento. |
Recibir API de mensajes para aceptar mensajes enviados por usted mismo | ACCEPT_RECVD_MSG_MYSELF=falso | RECVD_MSG_API Si desea recibir mensajes de sí mismo (establecido en verdadero, es decir, recibido, falso predeterminado) |
Token API de inicio de sesión personalizado | LOGIN_API_TOKEN=abcdefg123 | También puede personalizar su propio token de inicio de sesión. Si no lo configura, se generará uno de forma predeterminada. |
Desactivar el inicio de sesión automático | DISABLE_AUTO_LOGIN=verdadero | Para eliminar cuentas que no sean de WeChat, puede confiar en la sesión actualmente iniciada para evitar iniciar sesión . Si desea escanear el código QR para iniciar sesión cada vez, agregue esta configuración. |
La interfaz de la versión v2 agrega una función de envío grupal. Para la interfaz de la versión v1, vaya a la API heredada.
POST
application/json
payload
Envíe texto o archivos a enlaces externos y los enlaces externos se analizarán en imágenes o archivos.
parámetro | ilustrar | tipo de datos | valor predeterminado | ¿Puede estar vacío? | Parámetros opcionales |
---|---|---|---|---|---|
a | Para el receptor del mensaje , la String entrante se enviará al apodo de forma predeterminada (lo mismo se aplica al nombre del grupo. La estructura Object entrante se puede enviar a la persona que hizo una nota, por ejemplo: {alias: '备注名'} ). {alias: '备注名'} El nombre del grupo no admite el nombre de la nota. | Object String | - | norte | - |
esHabitación | Ya sea para enviar un mensaje a un grupo , este parámetro determina si está buscando un grupo o una persona cuando busca a alguien, porque en términos de procesamiento técnico, el apodo es en realidad el mismo que el nombre del grupo. | Boolean | false | Y | true false |
datos | Estructura del cuerpo del mensaje, consulte payload.data a continuación | Array Object | false | norte | true false |
payload.data
parámetro | ilustrar | tipo de datos | valor predeterminado | ¿Puede estar vacío? | Parámetros opcionales |
---|---|---|---|---|---|
tipo | Tipo de mensaje , deje el campo en blanco y analícelo como texto sin formato | text String | - | Y | fileUrl text |
contenido | Contenido del mensaje , si desea enviar varias URL y analizarlas, especifique el tipo como fileUrl. Al mismo tiempo, complete las URL en el contenido y sepárelas con comas en inglés. | String | - | norte | - |
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": { "content": "你好" }
} '
En algunos casos, enviar directamente el nombre del archivo URL puede no ser lo que queremos. El parámetro de consulta
$alias
se puede utilizar para unir la URL y especificar el nombre del archivo enviado al destino (nota: los alias no realizan la conversión de archivos).
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
del valor de retornosuccess
: si el mensaje se envió correctamente o no, incluso si parte del mensaje grupal se envía correctamente, devolverá true
message
: el mensaje que aparece cuando ocurre un errortask
: enviar detalles de la tareatask.successCount
: número de mensajes enviados correctamentetask.totalCount
: número total de mensajestask.failedCount
: número de mensajes fallidos para enviartask.reject
: parámetros y mensajes de error debido a una verificación fallida de parámetrostask.sentFailed
: porque el envío falló y aparece un mensaje de errortask.notFound
: porque no se encuentra el usuario o grupo y aparece un mensaje de errorAsegúrese de la coherencia del envío de un solo mensaje. Si no se verifica un determinado parámetro, se finalizarán todas las tareas de envío de mensajes.
{
"success" : true ,
"message" : " " ,
"task" : {
"successCount" : 0 ,
"totalCount" : 0 ,
"failedCount" : 0 ,
"reject" : [],
"sentFailed" : [],
"notFound" : []
}
}
Actualmente, la lectura de archivos solo admite el envío único.
POST
multipart/form-data
payload
parámetro | ilustrar | tipo de datos | valor predeterminado | ¿Puede estar vacío? | Valor opcional |
---|---|---|---|---|---|
a | Para el receptor del mensaje, la String entrante se envía al apodo de forma predeterminada (lo mismo se aplica al nombre del grupo. La estructura de la cadena Json entrante admite el envío a la persona que tomó una nota, por ejemplo: --form 'to=). "{alias: "小号"}" ', el nombre del grupo no admite nombres de comentarios | String | - | norte | - |
esHabitación | Ya sea para enviar mensajes grupales , el texto sin formato de formData solo puede usar el tipo String , 1 representa sí, 0 representa no, | String | 0 | Y | 1 0 |
contenido | Archivo , el archivo local solo se puede enviar uno a la vez, varios archivos se llaman manualmente varias veces | Binary | - | norte | - |
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
del valor de retorno {
"success" : true ,
"message" : " Message sent successfully "
}
payload
POST
multipart/form-data
formularioDatos | ilustrar | tipo de datos | Valor opcional | Ejemplo |
---|---|---|---|---|
tipo | Tipo de función
Otros tipos
Tipo de sistema
| String | file text urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
contenido | El contenido transferido, el texto o los archivos transferidos comparten este campo. Consulte el ejemplo para el mapeo de estructura. | String Binary | Ejemplo | |
fuente | Datos del remitente relacionados con el mensaje, cadena JSON | String | Ejemplo | |
se menciona | El mensaje es @mymessage #38 | String | 1 0 | - |
esMsgFromSelf | ¿Es un mensaje tuyo? #159 | String | 1 0 | - |
El procesamiento de formData por parte del servidor generalmente requiere los controladores correspondientes. Suponiendo que haya completado este paso, recibirá la siguiente solicitud.
{
"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类型判断系统消息
}
Recibir ejemplo de curl de api de mensaje (importado directamente a cartero para depuración)
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
del valor de retorno (opcional)Si espera responder inmediatamente ( respuesta rápida ) después de recibir un mensaje usando
RECVD_MSG_API
, devuelva el valor de retorno de acuerdo con la siguiente estructura. Si no hay un valor de retorno, el mensaje no será respondido.
json
parámetro | ilustrar | tipo de datos | valor predeterminado | ¿Puede estar vacío? | Parámetros opcionales |
---|---|---|---|---|---|
éxito | Si la solicitud es exitosa o no, devuelve falso o no tiene este campo, y la respuesta no se procesará. Algunos mensajes especiales también se controlan a través de este campo, como agregar invitaciones de amistad. Si se devuelve true , la solicitud de amistad. ser procesado. | Boolean | - | Y | true false |
datos | Si necesita responder a un mensaje, debe definir el campo de datos | Object Object Array objetos | - | Y |
response.data
parámetro | ilustrar | tipo de datos | valor predeterminado | ¿Puede estar vacío? | Parámetros opcionales |
---|---|---|---|---|---|
tipo | Tipo de mensaje . Si este campo no está completo, se utilizará de forma predeterminada la transmisión de tipo texto. | String | text | Y | fileUrl text |
contenido | Contenido del mensaje , si desea enviar varias URL y analizarlas, especifique el tipo como fileUrl. Al mismo tiempo, complete las URL en el contenido y sepárelas con comas en inglés. | String | - | norte | - |
Si respondes a un solo mensaje
{
"success" : true ,
"data" : {
"type" : " text " ,
"content" : " hello world! "
}
}
Combina respuestas a múltiples mensajes
{
"success" : true ,
"data" : [
{
"type" : " text " ,
"content" : " hello world! "
},
{
"type" : " fileUrl " ,
"content" : " https://samplelib.com/lib/preview/mp3/sample-3s.mp3 "
}
]
}
Además de configurar el token cuando se inicia Docker, en el caso del token predeterminado, se generará un token predeterminado de forma predeterminada y se escribirá en el archivo
.env
.
/login
GET
200
Devuelve json que contiene el usuario actual
{ "success" : true , "message" : " Contact<TestUser>is already login " }
Mostrar la página del código de escaneo de inicio de sesión de WeChat
Puede sondear activamente la interfaz para comprobar si el servicio se está ejecutando normalmente.
/healthz
GET
200
Si WeChat inicia sesión, se devolverá el texto sin formato en healthy
; de lo contrario, se devolverá unHealthy
.
A partir de la versión 2.8.0, puede acceder a recursos estáticos como avatares a través de esta interfaz. Para obtener más información, consulte el campo de avatar en el ejemplo de estructura de datos recvd_api.
Tenga en cuenta que todas las direcciones de recursos estáticos informadas a recvd_api no tendrán tokens de forma predeterminada y deberán ser empalmadas por usted mismo; de lo contrario, se devolverá un error 401. Asegúrese de haber iniciado sesión en WeChat y de que necesita obtener recursos a través de. estado de inicio de sesión.
Dirección : /resouces
métodos : GET
consulta :
/avatar/1234567890.jpg
codificada como avatar%2F1234567890.jpg
estado : 200
404
401
ejemplo : http://localhost:3001/resouces?media=%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxgetheadimg%3Fseq%3D83460%26username%3D%40%4086815a%26skey%3D&token=[YOUR_PERSONAL_TOKEN]
200
Obtenga recursos con éxito y devuelva archivos de recursos estáticos
404
No se pudieron obtener recursos
401
no lleva token de inicio de sesión { "success" : false , "message" : " Unauthorized: Access is denied due to invalid credentials. " }
401
El estado de inicio de sesión de WeChat ha caducado {
"success" : false , "message" : " you must login first "
}
¡Gracias a todos nuestros colaboradores!
Consulte CHANGELOG para obtener contenido actualizado.