?Image Docker |
Un petit webhook robot WeChat vous aide à éliminer de nombreux obstacles à votre propre développement. Il est basé sur des requêtes http. Il est différent des hooks WeChat car il est basé sur une API Web, l'avantage est qu'il peut être déployé sur des appareils tels que arm. architecture.
Prudence
Le projet est actuellement basé sur le Web WeChat, qui risque lui-même d'être restreint. De plus, il est hors ligne environ une fois tous les deux jours. En plus des réparations de fonctions normales, il n'acceptera pas de nouvelles demandes de fonctionnalités. Le protocole Windows est sous WIP et devrait être disponible pour vous rencontrer prochainement !
Fonction | protocole Web | protocole Windows |
---|---|---|
Disponibilité actuelle | ✅ | |
branche de code | principal | fenêtres |
Balise Docker | dernier | fenêtres |
<Envoyer un message> | ✅Simple/Multiple/Groupe | ✅Simple/Multiple/Groupe |
Envoyer un texte | ✅ | ✅ |
Envoyer des photos | ✅ Analyse d'image locale/url | ✅ Analyse d'image locale/url |
Envoyer la vidéo (mp4) | ✅ Analyse vidéo locale/url vidéo | |
Envoyer des documents | ✅ Analyse de fichiers locaux/url | ✅ Analyse de fichiers locaux/url |
<Recevoir un message> | ||
recevoir un SMS | ✅ | ✅ |
recevoir la voix | ✅ | |
recevoir des photos | ✅ | |
recevoir une vidéo | ✅ | |
recevoir des fichiers | ✅ | |
Recevoir le lien tweet du compte public | ✅ | |
Recevoir des notifications système | ✅ Notification en ligne / notification hors ligne / notification anormale | |
Acquisition d'avatar | ✅ | |
Réponse rapide | ✅ | ✅ |
<Gestion du groupe> | ||
<Gestion des amis> | ||
Recevoir une demande d'ami | ✅ | |
Demande via un ami | ✅ | |
Obtenir la liste de contacts | ||
<Autres fonctions> | ||
Connexion automatique sans déconnexion | ✅ | |
Authentification API | ✅ | ✅ |
accès transparent n8n | ✅ | |
Prise en charge du déploiement de Docker | ✅arm64/amd64 | ✅amd64 |
Exportation du fichier journal | ✅ | ✅ |
Les fonctions mentionnées ci-dessus n'ont pas encore été implémentées. Elles sont limitées par les restrictions du protocole WeChat. Différents protocoles prennent en charge différentes fonctions. Toutes les fonctions ne peuvent pas être connectées, par exemple :
npx wechatbot-webhook
Sauf déconnexion, la dernière connexion sera mémorisée par défaut. Pour modifier votre compte, veuillez exécuter la commande suivante
npx wechatbot-webhook -r
Si vous rencontrez une erreur d'installation, assurez-vous que la version de votre nœud >= 18.14.1 #227
Copiez l'API du message push à partir de la ligne de commande, par exemple http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]
Ouvrez un nouveau terminal et essayez le curl suivant. Remplacez les valeurs des champs to et token par les valeurs souhaitées.
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' { "to": "测试昵称", data: { "content": "Hello World!" }} '
Important
Le gestionnaire de packages a été migré vers pnpm. Veuillez l'utiliser pour installer des dépendances afin de prendre en charge certains correctifs de package temporaires irréguliers et d'accélérer l'installation des dépendances.
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
Trouvez l'adresse de connexion du code QR, la partie url sous l'image, accédez-y avec un navigateur, scannez le code pour vous connecter à wx
https://localhost:3001/login?token=[YOUR_PERSONAL_TOKEN]
Conseils : Vous devez ajouter des paramètres à l'aide de -e et séparer plusieurs lignes par , par exemple -e RECVD_MSG_API="https://example.com/your/url"
Fonction | variable | Remarque |
---|---|---|
Niveau de journalisation | LOG_LEVEL=infos | Niveau de journalisation, la valeur par défaut est info, n'affecte que la sortie actuelle du journal, envisagez d'utiliser le débogage pour une sortie détaillée. Quelle que soit la façon dont cette valeur change, le fichier journal enregistre toujours les journaux de niveau débogage. |
API de réception de messages | RECVD_MSG_API=https://example.com/your/url | Si vous souhaitez gérer vous-même la logique de réception des messages, comme la création de liens basés sur des messages, remplissez l'URL de votre logique de traitement. |
API de réception de messages pour accepter les messages envoyés par vous-même | ACCEPT_RECVD_MSG_MYSELF=faux | RECVD_MSG_API S'il faut recevoir des messages de lui-même (défini sur vrai, c'est-à-dire reçu, faux par défaut) |
Jeton API de connexion personnalisé | LOGIN_API_TOKEN=abcdefg123 | Vous pouvez également personnaliser votre propre jeton de connexion. Si vous ne le configurez pas, un sera généré par défaut. |
Désactiver la connexion automatique | DISABLE_AUTO_LOGIN=vrai | Pour supprimer les comptes non WeChat, vous pouvez compter sur la session actuellement connectée pour éviter de vous connecter . Si vous souhaitez scanner le code QR pour vous connecter à chaque fois, ajoutez cette configuration. |
L'interface de la version v2 ajoute une fonction d'envoi de groupe. Pour l'interface de la version v1, veuillez passer à l'ancienne API.
POST
application/json
payload
Envoyez du texte ou des fichiers vers des liens externes, et les liens externes seront analysés en images ou en fichiers.
paramètre | illustrer | type de données | valeur par défaut | Peut-il être vide | Paramètres facultatifs |
---|---|---|---|---|---|
à | Pour le destinataire du message , le String entrant sera envoyé au pseudo par défaut (il en va de même pour le nom du groupe). La structure Object entrant peut être envoyée à la personne qui a pris une note, par exemple : {alias: '备注名'} . Le nom du groupe ne prend pas en charge le nom de la note. | Object String | - | N | - |
estRoom | Que ce soit pour envoyer un message à un groupe , ce paramètre détermine si vous recherchez un groupe ou une personne lorsque vous recherchez quelqu'un, car le pseudo est en réalité le même que le nom du groupe en termes de traitement technique. | Boolean | false | Oui | true false |
données | Structure du corps du message, voir payload.data ci-dessous | Array Object | false | N | true false |
payload.data
paramètre | illustrer | type de données | valeur par défaut | Peut-il être vide | Paramètres facultatifs |
---|---|---|---|---|---|
taper | Type de message , laissez le champ vide et analysez en texte brut | text String | - | Oui | fileUrl text |
contenu | Contenu du message , si vous souhaitez envoyer plusieurs URL et les analyser, spécifiez le type comme fileUrl. En même temps, remplissez les URL dans le contenu et séparez-les par des virgules anglaises. | String | - | N | - |
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": { "content": "你好" }
} '
Dans certains cas, l'envoi direct du nom du fichier URL peut ne pas être ce que nous souhaitons. Le paramètre de requête
$alias
peut être utilisé pour fusionner l'URL afin de spécifier le nom du fichier envoyé à la cible (remarque : les alias n'effectuent pas de conversion de fichier).
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
de la valeur de retoursuccess
: Que le message soit envoyé avec succès ou non, même si une partie du message de groupe est envoyée avec succès, il retournera true
message
: le message affiché lorsqu'une erreur se produittask
: envoyer les détails de la tâchetask.successCount
: Nombre de messages envoyés avec succèstask.totalCount
: nombre total de messagestask.failedCount
: Nombre de messages ayant échoué à envoyertask.reject
: Paramètres et invites d'erreur en raison de l'échec de la vérification des paramètrestask.sentFailed
: Parce que l'envoi a échoué et une invite d'erreurtask.notFound
: car l'utilisateur ou le groupe est introuvable et des invites d'erreurAssurer la cohérence d’un seul envoi de message. Le fait de ne pas vérifier un certain paramètre mettra fin à toutes les tâches d’envoi de messages.
{
"success" : true ,
"message" : " " ,
"task" : {
"successCount" : 0 ,
"totalCount" : 0 ,
"failedCount" : 0 ,
"reject" : [],
"sentFailed" : [],
"notFound" : []
}
}
La lecture de fichiers ne prend actuellement en charge que l'envoi unique.
POST
multipart/form-data
payload
paramètre | illustrer | type de données | valeur par défaut | Peut-il être vide | Valeur facultative |
---|---|---|---|---|---|
à | Pour le destinataire du message, la String entrante est envoyée au pseudo par défaut (il en va de même pour le nom du groupe). La structure de chaîne Json entrante prend en charge l'envoi à la personne qui a pris une note, par exemple : --form 'to=. "{alias : "小号"}" ', le nom du groupe ne prend pas en charge les noms de commentaires | String | - | N | - |
estRoom | Que ce soit pour envoyer des messages de groupe , le texte brut formData ne peut utiliser que le type String , 1 représente oui, 0 représente non, | String | 0 | Oui | 1 0 |
contenu | Fichier , le fichier local ne peut être envoyé qu'un par un, plusieurs fichiers sont appelés manuellement plusieurs fois | Binary | - | N | - |
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
de la valeur de retour {
"success" : true ,
"message" : " Message sent successfully "
}
payload
POST
multipart/form-data
formulaireDonnées | illustrer | type de données | Valeur facultative | Exemple |
---|---|---|---|---|
taper | Type de fonction
Autres types
Type de système
| String | file text urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
contenu | Le contenu transféré, le texte ou les fichiers transférés partagent ce champ. Veuillez consulter l'exemple de mappage de structure. | String Binary | Exemple | |
source | Données de l'expéditeur liées au message, chaîne JSON | String | Exemple | |
estmentionné | Le message est @monmessage #38 | String | 1 0 | - |
estMsgFromSelf | Est-ce un message de toi #159 | String | 1 0 | - |
Le traitement côté serveur de formData nécessite généralement des gestionnaires correspondants. En supposant que vous avez terminé cette étape, vous obtiendrez la requête suivante.
{
"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类型判断系统消息
}
Exemple de réception d'un message api curl (directement importé dans postman pour le débogage)
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
de la valeur de retour (facultatif)Si vous prévoyez de répondre immédiatement ( réponse rapide ) après avoir reçu un message à l'aide
RECVD_MSG_API
, veuillez renvoyer la valeur de retour selon la structure suivante. S'il n'y a pas de valeur de retour, le message ne recevra pas de réponse.
json
paramètre | illustrer | type de données | valeur par défaut | Peut-il être vide | Paramètres facultatifs |
---|---|---|---|---|---|
succès | Que la demande réussisse ou non, renvoie faux ou n'ait pas ce champ, et la réponse ne sera pas traitée. Certains messages spéciaux sont également contrôlés via ce champ, comme l'ajout d'invitations d'amis. Si true est renvoyé, la demande d'ami le sera. être traité. | Boolean | - | Oui | true false |
données | Si vous devez répondre à un message, vous devez définir le champ de données | Object Array Object | - | Oui |
response.data
paramètre | illustrer | type de données | valeur par défaut | Peut-il être vide | Paramètres facultatifs |
---|---|---|---|---|---|
taper | Type de message . Si ce champ n'est pas renseigné, la transmission sera par défaut de type texte. | String | text | Oui | fileUrl text |
contenu | Contenu du message , si vous souhaitez envoyer plusieurs URL et les analyser, spécifiez le type comme fileUrl. En même temps, remplissez les URL dans le contenu et séparez-les par des virgules anglaises. | String | - | N | - |
Si vous répondez à un seul message
{
"success" : true ,
"data" : {
"type" : " text " ,
"content" : " hello world! "
}
}
Combiner les réponses à plusieurs messages
{
"success" : true ,
"data" : [
{
"type" : " text " ,
"content" : " hello world! "
},
{
"type" : " fileUrl " ,
"content" : " https://samplelib.com/lib/preview/mp3/sample-3s.mp3 "
}
]
}
En plus de configurer le jeton au démarrage de Docker, dans le cas du jeton par défaut, un jeton par défaut sera généré par défaut et écrit dans le fichier
.env
.
/login
GET
200
Renvoie json contenant l'utilisateur actuel
{ "success" : true , "message" : " Contact<TestUser>is already login " }
Afficher la page de codes d'analyse de connexion WeChat
Vous pouvez interroger activement l'interface pour vérifier si le service fonctionne normalement.
/healthz
GET
200
Si WeChat est connecté, le texte brut healthy
sera renvoyé, sinon unHealthy
sera renvoyé.
À partir de la version 2.8.0, vous pouvez accéder à des ressources statiques telles que des avatars via cette interface. Pour plus de détails, consultez le champ avatar dans l'exemple de structure de données recvd_api.
Notez que toutes les adresses de ressources statiques signalées à recvd_api n'auront pas de jetons par défaut et devront être fusionnées par vous-même, sinon une erreur 401 sera renvoyée. Veuillez vous assurer que vous êtes connecté avec WeChat et que vous devez obtenir des ressources via le. état de connexion.
Adresse : /resouces
méthodes : GET
requête :
/avatar/1234567890.jpg
codé comme avatar%2F1234567890.jpg
statut : 200
404
401
exemple : http://localhost:3001/resouces?media=%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxgetheadimg%3Fseq%3D83460%26username%3D%40%4086815a%26skey%3D&token=[YOUR_PERSONAL_TOKEN]
200
Réussir à obtenir des ressources et renvoyer des fichiers de ressources statiques
404
Échec de l'obtention des ressources
401
ne contient pas de jeton de connexion { "success" : false , "message" : " Unauthorized: Access is denied due to invalid credentials. " }
401
Le statut de connexion WeChat a expiré {
"success" : false , "message" : " you must login first "
}
Merci à tous nos contributeurs !
Voir CHANGELOG pour le contenu mis à jour