jsonscraper
الأسواق

كيفية تقييم اتساق موضوعات منشورات صانع محتوى على TikTok

خط أنابيب Python خطوة بخطوة لجمع منشورات الحساب ومقارنة الموضوعات واستخدام الذكاء الاصطناعي بحذر

السياسة التحريرية الإبلاغ عن خطأ

قد يبدو صانع المحتوى مناسبًا لحملة ما من خلال ملفه الشخصي وعدد من مقاطعه الناجحة، لكن منشوراته الحديثة تحكي قصة أهم: هل يواصل الحديث بانتظام عن الموضوع المطلوب؟ سرعان ما تصبح المراجعة اليدوية قديمة، كما يسهل أن تقتصر معاينة واحدة على اختيار المنشورات الأكثر بروزًا. لذلك، من الأنسب للوكالة أو العلامة التجارية جمع عينة قابلة للتكرار من المقاطع العامة، وحفظ حالتها في تاريخ الفحص، وتقييم مدى ملاءمتها للموضوع وفق القواعد نفسها في كل مرة.

المقال: كيفية تقييم اتساق موضوعات منشورات صانع محتوى على TikTok
الملخص: نوضح كيف يمكن لعلامة تجارية أو وكالة تقييم مدى انتظام صانع محتوى على TikTok في نشر محتوى حول موضوع محدد: جلب المنشورات عبر API، وحفظ لقطات زمنية، وحساب مؤشرات شفافة، ثم تصنيف أوصاف المقاطع موضوعيًا.
دور الصورة: غلاف — الفكرة المحورية
القسم: 
المشهد البصري: تقرير تحليلي مطبوع يعرض بطاقات مقاطع لصانع محتوى على TikTok ممثلة بأيقونات محايدة،
© jsonscraper · رسم توضيحي مولّد بالذكاء الاصطناعي

فيما يلي عملية عملية لتقييم منشورات TikTok العامة لصانع محتوى. تستخدم العملية واجهة TikTok Scraper API من jsonscraper وPython: تسترجع المنشورات عبر مسار موثّق، وتحفظ JSON الأصلي، وتحوّل الحقول المتاحة إلى جدول، وتحسب نسبة المقاطع الملائمة لموضوع محدد. ويمكن، عند الرغبة، إرسال الأوصاف إلى مصنّف نصي في مرحلة لاحقة تخضع لرقابة مستقلة.

ابدأ بتحديد معنى «ملائم»

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

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

حدّد العينة مسبقًا أيضًا. فمثلًا، يمكنك تحليل آخر 20 منشورًا مسترجعًا في كل تشغيل أسبوعي. هذا شرط تضعه لعملية الرصد، وليس ضمانًا بأن API ستعيد هذا العدد بالضبط؛ إذ يتوقف توافر النتائج ومحتواها على استجابة الطلب المحدد. سجّل وقت الجمع وعدد العناصر المسترجعة ومعلمات الطلب، كي تقارن اللقطات من دون خلط قواعد مختلفة.

طلب منشورات الحساب

وفق وثائق jsonscraper، يقبل المسار GET /getUserFeed المعلمة الإلزامية query، وهي اسم المستخدم أو رابط الملف الشخصي. وتشمل المعلمات الاختيارية المذكورة count وregion وsort_type وwith_pinned_posts وmax_cursor. يُمرَّر مفتاح API في سلسلة الاستعلام باسم license_key؛ لذا احفظه في متغير بيئة بدلًا من وضعه في الشيفرة المصدرية. وترد تفاصيل المسارات والمعلمات في الوثائق الرسمية لـ TikTok API.

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

المثال المختصر التالي معدّ لـ Python 3.8+ ومكتبة requests. احفظ المفتاح في JSONSCRAPER_TIKTOK_LICENSE_KEY. تنفّذ الشيفرة طلبًا واحدًا، وتتحقق من استجابة HTTP والحالة الخارجية لـ API، وتحفظ JSON الأصلي، ثم تعرض صفوفًا موحّدة.

import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

API_KEY = os.environ["JSONSCRAPER_TIKTOK_LICENSE_KEY"]
PROFILE = "creator_username"

params = {
    "license_key": API_KEY,
    "query": PROFILE,
    "count": 20,
    "region": "US",
    "sort_type": 0,
    "with_pinned_posts": 0,
}

response = requests.get(
    "https://tiktok.evelode.com/getUserFeed",
    params=params,
    timeout=30,
)
response.raise_for_status()
payload = response.json()

if payload.get("status") != "ok":
    raise RuntimeError("TikTok API returned a non-ok status")

tiktok = payload.get("tiktok") or {}
items = tiktok.get("aweme_list") or []

stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
Path("snapshots").mkdir(exist_ok=True)
Path(f"snapshots/{PROFILE}_{stamp}.json").write_text(
    json.dumps(payload, ensure_ascii=False, indent=2),
    encoding="utf-8",
)

rows = []
for item in items:
    stats = item.get("statistics") or {}
    author = item.get("author") or {}
    rows.append({
        "aweme_id": item.get("aweme_id"),
        "created_at": item.get("create_time"),
        "description": item.get("desc") or "",
        "share_url": item.get("share_url"),
        "creator": author.get("unique_id") or author.get("nickname"),
        "play_count": stats.get("play_count"),
        "digg_count": stats.get("digg_count"),
        "comment_count": stats.get("comment_count"),
        "share_count": stats.get("share_count"),
    })

print(json.dumps(rows, ensure_ascii=False, indent=2))

توضح مواصفات المعلمة sort_type لهذا المسار أن القيمة 0 تعني المنشورات الأحدث، وأن 1 تعني الأكثر شعبية. اختير في المثال عرض المنشورات الأحدث، واستُبعدت المقاطع المثبتة باستخدام with_pinned_posts=0 كي لا يظهر منشور قديم مثبت ضمن عينة المنشورات الجديدة. وإذا احتجت إلى وضع آخر، فاحفظ المعلمة في بيانات اللقطة الوصفية وطبّقها بالطريقة نفسها في كل تشغيل.

معالجة الاستجابة: من JSON إلى جدول قابل لإعادة الإنتاج

من المفيد حفظ الاستجابة الأصلية قبل إجراء التحويلات. فهذا يتيح التحقق من خطوات توحيد البيانات، ومعرفة سبب فراغ صف ما، وتعديل المعالج إذا تغير توافر الحقول الاختيارية في الاستجابات. احفظ بجانب ملف JSON وقت الجمع بتوقيت UTC، والملف الشخصي المطلوب، والمعلمات، وإصدار البرنامج النصي. ولا تضع مفتاح API في الأرشيف أو السجل.

استخدم aweme_id معرّفًا للمنشور في عمليات التشغيل المتكررة، متى كان الحقل موجودًا. تمنع إزالة التكرارات اعتمادًا على هذا المعرّف احتساب المقطع نفسه عدة مرات عند استرجاعه مجددًا. لكن احتفظ بلقطات منفصلة للإحصاءات: فقيم المشاهدات والتفاعلات تخص لحظة الرصد، وليست خصائص ثابتة للمقطع. وإذا غاب حقل إحصائي، فاتركه فارغًا واستبعد السجل من حساب المقياس المعني.

يُشار إلى وقت النشر في المخطط باسم create_time. حوّله في الجدول التحليلي إلى تاريخ، واحتفظ بالقيمة الأصلية إلى جانب الوقت الموحّد بتوقيت UTC. تحقّق من عدة سجلات حقيقية في الاستجابة المستلمة قبل الحساب، للتأكد من نوع البيانات ووحداتها المتوقعة. وتكتسب هذه الخطوة أهمية خاصة عند إنشاء رسوم زمنية؛ لأن الخطأ في تحويل الوقت قد ينقل المنشورات إلى أيام غير صحيحة ويفسد المقارنة الأسبوعية.

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

import re

KEYWORDS = (
    "кофе", "эспрессо", "кофемолка", "латте", "заваривание",
)


def normalize(text):
    text = (text or "").casefold()
    return re.sub(r"\s+", " ", text).strip()


def classify(description):
    text = normalize(description)
    matches = [word for word in KEYWORDS if word in text]
    return {
        "topic_match": bool(matches),
        "matched_terms": matches,
    }

for row in rows:
    row.update(classify(row["description"]))

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

احسب المؤشرات مع توضيح المقام

تكفي نسبة المقاطع ذات الصلة وتواتر النشر لإعداد تقرير بسيط. تُحسب النسبة بقسمة عدد المقاطع التي تأكدت صلتها بالموضوع على عدد المقاطع التي أمكن تصنيفها. اعرض العددين دائمًا؛ مثلًا: «7 من أصل 18 وصفًا جرى التحقق منها». يوضح ذلك النتيجة ويساعد على ملاحظة الحالات التي تستند فيها النسبة إلى عينة صغيرة جدًا.

يمكن التعبير عن تواتر النشر بعدد المقاطع المسترجعة خلال فترة محددة، مثل آخر 30 يومًا. حدّد بداية الفترة ونهايتها بالاستناد إلى وقت الجمع وتواريخ النشر. وإذا التقطت لقطات أسبوعية، فاحتفظ بنتيجة كل تشغيل بدلًا من الاكتفاء بصف إجمالي مُحدّث؛ فهذا يُظهر التغير في الموضوعات والنشاط. ولا تفسّر عدد العناصر المجمعة على أنه أرشيف كامل لمنشورات صاحب الحساب؛ بل حلّل العينة التي استُرجعت فعلًا ووضّح قاعدة اختيارها صراحة.

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

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

التصفح المجزّأ والجدولة

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

cursor = None
all_items = []
max_pages = 3

for _ in range(max_pages):
    page_params = dict(params)
    if cursor is not None:
        page_params["max_cursor"] = cursor

    page_response = requests.get(
        "https://tiktok.evelode.com/getUserFeed",
        params=page_params,
        timeout=30,
    )
    page_response.raise_for_status()
    page_payload = page_response.json()

    if page_payload.get("status") != "ok":
        raise RuntimeError("TikTok API returned a non-ok status")

    page = page_payload.get("tiktok") or {}
    all_items.extend(page.get("aweme_list") or [])

    if not page.get("has_more"):
        break

    cursor = page.get("max_cursor")
    if cursor is None:
        break

اختر وتيرة التشغيل بحسب المهمة: يكفي التشغيل اليدوي للتقييم الأولي، أما قائمة صناع المحتوى فقد تستفيد من جدولة أسبوعية تكشف التغيرات من دون استعلام مستمر. يمكن تشغيل العملية عبر cron أو مهمة CI أو منسّق سير العمل. والخطوات بسيطة: اجلب الملفات الشخصية من جدول، ونفّذ الطلبات مع تحديد التوازي، واكتب اللقطات، وتحقق من نسبة الاستجابات الناجحة، وأرسل ملخصًا إلى جدول العمل. أعد الطلب بعد الخطأ المؤقت مع عدد محدود من المحاولات وفاصل زمني، واحفظ أخطاء الطلبات المصرّح بها على نحو منفصل للتحقق من المفتاح والإعدادات.

متى يفيد الذكاء الاصطناعي ومتى تلزم المراجعة

يفيد الذكاء الاصطناعي في تصنيف الأوصاف التي تتضمن عامية أو لغات متعددة أو تعبيرات لا تستخدم الكلمات المفتاحية الدقيقة. ابدأ بتحديد قائمة مغلقة من الفئات واطلب من النموذج استخدام نص الوصف وحده. ثم قِس الجودة على عينة صغيرة مصنفة يدويًا: قارن فئات النموذج بأحكام المحرر، وافحص الأخطاء والحالات الملتبسة كلًّا على حدة. ومن الأفضل أن يتضمن التقرير نسبة تطابق النموذج مع التصنيف اليدوي وعدد الأمثلة التي جرى التحقق منها، بدلًا من درجة إجمالية يصعب تفسيرها.

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

إذا تناول التحليل محتوى إعلانيًا مدمجًا، فتحقق بصورة مستقلة من الإفصاح عن علاقة صانع المحتوى بالعلامة التجارية في المنشورات نفسها، ومن المتطلبات ذات الصلة. يوضح دليل لجنة التجارة الفيدرالية الأمريكية أن العلاقة بالعلامة التجارية ينبغي الإفصاح عنها بوضوح بجوار التوصية، وأن السيرة التعريفية للملف أو الجزء المخفي من النص قد لا يكونان كافيين لإشعار الجمهور بوضوح. راجع إرشادات FTC لمؤثري وسائل التواصل الاجتماعي. يساعد رصد البيانات العامة في جمع المواد اللازمة للمراجعة، لكن تقييم الامتثال يتطلب مراعاة سياق المنشور والحملة المعنيين.

النتيجة المتوقعة

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

للتجربة الأولى، شغّل البرنامج النصي على ملف شخصي واحد، واحفظ الاستجابة الخام، وتحقق يدويًا من عدة تصنيفات. ثم ثبّت قائمة الموضوعات وقواعد اختيار العينة وشكل التقرير. وعندما تصبح النتيجة قابلة لإعادة الإنتاج، أضف الجدولة وقائمة انتظار للملفات الشخصية. راجع وثائق API للاطلاع على وصف المسارات والمعلمات، وصفحة TikTok Scraper API لمعرفة نظرة عامة على المنتج وخيارات التكامل المتاحة.

قائمة مراجعة عملية قبل التشغيل

  • دوّن موضوع الحملة والكلمات المشمولة وأمثلة الحالات الملتبسة.
  • حدّد فترة العينة وقيمة count وإعدادات الفرز والمنشورات المثبتة.
  • احتفظ بملف JSON الأصلي وتاريخ الجمع والمعلمات منفصلة عن المفتاح السري.
  • استخدم aweme_id لإزالة التكرار، إذا كان المعرّف موجودًا.
  • ميّز بين غياب القيمة والصفر، ولا تحسب متوسط المقاييس من دون أساس واضح.
  • اعرض حجم العينة بجانب نسبة المحتوى ذي الصلة، وأرفق روابط أمثلة.
  • اختبر تصنيف الذكاء الاصطناعي على عينة راجعها شخص قبل استخدامه في قرارات الحملة.
  • حدّث التقييم وفق جدول زمني، وقارن اللقطات المجموعة وفق القواعد نفسها.

الناس

لم يتم إدراج أي أشخاص لهذه المقالة حتى الآن.

استمر في القراءةكيفية تقييم جودة العملاء المحتملين على TikTok من الفيديوهات العامة: مسار عمل خطوة بخطوة باستخدام Python
إقرأ المقال التالي

حوّل ما تقرأه إلى تكامل عملي

استكشف واجهات API للبيانات الاجتماعية من jsonscraper واختبر الطلبات وأنشئ سير عملك التالي.

استكشف واجهات API