? Docker-Image |. ? NPM-Paket |
Ein kleiner WeChat-Roboter-Webhook hilft Ihnen, viele Hindernisse für Ihre eigene Entwicklung zu beseitigen. Er basiert auf HTTP-Anfragen. Da er auf Web-APIs basiert, besteht der Vorteil darin, dass er auf Geräten wie Arm bereitgestellt werden kann Architektur.
Vorsicht
Das Projekt basiert derzeit auf dem Web-WeChat, das selbst das Risiko einer Einschränkung birgt. Darüber hinaus ist es etwa alle zwei Tage offline und nimmt keine neuen Funktionsanfragen an. Das Windows-Protokoll befindet sich in Bearbeitung und sollte in naher Zukunft für Sie verfügbar sein!
Funktion | Webprotokoll | Windows-Protokoll |
---|---|---|
Aktuelle Verfügbarkeit | ✅ | |
Codezweig | hauptsächlich | Fenster |
Docker-Tag | letzte | Fenster |
<Nachricht senden> | ✅Einzel/Mehrere/Gruppe | ✅Einzel/Mehrere/Gruppe |
Text senden | ✅ | ✅ |
Bilder verschicken | ✅ Lokale Bild-/URL-Bildanalyse | ✅ Lokale Bild-/URL-Bildanalyse |
Video senden (mp4) | ✅ Lokale Video-/URL-Videoanalyse | |
Dokumente versenden | ✅ Lokale Datei-/URL-Dateianalyse | ✅ Lokale Datei-/URL-Dateianalyse |
<Nachricht empfangen> | ||
SMS erhalten | ✅ | ✅ |
Stimme empfangen | ✅ | |
Bilder erhalten | ✅ | |
Video empfangen | ✅ | |
Dateien empfangen | ✅ | |
Erhalten Sie den Tweet-Link für ein öffentliches Konto | ✅ | |
Erhalten Sie Systembenachrichtigungen | ✅ Online-Benachrichtigung / Offline-Benachrichtigung / anormale Benachrichtigung | |
Avatar-Erwerb | ✅ | |
Schnelle Antwort | ✅ | ✅ |
<Gruppenverwaltung> | ||
<Freundeverwaltung> | ||
Freundschaftsanfrage erhalten | ✅ | |
Anfrage über Freund | ✅ | |
Kontaktliste abrufen | ||
<Andere Funktionen> | ||
Automatische Anmeldung ohne Verbindungsabbruch | ✅ | |
API-Authentifizierung | ✅ | ✅ |
N8N nahtloser Zugriff | ✅ | |
Unterstützt die Docker-Bereitstellung | ✅ arm64 / amd64 | ✅ amd64 |
Export der Protokolldatei | ✅ | ✅ |
Die oben genannten Funktionen wurden noch nicht implementiert. Sie unterliegen den Einschränkungen des WeChat-Protokolls. Verschiedene Protokolle unterstützen unterschiedliche Funktionen, zum Beispiel:
npx wechatbot-webhook
Sofern die Verbindung nicht getrennt wird, wird die letzte Anmeldung standardmäßig gespeichert. Um Ihr Konto zu ändern, führen Sie bitte den folgenden Befehl aus:
npx wechatbot-webhook -r
Wenn ein Installationsfehler auftritt, stellen Sie bitte sicher, dass Ihre Knotenversion >= 18.14.1 #227 ist
Kopieren Sie die Push-Nachrichten-API aus der Befehlszeile, zum Beispiel http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]
Öffnen Sie ein neues Terminal und versuchen Sie Folgendes: Ändern Sie die Feldwerte „to“ und „token“ in die gewünschten Werte.
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' { "to": "测试昵称", data: { "content": "Hello World!" }} '
Wichtig
Der Paketmanager wurde auf pnpm migriert. Bitte verwenden Sie ihn, um Abhängigkeiten zu installieren, um einige unregelmäßige temporäre Paket-Patches zu unterstützen und die Installation von Abhängigkeiten zu beschleunigen.
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
Suchen Sie die Anmeldeadresse des QR-Codes und den URL-Teil unter dem Bild, greifen Sie mit einem Browser darauf zu und scannen Sie den Code, um sich bei wx anzumelden
https://localhost:3001/login?token=[YOUR_PERSONAL_TOKEN]
Tipps: Sie müssen Parameter mit -e hinzufügen und mehrere Zeilen mit trennen, zum Beispiel -e RECVD_MSG_API="https://example.com/your/url"
Funktion | Variable | Bemerkung |
---|---|---|
Protokollebene | LOG_LEVEL=info | Protokollebene, der Standardwert ist „Info“, wirkt sich nur auf die aktuelle Protokollausgabe aus. Erwägen Sie die Verwendung von Debug für eine detaillierte Ausgabe. Unabhängig davon, wie sich dieser Wert ändert, zeichnet die Protokolldatei immer Protokolle auf Debug-Ebene auf. |
Nachrichten-API empfangen | RECVD_MSG_API=https://example.com/your/url | Wenn Sie die Logik des Nachrichtenempfangs selbst verwalten möchten, z. B. die Verknüpfung basierend auf Nachrichten, geben Sie die URL Ihrer Verarbeitungslogik ein |
Nachrichten-API empfangen, um von Ihnen selbst gesendete Nachrichten zu akzeptieren | ACCEPT_RECVD_MSG_MYSELF=false | RECVD_MSG_API Ob Nachrichten von sich selbst empfangen werden sollen (auf „true“ gesetzt, d. h. „received“, standardmäßig „false“) |
Benutzerdefiniertes Login-API-Token | LOGIN_API_TOKEN=abcdefg123 | Sie können auch Ihr eigenes Anmeldetoken anpassen. Wenn Sie es nicht konfigurieren, wird standardmäßig eines generiert. |
Deaktivieren Sie die automatische Anmeldung | DISABLE_AUTO_LOGIN=true | Um Nicht-WeChat-Konten zu entfernen, können Sie sich auf die aktuell angemeldete Sitzung verlassen, um eine Anmeldung zu vermeiden . Wenn Sie den QR-Code jedes Mal scannen möchten, um sich anzumelden, fügen Sie diese Konfiguration hinzu. |
Die v2-Versionsschnittstelle fügt eine Gruppensendefunktion hinzu. Für die v1-Versionsschnittstelle wechseln Sie bitte zur Legacy-API.
POST
application/json
payload
Senden Sie Text oder Dateien an externe Links, und die externen Links werden in Bilder oder Dateien analysiert.
Parameter | veranschaulichen | Datentyp | Standardwert | Kann es leer sein? | Optionale Parameter |
---|---|---|---|---|---|
Zu | Für den Nachrichtenempfänger wird der eingehende String standardmäßig an den Spitznamen gesendet (dasselbe gilt für den Gruppennamen. Die eingehende Object kann an die Person gesendet werden, die eine Notiz gemacht hat, zum Beispiel: {alias: '备注名'} . Der Gruppenname unterstützt den Notiznamen nicht. | String Object | - | N | - |
isRoom | Ob eine Nachricht an eine Gruppe gesendet werden soll , dieser Parameter bestimmt, ob bei der Suche nach einer Gruppe oder einer Person gesucht wird, da der Spitzname technisch gesehen mit dem Gruppennamen identisch ist. | Boolean | false | Y | true false |
Daten | Struktur des Nachrichtentextes, siehe payload.data unten | Object Array | false | N | true false |
payload.data
StrukturParameter | veranschaulichen | Datentyp | Standardwert | Kann es leer sein? | Optionale Parameter |
---|---|---|---|---|---|
Typ | Nachrichtentyp : Lassen Sie das Feld leer und analysieren Sie es in einfachen Text | String text | - | Y | text fileUrl |
Inhalt | Nachrichteninhalt : Wenn Sie mehrere URLs senden und analysieren möchten, geben Sie den Typ „fileUrl“ an. Geben Sie gleichzeitig die URLs im Inhalt ein und trennen Sie sie durch englische Kommas. | String | - | N | - |
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": { "content": "你好" }
} '
In einigen Fällen ist das direkte Senden des URL-Dateinamens möglicherweise nicht das, was wir wollen. Der Abfrageparameter
$alias
kann verwendet werden, um die URL zusammenzufügen, um den an das Ziel gesendeten Dateinamen anzugeben (Hinweis: Aliase führen keine Dateikonvertierung durch).
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
: Ob die Nachricht erfolgreich gesendet wurde oder nicht. Auch wenn ein Teil der Gruppennachricht erfolgreich gesendet wurde, wird true
message
: Die Nachricht, die angezeigt wird, wenn ein Fehler auftritttask
: Aufgabendetails sendentask.successCount
: Anzahl der erfolgreich gesendeten Nachrichtentask.totalCount
: Gesamtzahl der Nachrichtentask.failedCount
: Anzahl der zu sendenden fehlgeschlagenen Nachrichtentask.reject
: Parameter und Fehlermeldungen aufgrund fehlgeschlagener Parameterüberprüfungtask.sentFailed
: Da das Senden fehlgeschlagen ist und eine Fehlermeldung angezeigt wirdtask.notFound
: Da der Benutzer oder die Gruppe nicht gefunden wird und eine Fehlermeldung angezeigt wirdStellen Sie sicher, dass ein einzelner Nachrichtenversand konsistent ist. Wenn ein bestimmter Parameter nicht überprüft wird, werden alle Nachrichtenversandaufgaben beendet.
{
"success" : true ,
"message" : " " ,
"task" : {
"successCount" : 0 ,
"totalCount" : 0 ,
"failedCount" : 0 ,
"reject" : [],
"sentFailed" : [],
"notFound" : []
}
}
Das Lesen von Dateien unterstützt derzeit nur das einmalige Senden.
POST
multipart/form-data
payload
Parameter | veranschaulichen | Datentyp | Standardwert | Kann es leer sein? | Optionaler Wert |
---|---|---|---|---|---|
Zu | Für den Nachrichtenempfänger wird der eingehende String standardmäßig an den Spitznamen gesendet (dasselbe gilt für den Gruppennamen. Die eingehende Json-String-Struktur unterstützt das Senden an die Person, die eine Notiz gemacht hat, zum Beispiel: --form 'to=). „{alias: „小号“}“ ', der Gruppenname unterstützt keine Kommentarnamen | String | - | N | - |
isRoom | Ob Gruppennachrichten gesendet werden sollen , formData-Klartext kann nur String Typ verwenden, 1 steht für Ja, 0 steht für Nein, | String | 0 | Y | 1 0 |
Inhalt | Datei , lokale Datei kann jeweils nur einzeln gesendet werden, mehrere Dateien werden mehrmals manuell aufgerufen | 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
{
"success" : true ,
"message" : " Message sent successfully "
}
payload
POST
multipart/form-data
formData | veranschaulichen | Datentyp | Optionaler Wert | Beispiel |
---|---|---|---|---|
Typ | Funktionstyp
Andere Typen
Systemtyp
| String | text file urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
Inhalt | Die übertragenen Inhalte, Texte oder übertragenen Dateien teilen sich dieses Feld. Bitte sehen Sie sich das Beispiel für die Strukturzuordnung an. | String Binary | Beispiel | |
Quelle | Nachrichtenbezogene Absenderdaten, JSON-String | String | Beispiel | |
wird erwähnt | Die Nachricht ist @mymessage #38 | String | 1 0 | - |
isMsgFromSelf | Ist es eine Nachricht von dir #159? | String | 1 0 | - |
Für die serverseitige Verarbeitung von formData sind in der Regel entsprechende Handler erforderlich. Vorausgesetzt, Sie haben diesen Schritt abgeschlossen, erhalten Sie die folgende Anfrage
{
"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-Beispiel für den Empfang einer Nachricht (zum Debuggen direkt in Postman importiert)
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
(optional)Wenn Sie nach Erhalt einer Nachricht mit
RECVD_MSG_API
eine sofortige Antwort ( Schnellantwort ) erwarten, geben Sie den Rückgabewert gemäß der folgenden Struktur zurück. Wenn kein Rückgabewert vorhanden ist, wird die Nachricht nicht beantwortet.
json
Parameter | veranschaulichen | Datentyp | Standardwert | Kann es leer sein? | Optionale Parameter |
---|---|---|---|---|---|
Erfolg | Unabhängig davon, ob die Anfrage erfolgreich ist oder nicht, wird dieses Feld zurückgegeben und die Antwort wird nicht verarbeitet. Einige spezielle Nachrichten werden ebenfalls über dieses Feld gesteuert, z. B. das Hinzufügen von Freundschaftseinladungen. Wenn true zurückgegeben wird, wird die Freundschaftsanfrage nicht verarbeitet verarbeitet werden. | Boolean | - | Y | true false |
Daten | Wenn Sie auf eine Nachricht antworten müssen, müssen Sie das Datenfeld definieren | Object Object Array | - | Y |
response.data
StrukturParameter | veranschaulichen | Datentyp | Standardwert | Kann es leer sein? | Optionale Parameter |
---|---|---|---|---|---|
Typ | Nachrichtentyp : Wenn dieses Feld nicht ausgefüllt ist, wird standardmäßig die Textübertragungsart verwendet. | String | text | Y | text fileUrl |
Inhalt | Nachrichteninhalt : Wenn Sie mehrere URLs senden und analysieren möchten, geben Sie den Typ „fileUrl“ an. Geben Sie gleichzeitig die URLs im Inhalt ein und trennen Sie sie durch englische Kommas. | String | - | N | - |
Wenn Sie auf eine einzelne Nachricht antworten
{
"success" : true ,
"data" : {
"type" : " text " ,
"content" : " hello world! "
}
}
Kombinieren Sie Antworten auf mehrere Nachrichten
{
"success" : true ,
"data" : [
{
"type" : " text " ,
"content" : " hello world! "
},
{
"type" : " fileUrl " ,
"content" : " https://samplelib.com/lib/preview/mp3/sample-3s.mp3 "
}
]
}
Zusätzlich zur Konfiguration des Tokens beim Start von Docker wird im Fall des Standardtokens standardmäßig ein Standardtoken generiert und in die
.env
Datei geschrieben.
/login
GET
200
Gibt JSON zurück, das den aktuellen Benutzer enthält
{ "success" : true , "message" : " Contact<TestUser>is already login " }
Zeigt die WeChat-Login-Scan-Codeseite an
Sie können die Schnittstelle aktiv abfragen, um zu prüfen, ob der Dienst normal läuft.
/healthz
GET
200
Wenn WeChat angemeldet ist, wird der Klartext „ healthy
zurückgegeben, andernfalls wird unHealthy
zurückgegeben.
Ab Version 2.8.0 können Sie über diese Schnittstelle auf statische Ressourcen wie Avatare zugreifen. Weitere Informationen finden Sie im Beispiel für die Datenstruktur „recvd_api“.
Beachten Sie, dass alle an recvd_api gemeldeten statischen Ressourcenadressen standardmäßig keine Token haben und von Ihnen selbst gespleißt werden müssen. Andernfalls wird ein 401-Fehler zurückgegeben. Bitte stellen Sie sicher, dass Sie bei WeChat angemeldet sind und Ressourcen über das abrufen müssen Anmeldestatus.
Adresse : /resouces
Methoden : GET
Abfrage :
/avatar/1234567890.jpg
codiert als avatar%2F1234567890.jpg
Status : 200
404
401
Beispiel : http://localhost:3001/resouces?media=%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxgetheadimg%3Fseq%3D83460%26username%3D%40%4086815a%26skey%3D&token=[YOUR_PERSONAL_TOKEN]
200
Erhalten Sie erfolgreich Ressourcen und geben Sie statische Ressourcendateien zurück
404
Ressourcen konnten nicht abgerufen werden
401
trägt kein Login-Token { "success" : false , "message" : " Unauthorized: Access is denied due to invalid credentials. " }
401
Der WeChat-Anmeldestatus ist abgelaufen {
"success" : false , "message" : " you must login first "
}
Vielen Dank an alle unsere Mitwirkenden!
Aktualisierte Inhalte finden Sie im CHANGELOG