? صورة عامل الميناء | ? حزمة NPM |
يساعدك خطاف الويب الآلي WeChat الصغير على إزالة العديد من العقبات التي تعترض تطويرك، وهو يعتمد على طلبات http. وهو يختلف عن خطافات WeChat لأنه يعتمد على واجهة برمجة تطبيقات الويب، وتتمثل الميزة في أنه يمكن نشره على أجهزة مثل الذراع بنيان.
حذر
يعتمد المشروع حاليًا على WeChat على الويب، والذي في حد ذاته معرض لخطر التقييد، بالإضافة إلى أنه غير متصل بالإنترنت مرة واحدة كل يومين تقريبًا، بالإضافة إلى إصلاحات الوظائف العادية، فإنه لن يقبل طلبات الميزات الجديدة. بروتوكول windows تحت WIP ومن المفترض أن يكون متاحًا لمقابلتك في المستقبل القريب!
وظيفة | بروتوكول الويب | بروتوكول ويندوز |
---|---|---|
التوفر الحالي | ✅ | |
فرع الكود | رئيسي | ويندوز |
علامة عامل الميناء | أحدث | ويندوز |
<أرسل الرسالة> | ✅مفرد/متعدد/مجموعة | ✅مفرد/متعدد/مجموعة |
إرسال النص | ✅ | ✅ |
إرسال الصور | ✅ تحليل صورة/صورة عنوان url المحلية | ✅ تحليل صورة/صورة عنوان url المحلية |
إرسال الفيديو (mp4) | ✅ تحليل الفيديو المحلي/عنوان URL للفيديو | |
إرسال المستندات | ✅ تحليل الملف المحلي/ملف URL | ✅ تحليل الملف المحلي/ملف URL |
<تلقي الرسالة> | ||
تلقي النص | ✅ | ✅ |
تلقي صوت | ✅ | |
تلقي الصور | ✅ | |
تلقي الفيديو | ✅ | |
تلقي الملفات | ✅ | |
احصل على رابط تغريدة الحساب العام | ✅ | |
تلقي إشعارات النظام | ✅ إشعار عبر الإنترنت / إشعار غير متصل / إشعار غير طبيعي | |
اكتساب الصورة الرمزية | ✅ | |
الرد السريع | ✅ | ✅ |
<إدارة المجموعة> | ||
<إدارة الأصدقاء> | ||
تلقي طلب الصداقة | ✅ | |
الطلب عبر صديق | ✅ | |
الحصول على قائمة الاتصال | ||
<وظائف أخرى> | ||
تسجيل الدخول التلقائي دون قطع الاتصال | ✅ | |
مصادقة API | ✅ | ✅ |
n8n الوصول السلس | ✅ | |
دعم نشر عامل الإرساء | ✅arm64/amd64 | ✅ أيه إم دي64 |
تصدير ملف السجل | ✅ | ✅ |
لم يتم تنفيذ الوظائف المذكورة أعلاه بعد، وهي مقيدة بقيود بروتوكول WeChat، حيث تدعم البروتوكولات المختلفة وظائف مختلفة، على سبيل المثال:
npx wechatbot-webhook
ما لم يتم قطع الاتصال، سيتم تذكر آخر تسجيل دخول بشكل افتراضي لتغيير حسابك، يرجى تشغيل الأمر التالي
npx wechatbot-webhook -r
إذا واجهت خطأ في التثبيت، فيرجى التأكد من إصدار العقدة لديك >= 18.14.1 #227
انسخ واجهة برمجة تطبيقات رسالة الدفع من سطر الأوامر، على سبيل المثال http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_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
ابحث عن عنوان تسجيل الدخول لرمز الاستجابة السريعة، وجزء عنوان url الموجود أسفل الصورة، وقم بالوصول إليه باستخدام المتصفح، ثم امسح الرمز ضوئيًا لتسجيل الدخول إلى wx
https://localhost:3001/login?token=[YOUR_PERSONAL_TOKEN]
نصائح: تحتاج إلى إضافة معلمات باستخدام -e، وفصل الأسطر المتعددة باستخدام ، على سبيل المثال -e RECVD_MSG_API="https://example.com/your/url"
وظيفة | عامل | ملاحظة |
---|---|---|
مستوى السجل | LOG_LEVEL=معلومات | مستوى السجل، الافتراضي هو المعلومات، ويؤثر فقط على مخرجات السجل الحالية، فكر في استخدام التصحيح للحصول على مخرجات مفصلة. بغض النظر عن كيفية تغير هذه القيمة، يقوم ملف السجل دائمًا بتسجيل سجلات مستوى التصحيح. |
تلقي واجهة برمجة تطبيقات الرسالة | RECVD_MSG_API=https://example.com/your/url | إذا كنت تريد التعامل مع منطق تلقي الرسائل بنفسك، مثل الارتباط بناءً على الرسائل، فاملأ عنوان URL الخاص بمنطق المعالجة الخاص بك |
تلقي واجهة برمجة تطبيقات الرسائل لقبول الرسائل المرسلة بنفسك | ACCEPT_RECVD_MSG_MYSELF=خطأ | RECVD_MSG_API ما إذا كان سيتم تلقي الرسائل من نفسه (تم التعيين على "صحيح"، أي أنه تم الاستلام، والخطأ الافتراضي) |
رمز واجهة برمجة تطبيقات تسجيل الدخول المخصص | LOGIN_API_TOKEN=abcdefg123 | يمكنك أيضًا تخصيص رمز تسجيل الدخول الخاص بك إذا لم تقم بتكوينه، فسيتم إنشاء رمز مميز بشكل افتراضي. |
تعطيل تسجيل الدخول التلقائي | DISABLE_AUTO_LOGIN=صحيح | لإلغاء الحسابات غير التابعة لـ WeChat، يمكنك الاعتماد على الجلسة التي تم تسجيل الدخول إليها حاليًا لتجنب تسجيل الدخول . إذا كنت تريد مسح رمز QR ضوئيًا لتسجيل الدخول في كل مرة، فأضف هذا التكوين. |
تضيف واجهة الإصدار v2 وظيفة إرسال جماعية بالنسبة لواجهة الإصدار v1، يرجى الانتقال إلى واجهة برمجة التطبيقات القديمة.
POST
application/json
payload
أرسل نصًا أو ملفات إلى روابط خارجية، وسيتم تحليل الروابط الخارجية إلى صور أو ملفات.
المعلمة | يوضح | نوع البيانات | القيمة الافتراضية | هل يمكن أن تكون فارغة | المعلمات الاختيارية |
---|---|---|---|---|---|
ل | بالنسبة لمستقبل الرسالة ، سيتم إرسال String الواردة إلى اللقب بشكل افتراضي (وينطبق الشيء نفسه على اسم المجموعة) ويمكن إرسال بنية Object الوارد إلى الشخص الذي قام بتدوين ملاحظة، على سبيل المثال: {alias: '备注名'} . اسم المجموعة لا يدعم اسم الملاحظة. | Object String | - | ن | - |
com.isRoom | سواء كنت تريد إرسال رسالة إلى مجموعة ، تحدد هذه المعلمة ما إذا كنت تبحث عن مجموعة أو شخص عند البحث عن شخص ما، لأن اللقب هو في الواقع نفس اسم المجموعة من حيث المعالجة الفنية. | Boolean | false | ي | true false |
بيانات | بنية نص الرسالة، راجع payload.data أدناه | Array Object | false | ن | true false |
payload.data
المعلمة | يوضح | نوع البيانات | القيمة الافتراضية | هل يمكن أن تكون فارغة | المعلمات الاختيارية |
---|---|---|---|---|---|
يكتب | نوع الرسالة ، اترك الحقل فارغًا وقم بتحليله إلى نص عادي | text String | - | ي | fileUrl text |
محتوى | محتوى الرسالة ، إذا كنت تريد إرسال عناوين 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= "{الاسم المستعار: "小号"}" '، اسم المجموعة لا يدعم أسماء التعليقات | String | - | ن | - |
com.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
formData | يوضح | نوع البيانات | قيمة اختيارية | مثال |
---|---|---|---|---|
يكتب | نوع الوظيفة
أنواع أخرى
نوع النظام
| String | file text urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
محتوى | يشارك المحتوى أو النص أو الملفات المنقولة في هذا الحقل، يرجى الاطلاع على المثال الخاص بتعيين الهيكل. | String Binary | مثال | |
مصدر | بيانات المرسل ذات الصلة بالرسالة، سلسلة JSON | String | مثال | |
مذكور | الرسالة هي @mymessage #38 | String | 1 0 | - |
isMsgFromSelf | هل هي رسالة من نفسك رقم 159 | String | 1 0 | - |
تتطلب معالجة بيانات النموذج بشكل عام معالجات مقابلة، بافتراض أنك أكملت هذه الخطوة، فسوف تحصل على الطلب التالي
{
"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 --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
المعلمة | يوضح | نوع البيانات | القيمة الافتراضية | هل يمكن أن تكون فارغة | المعلمات الاختيارية |
---|---|---|---|---|---|
نجاح | سواء كان الطلب ناجحًا أم لا، فسيتم إرجاع خطأ أو لا يحتوي على هذا الحقل، ولن تتم معالجة الرد أيضًا من خلال هذا الحقل، مثل إضافة دعوات الأصدقاء، إذا تم true طلب الصداقة تتم معالجتها. | Boolean | - | ي | true false |
بيانات | إذا كنت بحاجة إلى الرد على رسالة، فأنت بحاجة إلى تحديد حقل البيانات | Object Array Object | - | ي |
response.data
بنية البياناتالمعلمة | يوضح | نوع البيانات | القيمة الافتراضية | هل يمكن أن تكون فارغة | المعلمات الاختيارية |
---|---|---|---|---|---|
يكتب | نوع الرسالة إذا لم يتم ملء هذا الحقل، فسيتم إرساله بشكل افتراضي إلى نوع النص. | String | text | ي | fileUrl text |
محتوى | محتوى الرسالة ، إذا كنت تريد إرسال عناوين 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 "
}
]
}
بالإضافة إلى تكوين الرمز المميز عند بدء تشغيل عامل الإرساء، في حالة الرمز المميز الافتراضي، سيتم إنشاء رمز مميز افتراضيًا وكتابته في ملف
.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
الحالة 401
200
404
مثال : 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 "
}
شكرا لجميع المساهمين لدينا!
راجع سجل التغيير للحصول على المحتوى المحدث