قد يعثر المسوّق على مقطع في TikTok يناقش فيه صاحبه منتجًا مطلوبًا، لكن الانتقال من هذه الإشارة إلى جهة اتصال يمكن التحقق منها أصعب: فقد يختلف اسم المؤلف على TikTok عن اسمه على IG، وقد يكون الملف الشخصي خاصًا أو لا توجد صلة مؤكدة بينه وبين الشخص. والنتيجة العملية ليست قائمة آلية بـ«عملاء محتملين جاهزين»، بل جدول للتحقق يضم المقطع الأصلي، ومؤلفه على TikTok، واسم مستخدم IG المفترض، واستجابة واجهة API، وحالة المتابعة للمراجعة.
فيما يلي سير عمل بسيط بلغة Python لهذه المهمة. يبحث عن مقاطع عامة باستخدام عبارة مفتاحية، ويستخرج حقول المؤلف المتاحة، ويتحقق من ملفات IG فقط إذا كان لديك بالفعل اسم مستخدم مبرر للتحقق منه. يمكن لواجهة API جلب بيانات الملف الشخصي باستخدام اسم المستخدم، لكنها لا تثبت تلقائيًا أن الحسابين يعودان إلى الشخص نفسه.
ما النتيجة التي يجدر أتمتتها
لنفترض أن فريقًا يبيع معدات إعداد القهوة المنزلية ويريد العثور على صناع محتوى ينشرون مقاطع عامة عن تحضير المشروبات. يفيد البحث اليدوي في التعرف الأولي على المحتوى، لكن تكراره يجعل من الصعب الاحتفاظ بسجل يوضح أي مقطع قاد إلى جهة الاتصال، ومن أين أُخذ اسم الملف الشخصي، وما الذي جرى التحقق منه تحديدًا.

يقسم مسار العمل المهمة إلى ثلاث خطوات: البحث عن مقاطع على TikTok، وحفظ البيانات المرصودة، والتحقق من ملف IG المفترض. ويتيح ذلك للمحلل فتح ملف CSV واحد ورؤية مصدر كل مرشح. ينبغي ملء حقول IG فقط بعد العثور على اسم المستخدم في وصف عام، أو رابط المؤلف، أو التحقق منه يدويًا استنادًا إلى مواد أخرى متاحة.
يفيد هذا الأسلوب وكالةً أو فريق أبحاث أو مسوّقًا داخليًا يحتاج إلى قائمة صغيرة قابلة لإعادة الإنتاج من أجل التأهيل اليدوي. فهو يحفظ سياق العثور على الحساب ولا يحوّل تشابه الأسماء إلى تأكيد على تطابق الهوية.
الحقول التي يمكن الحصول عليها
يقبل المسار الموثق في TikTok، /searchVideo، المعلمة الإلزامية keyword؛ كما تتوفر المعلمات count وdate_posted وsort_by وregion وcursor. وتشمل الاستجابات التي رُصدت معرّف المقطع ووصفه وتاريخ نشره ورابطه وبيانات مؤلفه ومقاييس التفاعل العامة. وقد تختلف الحقول الفعلية، لذا يستخدم الكود أدناه قراءة آمنة تُرجع قيمًا فارغة عند غيابها.
يستخدم هذا المسار في IG نقطة النهاية الموثقة بطريقة GET، وهي /v1/user/by/username، مع المعلمة username. وقد تتضمن الاستجابة اسم المستخدم والاسم المعروض وحالتي الخصوصية والتحقق، وعدد المنشورات والمتابعين والحسابات التي يتابعها المستخدم، إضافةً إلى النبذة التعريفية. هذه معلومات للاطلاع واتخاذ قرار لاحق من المختص، وليست تقييمًا للمؤلف.
تشرح وثائق TikTok API الرسمية معلمات البحث، بينما تشرح وثائق IG API طرق IG ومعلماتها. كما تحدد تعريفات واجهات jsonscraper المضمنة مسارات الوصول وأسماء المعلمات وأشكال الاستجابات التي رُصدت؛ وتاريخ الفحوص المذكورة هو 25 أكتوبر 2026.
إعداد المفاتيح وقائمة المرشحين
احفظ مفاتيح API في متغيرات البيئة: JSONSCRAPER_TIKTOK_LICENSE_KEY وJSONSCRAPER_INSTAGRAM_LICENSE_KEY. لا تضعها في الشيفرة المصدرية أو ملفات CSV أو سجلات المهام. لتثبيت مكتبة الطلبات، استخدم python -m pip install requests. المثال التالي مخصص لـ Python 3.8 والإصدارات الأحدث.
import csv
import os
import sys
from urllib.parse import urlencode
import requests
TIKTOK_KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
INSTAGRAM_KEY = os.environ.get("JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
if not TIKTOK_KEY or not INSTAGRAM_KEY:
sys.exit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY and JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
def get_json(base_url, path, params):
response = requests.get(
f"{base_url}{path}",
params=params,
timeout=30,
)
response.raise_for_status()
return response.json()
def extract_videos(payload):
"""Handle both observed TikTok search result locations."""
if payload.get("status") != "ok":
raise RuntimeError(f"TikTok API status: {payload.get('status')}")
tiktok = payload.get("tiktok") or {}
videos = list(tiktok.get("aweme_list") or [])
for item in tiktok.get("search_item_list") or []:
video = item.get("aweme_info")
if video:
videos.append(video)
unique = {}
for video in videos:
video_id = video.get("aweme_id")
if video_id:
unique[video_id] = video
return list(unique.values())
keyword = "قهوة منزلية"
tiktok_payload = get_json(
"https://tiktok.evelode.com",
"/searchVideo",
{
"license_key": TIKTOK_KEY,
"keyword": keyword,
"count": 20,
"date_posted": "this-month",
"sort_by": "relevance",
},
)
rows = []
for video in extract_videos(tiktok_payload):
author = video.get("author") or {}
stats = video.get("statistics") or {}
rows.append({
"tiktok_video_id": video.get("aweme_id", ""),
"tiktok_url": video.get("share_url", ""),
"video_description": video.get("desc", ""),
"created_at": video.get("create_time", ""),
"tiktok_username": author.get("unique_id", ""),
"tiktok_author_name": author.get("nickname", ""),
"tiktok_followers": author.get("follower_count", ""),
"views": stats.get("play_count", ""),
"likes": stats.get("digg_count", ""),
"instagram_username": "",
"instagram_status": "not checked",
"instagram_followers": "",
"instagram_is_private": "",
"manual_match_review": "required",
})
# املأ هذا القاموس بأسماء المستخدمين التي عُثر عليها بشكل منفصل فقط
# وأُضيفت بعد التحقق اليدوي من المصدر.
verified_instagram_usernames = {
# "tiktok_video_id": "instagram_username"
}
for row in rows:
username = verified_instagram_usernames.get(row["tiktok_video_id"])
if not username:
continue
ig_payload = get_json(
"https://ig.jsonscraper.com",
"/v1/user/by/username",
{
"license_key": INSTAGRAM_KEY,
"username": username,
},
)
if ig_payload.get("status") != "ok":
row["instagram_status"] = "api status: " + str(ig_payload.get("status"))
continue
profile = ig_payload.get("ig") or {}
row["instagram_username"] = profile.get("username", username)
row["instagram_status"] = "profile returned"
row["instagram_followers"] = profile.get("follower_count", "")
row["instagram_is_private"] = profile.get("is_private", "")
row["manual_match_review"] = "check relationship manually"
if rows:
with open("social_lead_checks.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
else:
print("No video rows returned for this query.")
لماذا يتعامل المعالج مع بنيتين للاستجابة
تظهر نتائج مقاطع بحث TikTok في موضعين: tiktok.aweme_list وtiktok.search_item_list[].aweme_info. وفي الاستجابة التي رُصدت، قد تكون القائمة الأولى فارغة، بينما توجد العناصر في الثانية. لذلك يجمع المثال المصدرين ويزيل التكرارات استنادًا إلى aweme_id. ويتحقق أولًا من status الخارجي، ثم يقرأ كائن tiktok.

لا يحفظ الكود إلا الحقول الموجودة فعليًا في الاستجابة. وتعني القيمة الفارغة أن الحقل لم يكن موجودًا في الكائن المستلم؛ ولا ينبغي تفسيرها على أنها مؤشر يساوي صفرًا. ومن المفيد حفظ روابط المقاطع وأوصافها إلى جانب المقاييس، وإلا فقد الجدول سياقه الأصلي عند مراجعته لاحقًا.
أضف ترقيم الصفحات عند الحاجة فقط
يطلب المثال صفحة واحدة ويعالج العناصر التي أعادتها فقط. وإذا لزم مواصلة البحث، فتتيح الوثائق استخدام cursor للبحث عن المقاطع؛ وتؤخذ قيمته من الاستجابة السابقة. احتفظ بقيمة المؤشر كما هي، ومررها دون إجراء حسابات عليها. أوقف الحلقة عندما تشير الاستجابة إلى عدم وجود متابعة، أو عند بلوغ الحد الذي حدده الفريق. يوسع ترقيم الصفحات مجموعة النتائج المعادة، لكنه لا يبرر وصفها بأنها تغطية شاملة لكل المنشورات في الموضوع.
قبل إضافة التصدير الآلي، تحقق من الاستجابة الفعلية باستخدام مفتاحك واختر عددًا معتدلًا من الصفحات. احتفظ بملف JSON الأصلي إلى جانب السجل الموحّد أو في ملف منفصل بحسب تاريخ التشغيل؛ فهذا يتيح معرفة ما إذا كان أحد حقول الاستجابة قد تغير، وإعادة معالجة البيانات عند تغير المخطط.
استخدام ملف CSV في التأهيل
يمكن تصفية الصفوف في الجدول بحسب وجود رابط المقطع أو وصفه أو بيانات مؤلفه أو ملف IG المكتمل. ومن المفيد أن تتضمن قائمة المراجعة الأولى حالات بسيطة مثل: «عُثر على مقطع»، و«عُثر على اسم مستخدم IG»، و«أُعيد الملف الشخصي»، و«تحقق شخص من صلة الحسابين»، و«استُبعد». تصف الحالات سير التحقق، لا جودة المؤلف أو نواياه.
إذا كانت المهمة تتطلب تقريرًا قابلًا للتكرار، فشغّل النص البرمجي وفق جدول زمني وأضف عمودًا مستقلًا لتاريخ جلب البيانات. عندئذ ستوضح مقارنة اللقطات ما الذي تغير تحديدًا بين مرات التشغيل في الحقول المتاحة، مثل عدد متابعي الملف الشخصي. وينبغي حفظ مؤشرات TikTok وIG بشكل منفصل مع تحديد المنصة ووقت الرصد، إذ تمثل سياقين مختلفين واستجابتين مختلفتين لواجهتي API.
في مسارات العمل الأكبر، استبدل ملف CSV بقاعدة بيانات يكون مفتاحها الأساسي مزيج المنصة ومعرّف المقطع. واحفظ نص الاستعلام الأصلي ووقت الجمع والاستجابة الخام. ومن الأفضل إرسال إشعار إلى Slack أو نقل السجل إلى CRM بعد تأكيد شخص لصلة الملفات الشخصية، لا فور تطابق الاسم.
حدود التفسير والتشغيل الآمن
يعيد البحث بعبارة مفتاحية نتائج API التي عُثر عليها، لا قائمة كاملة بالمنشورات. كما أن أعداد المشاهدات والإعجابات والمتابعين تمثل لقطة للاستجابة وقت الطلب. وهي مناسبة لترتيب قائمة العمل ومراجعتها لاحقًا، لكنها لا تثبت وحدها وجود نية تجارية أو جمهور محدد أو موافقة على التواصل.
تحقق من صلة الملفات الشخصية بالاستناد إلى مؤشرات عامة صريحة، وسجّل من أجرى التحقق ومتى. وإذا أُخذ اسم مستخدم IG من جدول خارجي دون مصدر يمكن تأكيده، فاترك الحالة «تتطلب التحقق». ينبغي عرض الملف الخاص أو البيانات غير المتاحة كنتيجة منفصلة للتحقق، دون محاولة ملء الفراغ بالتخمين.
استخدم مفاتيح API في مخزن أسرار بيئة العمل، وقيّد الوصول إلى الملفات المُصدّرة، وحدد مدة احتفاظ تتناسب مع غرض البحث. ولا تنقل إلى CRM إلا الحقول اللازمة للعمل اليدوي اللاحق، مع الالتزام بقواعد المنصات السارية ومتطلبات معالجة البيانات.
النتيجة النهائية
بعد التشغيل، سيظهر ملف CSV يضم المقاطع التي عُثر عليها ومؤلفيها والمقاييس المتاحة، إلى جانب حقول مستقلة للتحقق من IG. يمكن تشغيل النص البرمجي يدويًا أو وفق جدول زمني في CI أو عبر عقدة طلب HTTP في منصة أتمتة. والمبدأ العملي الأساسي هو أتمتة جمع البيانات وتنظيمها، مع إبقاء تحديد الصلة بين الحسابات خطوةً بشرية قابلة للتحقق.
للتحقق من مسارات الوصول والمعلمات المتاحة، ابدأ بـTikTok Scraper API وIG Scraper API. تتوفر أمثلة للطلبات وروابط إلى الوثائق في صفحات المنتجات؛ ابدأ بطلب صغير قبل دمج الجمع في سير عمل دائم.