لمعرفة ما إذا كان فيديو معيّن على TikTok يكتسب تفاعلاً، قارن مقاييسه العامة بلقطة سابقة للفيديو نفسه. يُظهر البحث لمرة واحدة عدد المشاهدات والتفاعلات المتراكمة بالفعل؛ أما جمع بيانات الفيديوهات نفسها مرة أخرى فيتيح رؤية التغيير بين تشغيلين. فيما يلي مسار عمل أساسي قابل للتنفيذ بلغة Python: إرسال طلب بحث، وحفظ المقاييس في ملف CSV، وحساب الفروق.
ما الذي يقيسه هذا الرصد تحديداً؟
يناسب هذا البرنامج مسوّقاً أو محللاً أو مطوّراً يحتاج إلى قائمة بالفيديوهات التي يعثر عليها البحث عن موضوع ما، وسجلّاً قابلاً للتحقق من عمليات الرصد. على سبيل المثال، قد يتابع فريق بانتظام مقاطع فيديو عن إطلاق منتج أو عن استعلام محدد للجمهور، ويريد معرفة الفيديوهات التي حققت مشاهدات أو إعجابات أو تعليقات أو مشاركات أكثر منذ الفحص السابق.

وحدة المقارنة الأساسية هي الفيديو المحدد بواسطة aweme_id. يُحفظ لكل سجل وقت الجمع والمعرّف والوصف والرابط واسم المؤلف والعدادات المتاحة. ثم تُطابق لقطتا البيانات باستخدام المعرّف. وبهذا لا تختلط الزيادة في مشاهدات فيديو واحد بالمشاهدات المتراكمة لفيديو آخر.
تصف النتيجة الفيديوهات التي أعادها استعلام بحث محدد عند تشغيل معين فقط. قد تتغير نتائج البحث، وقد تغيب بعض حقول الإحصاءات. لذلك من المفيد الاحتفاظ بلقطات البيانات نفسها ووقت جمعها، والتعامل مع التقرير باعتباره رصداً للفيديوهات التي عُثر عليها، لا دليلاً شاملاً على جميع المنشورات المتعلقة بالموضوع.
كيف يعمل الجمع عبر واجهة API؟
تصف وثائق TikTok Scraper API مسار GET باسم /searchVideo. يتطلب البحث سلسلة نصية في keyword؛ ومن المعلمات الإضافية count وregion وsort_by وdate_posted. يُمرر مفتاح API في license_key. ويحدد الدليل نقطة الأساس https://tiktok.evelode.com.
يتضمن الرد حالة خارجية وكائناً باسم tiktok. وقد تظهر فيديوهات نتائج البحث في tiktok.aweme_list أو ضمن tiktok.search_item_list[].aweme_info. يدعم المعالج أدناه كلا الشكلين. وتُستخرج المقاييس من statistics، بما فيها play_count وdigg_count وcomment_count وshare_count؛ أما القيم المفقودة فتُحفظ فارغة بدلاً من استبدالها بصفر.
يسرد دليل المسارات cursor للتنقل عبر نتائج البحث، ويحدد القيم المسموح بها في date_posted وsort_by. ولإجراء رصد بسيط قابل للتكرار، يكفي أولاً جلب صفحة واحدة من النتائج وتسجيل الرد، ثم إضافة ترقيم الصفحات عند الحاجة فقط. وإذا لزم الأمر، مرر المؤشر المستلَم كما هو، من دون تحويل.
مثال عملي بلغة Python
ثبّت مكتبة الطلبات بالأمر python -m pip install requests، وضع المفتاح في متغير البيئة JSONSCRAPER_TIKTOK_LICENSE_KEY. يستقبل البرنامج عبارة البحث وسيطاً، ويضيف لقطات النتائج إلى ملف CSV واحد. ويتوافق الكود مع Python 3.8 والإصدارات الأحدث.
import csv
import os
import sys
from datetime import datetime, timezone
from pathlib import Path
import requests
BASE_URL = "https://tiktok.evelode.com/searchVideo"
CSV_PATH = Path("tiktok_video_snapshots.csv")
FIELDS = [
"collected_at", "aweme_id", "author", "description", "share_url",
"play_count", "digg_count", "comment_count", "share_count",
]
def extract_items(payload):
"""Support the observed search response layouts."""
data = payload.get("tiktok") or {}
items = data.get("aweme_list") or []
if items:
return items
found = []
for result in data.get("search_item_list") or []:
info = result.get("aweme_info")
if info:
found.append(info)
return found
def main():
key = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
if not key:
raise SystemExit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY first")
if len(sys.argv) < 2:
raise SystemExit('Usage: python collect.py "search phrase"')
params = {
"license_key": key,
"keyword": sys.argv[1],
"count": 20,
"region": "US",
"sort_by": "relevance",
"date_posted": "this-week",
}
response = requests.get(BASE_URL, params=params, timeout=30)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok":
raise RuntimeError("API returned a non-ok outer status")
data = payload.get("tiktok") or {}
items = extract_items(payload)
collected_at = datetime.now(timezone.utc).isoformat()
rows = []
for item in items:
stats = item.get("statistics") or {}
author = item.get("author") or {}
rows.append({
"collected_at": collected_at,
"aweme_id": item.get("aweme_id"),
"author": author.get("unique_id") or author.get("nickname"),
"description": item.get("desc"),
"share_url": item.get("share_url"),
"play_count": stats.get("play_count"),
"digg_count": stats.get("digg_count"),
"comment_count": stats.get("comment_count"),
"share_count": stats.get("share_count"),
})
write_header = not CSV_PATH.exists()
with CSV_PATH.open("a", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=FIELDS)
if write_header:
writer.writeheader()
writer.writerows(rows)
print("Saved", len(rows), "returned videos")
print("has_more:", data.get("has_more"), "cursor:", data.get("cursor"))
if __name__ == "__main__":
main()
شغّله مثلاً بهذا الأمر: python collect.py "استعلام عن منتج". وتُدرج المكتبة السطر الذي يحتوي على المفتاح ضمن معلمات URL؛ ولا يطبع البرنامج المفتاح في الطرفية. لا تحفظ عنوان URL الكامل للطلب في سجلات متاحة للعامة، لأن المفتاح موجود فيه. استخدم مخزن أسرار في بيئة الإنتاج، وقيّد الوصول إلى ملف اللقطات.
كيف تحسب الزيادة بين عمليات التشغيل؟
يكتب البرنامج عمداً جميع الملاحظات بدلاً من استبدال القيم السابقة. ويطابق محلل صغير لاحقاً آخر لقطتين لكل فيديو، ثم يعرض الفرق في العدادات. وإذا لم تتوفر قيمة لمقياس ما في أحد السجلين، تُصنّف النتيجة على أنها غير متاحة.

import csv
from collections import defaultdict
from pathlib import Path
rows_by_video = defaultdict(list)
with Path("tiktok_video_snapshots.csv").open(encoding="utf-8", newline="") as file:
for row in csv.DictReader(file):
if row["aweme_id"]:
rows_by_video[row["aweme_id"]].append(row)
metrics = ("play_count", "digg_count", "comment_count", "share_count")
for video_id, snapshots in rows_by_video.items():
snapshots.sort(key=lambda row: row["collected_at"])
if len(snapshots) < 2:
continue
previous, latest = snapshots[-2], snapshots[-1]
changes = {}
for metric in metrics:
old, new = previous[metric], latest[metric]
changes[metric] = int(new) - int(old) if old and new else None
print(video_id, changes, latest["share_url"])
الفرق هو الفارق بين قيمتين محفوظتين، وليس معدل نمو مضموناً على فترات منتظمة. إذا اختلفت الفواصل الزمنية بين عمليات التشغيل، فأضف حساب المدة بين قيم collected_at وقارن الزيادة خلال الفترة الفعلية. قد تتغير العدادات بين عمليات الرصد؛ وتوضح الطوابع الزمنية المحفوظة متى جُمعت القيم المستخدمة تحديداً.
كيف تؤتمت التقرير وتفسّره؟
لإعداد تقرير يومي، شغّل عملية الجمع عبر مجدول مهام على خادم أو في CI، وحدد قائمة ثابتة من عبارات البحث، واحفظ ملف CSV أو حمّل صفوفه إلى قاعدة بيانات. وعند إعادة التشغيل، أزل التكرارات داخل اللقطة الواحدة باستخدام aweme_id إذا تكررت نتائج البحث. وللاحتفاظ بالسجل، خزّن ملف JSON الأصلي إلى جانب الأعمدة الموحّدة؛ فهذا يسهّل إعادة المعالجة عند تغيير مخطط التقرير.
من الملائم أن يعرض الجدول معرّف الفيديو ورابطه والمؤلف والوصف ووقت الجمع والفروق لكل مقياس على حدة. وتجيب عملية الفرز بحسب زيادة المشاهدات عن سؤال مدى الانتشار، بينما تساعد زيادة التعليقات أو المشاركات في إبراز نوع آخر من التفاعل. لا تجمع هذه المؤشرات في ترتيب موحّد من دون قاعدة واضحة؛ فلكل عدّاد دلالته الخاصة.
يمكن لمجدول المهام إرسال التقرير عبر البريد الإلكتروني أو إلى جدول أو قناة داخلية، لكن بنيتك التحتية هي التي تنفذ هذه الخطوة؛ فالمثال أعلاه يقتصر على جمع البيانات وتحليلها. ولجمع بيانات أكثر اكتمالاً، يمكنك المرور عبر صفحات النتائج مع حفظ المؤشر، وإنهاء الحلقة عندما تشير API إلى عدم وجود صفحات تالية. مؤشر البحث قيمة معتمة في الرد؛ فلا تحسبه بنفسك. وحتى المرور عبر الصفحات لا يصف إلا النتائج المعادة، ولا يضمن قائمة شاملة بكل المنشورات المطابقة.
النتيجة العملية المتوقعة هي سجلّ قابل لإعادة الإنتاج للملاحظات وجدول بالتغييرات في الفيديوهات التي عُثر عليها. ويساعد ذلك على ملاحظة المنشورات التي تغيرت عداداتها العامة بين عمليتي فحص، وإحالة روابط محددة إلى المختص لتحليل المحتوى. تتوفر تفاصيل المنتج وإمكانية الوصول إلى API على صفحة TikTok Scraper API.
ما الذي ينبغي التحقق منه قبل جدولة التشغيل؟
- تحقق من أن الحالة الخارجية للرد تساوي
okقبل معالجةtiktok. - تحقق من كلا الشكلين لعناصر نتائج البحث؛ ينبغي أن يؤدي غياب القائمة إلى عملية جمع فارغة، لا إلى خطأ.
- احتفظ بالقيم الأصلية والطوابع الزمنية. وتظل المقاييس الفارغة فارغة.
- استخدم استعلامات ومعلمات متماثلة لتسهيل مقارنة اللقطات، وسجّل أي تغييرات في هذه الإعدادات بجانب التقرير.
- راقب وتيرة التشغيل وأخطاء HTTP وحجم السجل، والتزم أيضاً بالقواعد المعمول بها للمنصة ومتطلبات معالجة البيانات.
باختصار، يكفي للحصول على نتيجة قابلة للرصد تكرار البحث نفسه، وتحديد الفيديوهات باستخدام aweme_id، ومقارنة المقاييس المحفوظة عبر الزمن. يجيب هذا النهج عن سؤال عملي محدد: أي الفيديوهات التي عُثر عليها غيّرت عداداتها العامة بين عمليتي فحص؟ كما يُبقي البيانات الأصلية متاحة للتدقيق والمعالجة اللاحقة.