العثور على إدراجات الأنشطة التجارية المكررة وإخفاؤها

اعرض إدراجات الأنشطة التجارية المكررة المكتشفة لموقع وعبر الحساب، وأكّد المكرر الفعلي لإخفائه، واستبعد التصنيفات الخاطئة، وتتبّع كل حالة حتى حلها.

الإدراج المكرر هو إدخال ثانٍ للنشاط التجاري نفسه في الدليل نفسه. وهو يوزّع التقييمات وإشارات الترتيب بين الإدراجات ويربك العملاء. يجري الاكتشاف تلقائيًا. تراجع ما اكتُشف، وتؤكد الإدراجات المكررة فعلاً، وتستبعد الإدراجات المشروعة.

يحمل كل إدراج مكرر حالة توضّح مرحلته في عملية المعالجة:

الحالةالمعنىالإجراء المطلوب منك
POTENTIALاكتُشف، ولم يتخذ أحد إجراءً بشأنه.راجعه (الخطوتان 3 و4).
PROCESSINGأكّدته؛ وتجري عملية إخفائه لدى منصة النشر.انتظر. أعد قراءته لاحقًا (الخطوة 5).
FIXEDأزالته منصة النشر أو دمجته.اكتمل.
FAILEDلم تنجح عملية الإخفاء.تحقق من الرابط المنشور؛ وتواصل مع الدعم بشأنه إذا كان لا يزال متاحًا.

1. عرض الإدراجات المكررة لموقع واحد

تعيد GET /locations/{locationId}/listings/duplicates مصفوفة مباشرة من مجموعات الأدلة. تمثل كل مجموعة دليلاً يحتوي على مصفوفة listings من الإدراجات المشتبه في تكرارها، ولكل إدخال listingItemId وliveLink يمكنك فتحه لتقييم الإدخال، وstatus.

Duplicates for a location
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/duplicates \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "duplicateListingsForLocation": [      {        "id": "U2l0ZToxNTA=",        "name": "City Squares",        "url": "citysquares.com",        "listings": [          {            "id": "RHVwbGljYXRlOjIzNTk4NDUw",            "listingItemId": "TGlzdGluZ0l0ZW06MjM1OTg0NTA=",            "name": "Woodbury Train Station",            "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",            "status": "POTENTIAL"          }        ]      }    ]  }}

تعني المصفوفة الفارغة أنه لم يُكتشف شيء. احتفظ بـ listingItemId: فهو القيمة التي تقبلها كلتا نقطتي النهاية لوضع العلامات. تحوّل Node SDK المجموعات إلى مصفوفة واحدة لكل إدراج مكرر، لذا فإن d.id هناك هو القيمة التي ينبغي تمريرها.

2. تجميع الإدراجات المكررة على مستوى الحساب

توفّر GET /locations/listings/duplicates العرض على مستوى الحساب. وهي صفحة تعتمد على الإزاحة: تستقبل page وperPage، وتعيد records[] مع pageInfo.totalRecords وpageInfo.totalPages. القيمة الافتراضية لـ status هي POTENTIAL، ولـ tag هي all، لذا يعيد الاستدعاء دون معاملات إضافية كل إدراج مكرر لم تُغلق حالته ويمكن للمفتاح الاطلاع عليه. أضف siteId (معرّف plan-sites) لحصر النتائج في دليل واحد.

Account rollup
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=POTENTIAL&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "duplicateListingsRollup": {      "pageInfo": { "hasNextPage": true, "totalPages": 34, "totalRecords": 1673 },      "records": [        {          "id": "3329229",          "name": "Woodbury Train Station",          "duplicateProcessingState": "POTENTIAL",          "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",          "locationId": "73451",          "siteName": "City Squares",          "siteUrl": "citysquares.com"        }      ]    }  }}

يوضّح لك العرض المجمّع مواضع الإدراجات المكررة؛ وduplicateProcessingState هو حالة دورة الحياة نفسها المذكورة أعلاه. لاتخاذ إجراء بشأن أحدها، استخدم locationId الخاص به مع نقطة النهاية الخاصة بكل موقع في الخطوة 1، واقرأ listingItemId هناك. انتقل بين الصفحات واحدة تلو الأخرى؛ فالحلقة المتتابعة دون فواصل هي أسرع طريقة للوصول إلى 429.

3. تأكيد إدراج مكرر لإخفائه

بمجرد أن يوافق القائم بالمراجعة على أن إدخالاً ما مكرر، استدعِ POST /locations/listings/mark-as-duplicate مع قيم listingItemId ضمن input. اجمع جميع المعرّفات المؤكدة لموقع في استدعاء واحد. الحقل locationId اختياري ويقصر نطاق الطلب على ذلك الموقع.

Mark as duplicate
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="]  }}'
JSON
{  "data": {    "markAsDuplicate": {      "success": true,      "errors": null    }  }}

تعني success: true أن العناصر قُبلت ونُقلت إلى PROCESSING. عند إرجاع 200 مع success: false، أو 400، تتضمن الاستجابة مصفوفة errors تحمل إدخالاتها code وmessage؛ ويكون السبب المعتاد معرّفًا غير معروف أو غير صحيح الصياغة. تُطلق حزم SDK الاستثناء ValidationError في هذه الحالة.

4. استبعاد إدراج صُنّف خطأً على أنه مكرر

تتسم عملية الاكتشاف بالتحفّظ. فقد يبدو فرع آخر تابع للامتياز التجاري نفسه، أو ملف تجاري ثانٍ مشروع، أو موقع أُعيدت تسميته، كأنه إدراج مكرر. تقبل POST /locations/listings/mark-as-not-duplicate جسم الطلب نفسه وتزيل الإدخال من القائمتين نهائيًا. وهي أيضًا الطريقة التي تتراجع بها عن تنفيذ الخطوة 3 بالخطأ.

Mark as not duplicate
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-not-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="]  }}'

الاستجابة هي data.markAsNotDuplicate مع الحقلين success وerrors نفسيهما كما في الخطوة 3.

5. تتبّع التقدم

أعد قراءة العرض المجمّع باستخدام status=PROCESSING لمعرفة ما لا يزال قيد المعالجة لدى منصات النشر، وباستخدام status=FIXED لتأكيد ما أُزيل. لا تتيح أيّ من حزمتَي SDK عامل التصفية status حتى الآن، لذا استدعِ نقطة النهاية مباشرة باستخدام ترويسة Authorization نفسها.

Progress
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=PROCESSING&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY" curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=FIXED&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"

يتيح طلب perPage=1 وقراءة pageInfo.totalRecords الحصول على العدد لكل حالة عبر أربعة استدعاءات. يحتاج سجل FAILED الذي لا يزال liveLink الخاص به يفتح وجهته إلى مراجعة يدوية؛ أما سجل FAILED الذي لم يعد رابطه يعمل، فقد عالجته منصة النشر من تلقاء نفسها ويمكن استبعاده باستخدام الخطوة 4.

الخطوات التالية