إرسال تفاعل (Reaction)

التفاعل مع رسالة محددة باستخدام رمز تعبيري (👍، ❤️، 😂، إلخ).

PUT
https://api.wawp.net/v2/send/reaction?access_token=YOUR_ACCESS_TOKEN&chatId=201234567890%40c.us&instance_id=123456789&messageId=false_20123456789%40c.us_3F351BFA105BA281C054&reaction=%F0%9F%91%8D

تسجيل الدخول مطلوب

سجل الدخول لاستبدال المعرفات (Instance ID) ورمز الوصول (Access Token) بمعلومات حسابك الحقيقي لاختبار ال API مباشرة.

تسجيل الدخول
اختبار /v2/send/reaction
PUT
PUT

لا توجد معاملات استعلام مطلوبة

هذه النهاية الطرفية لا تتوقع بيانات في الرابط.

توصيات

  • Use "reply_to" to maintain conversation context.

  • Handle distinct message types (text, image, video) appropriately.

  • Implement a robust retry mechanism for failed sends.

التفاعلات الصغيرة: إتقان محرك تفاعلات الرسائل

تعد التفاعلات (/v2/send/reaction) واحدة من أقوى التفاعلات الصغيرة في نظام المراسلة الحديث. فهي تتيح للمستخدمين والبوتات تأكيد المعلومات، أو التعبير عن المشاعر، أو تقديم ملاحظات دون عبء الرد النصي الكامل. في تطبيقات Wawp، ليست التفاعلات مجرد لمسة تجميلية؛ بل هي إشارات هيكلية يمكن استخدامها لتتبع التفاعل، أو بناء أنظمة تصويت تفاعلية، أو تبسيط تأكيدات البوت للمستخدمين.


🏗️ بنية دورة حياة التفاعل

على عكس الرسائل الكاملة، التفاعلات هي بيانات وصفية إضافية مرتبطة برسالة موجودة. يدير محرك تفاعلات Wawp هذا الارتباط بدقة عالية:

  1. تحديد الهدف: يستخدم المحرك messageId لتحديد موقع الرسالة المحددة على خادم واتساب. يجب أن يكون هذا هو المعرف الفريد لرسالة موجودة في الدردشة المحددة بواسطة chatId.
  2. تطبيع الرموز التعبيرية: بينما يمكنك إرسال أي رمز تعبيري، يضمن Wawp تشفير الحرف بشكل صحيح لـ WhatsApp WebSocket. إذا أرسلت سلسلة فارغة ("")، يفسر المحرك ذلك كأمر "حذف التفاعل"، مما يوجه شبكة واتساب لإزالة تفاعلك السابق من تلك الرسالة المحددة.
  3. التسليم السريع: يتم تسليم التفاعلات كحزم خفيفة الوزن وعالية الأولوية. هذا يضمن ظهور التفاعل فورًا تقريبًا على هاتف المستلم، مما يجعل الدردشة تبدو "حية" وتفاعلية.

🛡️ أفضل الممارسات الاستراتيجية للتفاعل مع المشاعر

1. استراتيجية "المجموعة القياسية"

بينما يدعم واتساب أي رمز تعبيري كتفاعل، فإن المستخدمين أكثر اعتيادًا على "إجراءات الرد السريع القياسية": 👍 (تأكيد/موافقة)، ❤️ (حب/جودة)، 😂 (ضحك)، 😮 (مفاجأة)، 😢 (تعاطف)، و 🙏 (شكر).

  • تأثير تجربة المستخدم: من خلال الالتزام بهذه المعايير، فإنك تطابق الذاكرة العضلية للمستخدم.
  • التوافق: الرموز التعبيرية النادرة أو المعقدة (مثل الوحدات العائلية متعددة الألوان) قد تظهر أحيانًا بشكل غير متسق عبر إصدارات الأندرويد أو سطح المكتب القديمة. الرموز القياسية آمنة عالميًا.

2. التأكيدات المؤتمتة

لا ينبغي للبوتات الحديثة الرد دائماً بالنصوص.

  • مثال: إذا قال المستخدم "فهمت!" أو "شكراً!"، بدلاً من رد البوت بـ "على الرحب والسعة!" (وهي رسالة أخرى يجب على المستخدم مسحها)، اجعل البوت يتفاعل بـ 👍 أو 💙.
  • القيمة: يحافظ هذا على نظافة سجل الدردشة مع الاستمرار في تزويد المستخدم بتعزيز إيجابي بأنه تم استلام مدخلاته.

3. الإزالة والتنظيف

لا تترك المشاعر القديمة باقية.

  • سير العمل: إذا تفاعل البوت الخاص بك بـ ⏳ (جاري المعالجة) أثناء عمله على مهمة طويلة، فتأكد من استدعاء نقطة النهاية مرة أخرى بسلسلة فارغة "" لإزالة الرمز بمجرد انتهاء المهمة، أو استبدله بـ ✅ (تم). هذا يمنع واجهة المستخدم من أن تصبح مزدحمة برموز حالة متضاربة.

🧩 حالات استخدام متقدمة

التصويت التفاعلي خفيف الوزن

يمكنك بناء نظام تصويت منخفض الاحتكاك عن طريق طرح سؤال وجعل المستخدمين يتفاعلون برموز تعبيرية مختلفة لخيارات مختلفة.

  • المنطق: استخدم Webhooks (message.reaction) للاستماع إلى التفاعلات الواردة من المستخدمين. يقوم نظامك الخلفي بعد ذلك بحساب الأعداد لكل نوع رمز تعبيري، مما يتيح وظيفة "التفاعلات كأصوات" دون سطر واحد من كود الواجهة الإضافي.

مراقبة المشاعر للوكلاء البشريين

عند تشغيل تدفق مؤتمت، اجعل نظامك يراقب الرموز التعبيرية التي يتفاعل بها المستخدمون. إذا كان المستخدم يتفاعل باستمرار بـ 😢 أو 😠 مع رسائل البوت، يمكن لنظامك تفسير ذلك كـ "إشارة إحباط" وتصعيد الدردشة تلقائيًا إلى وكيل بشري.


🛠️ المزالق الشائعة والحلول

  • خطأ "المعرف المفقود": إذا قدمت messageId بشكل صحيح ولكن الرسالة تم إرسالها منذ فترة طويلة (عادةً عدة أسابيع)، فقد يفشل التفاعل. التفاعلات تكون أكثر موثوقية عند تطبيقها على تاريخ حواري حديث (نشط).
  • إعادة التفاعل السريع: إرسال خمسة تفاعلات مختلفة لنفس الرسالة في ثانية واحدة يمكن اعتباره "برمجة مشبوهة". قم بتنفيذ تأخير بسيط (200 ملي ثانية على الأقل) بين تحديثات التفاعل لذات الرسالة المستهدفة.
  • مزامنة التشفير: في حالات نادرة، إذا كانت مفاتيح الأمان للجلسة غير متزامنة، قد يفشل التفاعل بينما ينجح النص العادي. عادةً ما يؤدي /v2/session/restart السريع إلى حل هذه الحالات الحدودية للمزامنة.

ملخص الإمكانيات:

  • تطبيق وإزالة تفاعلات واتساب الأصلية (الرموز التعبيرية) على أي رسالة موجودة.
  • دعم "حذف التفاعل" عبر حمولات السلسلة فارغة.
  • دعم عالي التزامن لأنظمة التصويت والتأكيد.
  • تتبع الأحداث في الوقت الفعلي من خلال Webhooks لـ message.reaction.
  • تنفيذ خفيف الوزن ومنخفض الأولوية لتقليل فوضى سجل الدردشة.

البارامترات

قم بتهيئة المعاملات المطلوبة للتفاعل مع نقطة النهاية هذه. جميع وسائط الاستعلام والبيانات مدرجة أدناه مع تفاصيلها.

محتوى الطلب

يرسل كـ JSON
string

المعرف الفريد لجلسة واتساب

مثال:
string

رمز وصول API الخاص بك

مثال:
string

معرف واتساب للمستلم (JID). يدعم الأفراد (@c.us)، المجموعات (@g.us)، والقنوات (@newsletter).

مثال:
string

معرف الرسالة التي تريد التفاعل معها.

مثال:
string

الرمز التعبيري للتفاعل. استخدم سلسلة فارغة للإزالة.

مثال:

أمثلة الكود

استخدم أمثلة الكود الجاهزة لدمج واجهة برمجة التطبيقات (API) في مشروعك بسرعة وكفاءة. اختر لغة البرمجة والمكتبة التي تفضلها.

1const baseUrl = "https://api.wawp.net";
2const endpoint = "/v2/send/reaction";
3const params = new URLSearchParams({
4 "instance_id": "123456789",
5 "access_token": "YOUR_ACCESS_TOKEN"
6}).toString();
7const body = {
8 "chatId": "201234567890@c.us",
9 "messageId": "false_20123456789@c.us_3F351BFA105BA281C054",
10 "reaction": "👍"
11};
12
13fetch(`${baseUrl}${endpoint}${params ? '?' + params : ''}`, {
14 method: "PUT",
15 headers: { "Content-Type": "application/json" },
16 body: JSON.stringify(body)
17})
18 .then(async (response) => {
19 if (response.ok) {
20 const data = await response.json();
21 console.log("Success:", data);
22 return data;
23 }
24
25 // Error Handling
26 if (response.status === 400) {
27 console.error("Error 400: طلب غير صالح - معاملات مطلوبة مفقودة");
28 }
29 if (response.status === 400) {
30 console.error("Error 400: Bad Request - Invalid Number (Egypt)");
31 }
32 if (response.status === 400) {
33 console.error("Error 400: Bad Request - Invalid Number (Saudi Arabia)");
34 }
35 if (response.status === 400) {
36 console.error("Error 400: Bad Request - Invalid Number (Unknown)");
37 }
38 if (response.status === 400) {
39 console.error("Error 400: طلب غير صالح (تنسيق XML)");
40 }
41 if (response.status === 400) {
42 console.error("Error 400: طلب غير صالح (نص عادي)");
43 }
44 if (response.status === 401) {
45 console.error("Error 401: غير مصرح - مفتاح الوصول غير صالح أو مفقود");
46 }
47 if (response.status === 401) {
48 console.error("Error 401: غير مصرح (تنسيق XML)");
49 }
50 if (response.status === 404) {
51 console.error("Error 404: غير موجود - الجلسة غير موجودة");
52 }
53 if (response.status === 404) {
54 console.error("Error 404: غير موجود (تنسيق XML)");
55 }
56 if (response.status === 429) {
57 console.error("Error 429: طلبات كثيرة جداً - تم تجاوز حد المعدل");
58 }
59 if (response.status === 500) {
60 console.error("Error 500: خطأ في الخادم الداخلي - فشل غير متوقع");
61 }
62 if (response.status === 500) {
63 console.error("Error 500: خطأ في الخادم الداخلي (HTML)");
64 }
65 if (response.status === 502) {
66 console.error("Error 502: بوابة غير صالحة - فشل الاتصال بالخادم الرئيسي");
67 }
68 if (response.status === 502) {
69 console.error("Error 502: بوابة غير صالحة (تنسيق XML)");
70 }
71
72 const errorText = await response.text();
73 console.error(`Error ${response.status}: ${errorText}`);
74 })
75 .catch((error) => console.error("Network Error:", error));
عينات تفاعلية
Ln 75, Col 1javascript

الردود المتوقعة

استكشف كافة الردود والنتائج المحتملة من الخادم. قمنا بتوثيق كل كود حالة (Status Code) مع أمثلة للبيانات لتسهيل معالجة الأخطاء والنجاح.

تم إرسال الرسالة بنجاح
النوع:
application/json
object *
string *
object *
number *
boolean *
string *
string *
number *
string *
string *
string *
boolean *
number *
boolean *
boolean *
boolean *
boolean *
boolean *
array *
array *
array *
boolean *
array *

Example

{
"_data": {
  "id": {
    "fromMe": true,
    "remote": "000000000000@c.us",
    "id": "MSG_ID_123456",
    "_serialized": "true_000000000000@c.us_MSG_ID_123456"
    },
  "viewed": false,
  "body": "BASE64_IMAGE_DATA",
  "type": "image",
  "t": 1759108866,
  "from": {
    "server": "c.us",
    "user": "111111111111",
    "_serialized": "111111111111@c.us"
    },
  "to": {
    "server": "c.us",
    "user": "000000000000",
    "_serialized": "000000000000@c.us"
    },
  "ack": 0,
  "isNewMsg": true,
  "star": false,
  "kicNotified": false,
  "caption": "Here's your requested image.",
  "deprecatedMms3Url": "https://example.com/media-url",
  "directPath": "/media/direct/path/example",
  "mimetype": "image/jpeg",
  "filehash": "FILE_HASH_PLACEHOLDER",
  "encFilehash": "ENC_FILE_HASH_PLACEHOLDER",
  "size": 192487,
  "mediaKey": "MEDIA_KEY_PLACEHOLDER",
  "mediaKeyTimestamp": 1759108865,
  "streamable": false,
  "mediaHandle": null,
  "isFromTemplate": false,
  "pollInvalidated": false,
  "isSentCagPollCreation": false,
  "latestEditMsgKey": null,
  "latestEditSenderTimestampMs": null,
  "mentionedJidList": {
    },
  "groupMentions": {
    },
  "isEventCanceled": false,
  "eventInvalidated": false,
  "isVcardOverMmsDocument": false,
  "isForwarded": false,
  "isQuestion": false,
  "questionReplyQuotedMessage": null,
  "questionResponsesCount": 0,
  "readQuestionResponsesCount": 0,
  "labels": {
    },
  "hasReaction": false,
  "disappearingModeInitiator": "chat",
  "disappearingModeTrigger": "chat_settings",
  "productHeaderImageRejected": false,
  "lastPlaybackProgress": 0,
  "isDynamicReplyButtonsMsg": false,
  "isCarouselCard": false,
  "parentMsgId": null,
  "callSilenceReason": null,
  "isVideoCall": false,
  "callDuration": null,
  "callCreator": null,
  "callParticipants": null,
  "isCallLink": null,
  "callLinkToken": null,
  "isMdHistoryMsg": false,
  "stickerSentTs": 0,
  "lastUpdateFromServerTs": 0,
  "invokedBotWid": null,
  "bizBotType": null,
  "botResponseTargetId": null,
  "botPluginType": null,
  "botPluginReferenceIndex": null,
  "botPluginSearchProvider": null,
  "botPluginSearchUrl": null,
  "botPluginSearchQuery": null,
  "botPluginMaybeParent": false,
  "botReelPluginThumbnailCdnUrl": null,
  "botMessageDisclaimerText": null,
  "botMsgBodyType": null,
  "requiresDirectConnection": false,
  "bizContentPlaceholderType": null,
  "hostedBizEncStateMismatch": false,
  "senderOrRecipientAccountTypeHosted": false,
  "placeholderCreatedWhenAccountIsHosted": false,
  "galaxyFlowDisabled": false,
  "links": {
    }
  },
"mediaKey": "MEDIA_KEY_PLACEHOLDER",
"id": {
  "fromMe": true,
  "remote": "000000000000@c.us",
  "id": "MSG_ID_123456",
  "_serialized": "true_000000000000@c.us_MSG_ID_123456"
  },
"ack": 0,
"hasMedia": true,
"body": "Here's your requested image.",
"type": "image",
"timestamp": 1759108866,
"from": "111111111111@c.us",
"to": "000000000000@c.us",
"deviceType": "android",
"isForwarded": false,
"forwardingScore": 0,
"isStatus": false,
"isStarred": false,
"fromMe": true,
"hasQuotedMsg": false,
"hasReaction": false,
"vCards": {
  },
"mentionedIds": {
  },
"groupMentions": {
  },
"isGif": false,
"links": {
  }
}
طلب غير صالح - معاملات مطلوبة مفقودة
غير مصرح - مفتاح الوصول غير صالح أو مفقود
غير موجود - الجلسة غير موجودة
طلبات كثيرة جداً - تم تجاوز حد المعدل
خطأ في الخادم الداخلي - فشل غير متوقع
بوابة غير صالحة - فشل الاتصال بالخادم الرئيسي
الموضوع السابقإيقاف الكتابة (Stop Typing)
الموضوع التاليإدارة الدردشة

Command Palette

Search for a command to run...