تيك توك منصة ضخمة بأكثر من مليار مستخدم نشط شهرياً، مما يجعلها كنزاً من البيانات القيّمة لفرق التسويق والمحللين. لكن استخراج هذه البيانات ليس بالأمر السهل — فالمنصة تمتلك واحدة من أكثر أنظمة مكافحة البوتات تطوراً في العالم. في هذا الدليل، سنشرح كيفية استخراج بيانات تيك توك بشكل قانوني وأخلاقي مع تجاوز التحديات التقنية.
تنبيه قانوني وأخلاقي: هذا الدليل مخصص للاستخراج المشروع للبيانات العامة المتاحة دون تسجيل دخول. يجب عليك دائماً احترام شروط خدمة تيك توك، وملف robots.txt، والقوانين المطبقة مثل CFAA في الولايات المتحدة وGDPR في الاتحاد الأوروبي. لا نحث على استخراج بيانات خاصة أو محمية بتسجيل الدخول، ولا على انتهاك خصوصية المستخدمين.
لماذا تيك توك صعب الاستخراج؟ فهم أنظمة الحماية
تيك توك (ومالكها ByteDance) استثمرت بكثافة في أنظمة الكشف عن البوتات. هذه الأنظمة متعددة الطبقات وتعمل بشكل متزامن:
التحقق من الجهاز (Device Verification)
تيك توك تجمع بصمة شاملة للجهاز تشمل: دقة الشاشة، خطوط النظام المثبتة، قدرات WebGL، سلوك التمرير، وتوقيت النقرات. أي تناقض في هذه البيانات يرفع علامات الشك.
جدار الحماية التطبيقي (WAF)
تعتمد تيك توك على WAF متقدم يراقب أنماط الطلبات ويحجب أي سلوك مشبوه. هذا يشمل معدل الطلبات، توزيع عناوين IP، وتناسق الطلبات.
نظام التوقيع الخاص بـ ByteDance
التحدي الأكبر هو معلمتا _signature وmsToken — توقيعات مشفرة تُضاف لكل طلب. هذه التوقيعات تُنتج عبر JavaScript تعمل في المتصفح، وتتغير خوارزميتها باستمرار.
| نظام الحماية | الوصف | صعوبة التجاوز |
|---|---|---|
| التحقق من الجهاز | بصمة المتصفح والجهاز | متوسطة |
| WAF | مراقبة أنماط الطلبات | متوسطة |
| _signature | توقيع الطلب المشفر | عالية |
| msToken | رمز الجلسة الديناميكي | عالية |
| CAPTCHA | تحديات تفاعلية | متوسطة |
البيانات العامة المتاحة دون تسجيل دخول
على الرغم من القيود، هناك كمية كبيرة من البيانات العامة المتاحة:
صفحات المبدعين (Creator Pages)
كل مبدع لديه صفحة عامة تعرض: اسم المستخدم، عدد المتابعين، عدد الإعجابات الإجمالي، وقائمة بمقاطع الفيديو الأخيرة. هذه البيانات متاحة للجميع.
صفحات الفيديو
كل فيديو عام يعرض: عدد المشاهدات، الإعجابات، التعليقات، والمشاركات. يمكن الوصول لهذه البيانات مباشرة من رابط الفيديو.
صفحات الهاشتاق
كل هاشتاق له صفحة تجمع الفيديوهات المرتبطة به، مع إجمالي عدد الفيديوهات والمشاهدات.
صفحات الترند
تيك توك تعرض الترندات الرائجة في كل منطقة، وهي بيانات قيّمة لرصد الاتجاهات.
# أمثلة على عناوين URL للبيانات العامة
# صفحة مبدع
https://www.tiktok.com/@username
# فيديو محدد
https://www.tiktok.com/@username/video/1234567890123456789
# هاشتاق
https://www.tiktok.com/tag/hashtag_name
# ترندات (تختلف حسب المنطقة)
https://www.tiktok.com/discover
لماذا البروكسي السكني مع IPs المحمول هو الأفضل؟
تيك توك منصة "موبايل-أولا" — صُممت أساساً للهواتف الذكية. هذا يعني أن خوادمها تثق أكثر في الطلبات القادمة من أجهزة محمولة حقيقية:
- البروكسي السكني — عناوين IP مخصصة لأجهزة حقيقية في منازل حقيقية، مما يجعل الطلبات تبدو طبيعية.
- IPs المحمول — عناوين من شبكات 4G/5G، وهي الأكثر ثقة لدى تيك توك لأن معظم مستخدميها الحقيقيين يستخدمونها.
- البروكسي المركزي (Datacenter) — يُكتشف بسهولة ويُحجب بسرعة، غير مناسب لتيك توك.
عند استخدام بروكسي سكني مع IP محمول، يرى خادم تيك توك طلباً قادماً من جهاز محمول حقيقي في منطقة جغرافية محددة — تماماً مثل المستخدم العادي.
| نوع البروكسي | معدل النجاح | التكلفة | الملاءمة لتيك توك |
|---|---|---|---|
| مركزي (Datacenter) | 10-30% | منخفضة | غير مناسب |
| سكني (Residential) | 70-85% | متوسطة | جيد |
| محمول (Mobile 4G/5G) | 90-98% | عالية | ممتاز |
إعداد البروكسي مع ProxyHat
للاستخدام مع تيك توك، ننصح بالبروكسي السكني مع استهداف جغرافي. إليك كيفية الإعداد:
# بروكسي HTTP مع استهداف الدولة
http://user-country-US:PASSWORD@gate.proxyhat.com:8080
# بروكسي مع استهداف المدينة (للترندات المحلية)
http://user-country-US-city-newyork:PASSWORD@gate.proxyhat.com:8080
# بروكسي SOCKS5 (للاتصالات التي تتطلب SOCKS)
socks5://user-country-US:PASSWORD@gate.proxyhat.com:1080
مثال Python + Playwright مع التخفي والبروكسي
إليك مثال كامل يستخدم Playwright مع إعدادات التخفي والبروكسي السكني:
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
import re
class TikTokScraper:
def __init__(self, proxy_url=None):
self.proxy_url = proxy_url
async def get_creator_data(self, username: str) -> dict:
"""استخراج بيانات المبدع العام"""
async with async_playwright() as p:
# إعداد المتصفح مع البروكسي
browser_args = {}
if self.proxy_url:
browser_args['proxy'] = {'server': self.proxy_url}
browser = await p.chromium.launch(
headless=True,
**browser_args
)
# إعداد سياق المتصفح كجهاز محمول
context = await browser.new_context(
user_agent='Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
viewport={'width': 390, 'height': 844},
device_scale_factor=3,
is_mobile=True,
has_touch=True,
locale='en-US',
timezone_id='America/New_York'
)
page = await context.new_page()
# تطبيق التخفي
await stealth_async(page)
try:
url = f'https://www.tiktok.com/@{username}'
await page.goto(url, wait_until='networkidle', timeout=30000)
# انتظار تحميل المحتوى
await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=10000)
# استخراج البيانات
data = await page.evaluate('''() => {
const stats = {};
// عدد المتابعين
const followersEl = document.querySelector('[data-e2e="followers-count"]');
if (followersEl) stats.followers = followersEl.textContent;
// عدد الإعجابات
const likesEl = document.querySelector('[data-e2e="likes-count"]');
if (likesEl) stats.total_likes = likesEl.textContent;
// اسم العرض
const nameEl = document.querySelector('[data-e2e="user-title"]');
if (nameEl) stats.display_name = nameEl.textContent;
// الوصف
const descEl = document.querySelector('[data-e2e="user-bio"]');
if (descEl) stats.bio = descEl.textContent;
return stats;
}''')
return {'username': username, 'data': data, 'status': 'success'}
except Exception as e:
return {'username': username, 'error': str(e), 'status': 'failed'}
finally:
await browser.close()
# الاستخدام
async def main():
# البروكسي السكني من ProxyHat
proxy = 'http://user-country-US:YOUR_PASSWORD@gate.proxyhat.com:8080'
scraper = TikTokScraper(proxy_url=proxy)
result = await scraper.get_creator_data('tiktok')
print(result)
asyncio.run(main())
التعامل مع _signature و msToken
هذا هو الجزء الأصعب في استخراج بيانات تيك توك. التوقيعات تُنتج عبر JavaScript معقدة وتتغير باستمرار:
كيف يعمل التوقيع
عند تحميل الصفحة، تُنفذ تيك توك JavaScript تُنتج:
_signature— توقيع يعتمد على المسار والمعاملاتmsToken— رمز جلسة يُحدّث دورياً
الطرق الشائعة للتعامل
1. تنفيذ JavaScript عبر Playwright/Puppeteer
اترك المتصفح يُنفذ JavaScript ويُنتج التوقيعات تلقائياً. هذا يتطلب انتظار تحميل الصفحة بالكامل.
# في Playwright، انتظر ظهور التوقيعات
await page.wait_for_function('''() => {
return window.__RENDER_DATA__ || window.__INITIAL_STATE__;
}''', timeout=15000)
# استخراج البيانات المُقدمة
data = await page.evaluate('''() => {
const renderData = window.__RENDER_DATA__;
if (renderData) return JSON.parse(renderData);
return null;
}''')
2. خدمات التوقيع الخارجية
بعض الخدمات توفر API لتوليد التوقيعات. هذا أسرع لكن يتكلفة إضافية ويعتمد على طرف ثالث.
3. الهندسة العكسية
تحليل JavaScript الخاصة بتيك توك لإعادة تنفيذ التوقيع. هذا يتطلب خبرة كبيرة ويحتاج تحديثاً مستمراً.
نصيحة: الطريقة الأكثر استقراراً هي استخدام المتصفح الآلي مع Playwright وتركه يُدير التوقيعات تلقائياً. أضف تأخيراً عشوائياً بين الطلبات لتجنب الحجب.
مثال Node.js للتعامل مع التوقيعات
const { chromium } = require('playwright');
async function scrapeTikTokHashtag(hashtag, proxyUrl) {
const browser = await chromium.launch({
headless: true,
proxy: proxyUrl ? { server: proxyUrl } : undefined
});
const context = await browser.newContext({
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15',
viewport: { width: 390, height: 844 },
isMobile: true,
hasTouch: true
});
const page = await context.newPage();
try {
// الانتقال لصفحة الهاشتاق
await page.goto(`https://www.tiktok.com/tag/${hashtag}`, {
waitUntil: 'networkidle',
timeout: 30000
});
// انتظار تحميل البيانات
await page.waitForSelector('[data-e2e="search-video-item"]', {
timeout: 10000
});
// استخراج بيانات الفيديوهات
const videos = await page.evaluate(() => {
const items = document.querySelectorAll('[data-e2e="search-video-item"]');
return Array.from(items).slice(0, 20).map(item => {
const link = item.querySelector('a');
const viewsEl = item.querySelector('[data-e2e="search-video-views"]');
return {
url: link?.href || '',
views: viewsEl?.textContent || '0'
};
});
});
return { hashtag, videos, status: 'success' };
} catch (error) {
return { hashtag, error: error.message, status: 'failed' };
} finally {
await browser.close();
}
}
// الاستخدام
const proxyUrl = 'http://user-country-US:PASSWORD@gate.proxyhat.com:8080';
scrapeTikTokHashtag('marketing', proxyUrl).then(console.log);
أنماط التوسع والتطبيق
تتبع المبدعين للمحللين
تتبع آلاف المبدعين يومياً لرصد:
- نمو المتابعين
- أداء المحتوى
- معدل النشر
- التعاونات المحتملة
import asyncio
from datetime import datetime
import json
class CreatorTracker:
def __init__(self, proxy_url, creators_list):
self.proxy_url = proxy_url
self.creators = creators_list
self.results = []
async def track_single(self, scraper, username):
"""تتبع مبدع واحد مع إعادة المحاولة"""
max_retries = 3
for attempt in range(max_retries):
result = await scraper.get_creator_data(username)
if result['status'] == 'success':
result['tracked_at'] = datetime.now().isoformat()
return result
await asyncio.sleep(2 ** attempt) # تأخير أسي
return {'username': username, 'status': 'failed'}
async def track_all(self):
"""تتبع جميع المبدعين بالتوازي"""
scraper = TikTokScraper(self.proxy_url)
tasks = [self.track_single(scraper, u) for u in self.creators]
self.results = await asyncio.gather(*tasks, return_exceptions=True)
return self.results
def save_results(self, filename):
"""حفظ النتائج"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.results, f, ensure_ascii=False, indent=2)
# الاستخدام
creators = ['tiktok', 'charlidamelio', 'khaby.lame', 'addisonre']
proxy = 'http://user-country-US:PASSWORD@gate.proxyhat.com:8080'
tracker = CreatorTracker(proxy, creators)
asyncio.run(tracker.track_all())
tracker.save_results('creator_data.json')
رصد الترندات
مراقبة الترندات الناشئة في مناطق مختلفة:
- استخدم بروكسي بجغرافيا مختلفة لكل منطقة
- حدّث البيانات كل ساعة أو أقل
- احفظ التاريخ لتحليل الاتجاهات
مراقبة الهاشتاقات
تتبع أداء الهاشتاقات المستهدفة:
- عدد الفيديوهات الجديدة
- إجمالي المشاهدات
- المبدعين الأكثر استخداماً
أفضل الممارسات لتجنب الحجب
- استخدم جلسات لاصقة (Sticky Sessions) — حافظ على نفس IP لعدة طلبات قبل التدوير
- أضف تأخيراً عشوائياً — بين 2-5 ثواني بين الطلبات
- حدد معدل الطلبات — لا تتجاوز 100 طلب لكل ساعة لكل IP
- استهدف جغرافياً — استخدم بروكسي من نفس منطقة البيانات المستهدفة
- أدر المستخدمين-الوكلاء — غيّر User Agent بانتظام
- احترم robots.txt — راجع القواعد قبل البدء
import random
import time
class RateLimiter:
def __init__(self, min_delay=2, max_delay=5, requests_per_hour=100):
self.min_delay = min_delay
self.max_delay = max_delay
self.requests_per_hour = requests_per_hour
self.request_times = []
def wait(self):
"""انتظار عشوائي مع مراقبة المعدل"""
# تنظيف الطلبات القديمة
now = time.time()
self.request_times = [t for t in self.request_times if now - t < 3600]
# التحقق من الحد الأقصى
if len(self.request_times) >= self.requests_per_hour:
sleep_time = 3600 - (now - self.request_times[0])
time.sleep(max(sleep_time, 0))
# تأخير عشوائي
delay = random.uniform(self.min_delay, self.max_delay)
time.sleep(delay)
self.request_times.append(time.time())
# الاستخدام
limiter = RateLimiter()
for username in creators:
limiter.wait()
# تنفيذ الطلب...
متى تستخدم API الرسمي بدلاً من الاستخراج؟
تيك توك توفر API رسمي لبعض حالات الاستخدام:
- البحث عن المحتوى — API توفر وصولاً منظماً
- تسجيل الدخول للمستخدمين — إذا كان تطبيقك يتطلب ذلك
- الوصول لبيانات المبدعين — بموافقتهم
استخدم API الرسمي عندما:
- البيانات متاحة عبر API
- تحتاج لبيانات في الوقت الحقيقي بشكل موثوق
- الميزانية تسمح بتكاليف API
استخدم الاستخراج مع البروكسي عندما:
- API لا يوفر البيانات المطلوبة
- تحتاج لبيانات تاريخية
- الميزانية محدودة
الاعتبارات الأخلاقية والقانونية
قبل البدء في أي مشروع استخراج بيانات:
- راجع شروط الخدمة — تأكد من أن نشاطك متوافق
- احترم robots.txt — حتى لو لم يكن ملزماً قانونياً
- لا تستخرج بيانات خاصة — التزم بالبيانات العامة فقط
- لا تُطع الخوادم — حافظ على معدلات معقولة
- احترم الخصوصية — لا تجمع بيانات شخصية حساسة
- التزام بـ GDPR/CCPA — إذا كانت بيانات مستخدمين أوروبيين أو كاليفورنيين
النقاط الرئيسية
- تيك توك لديها أنظمة حماية متعددة الطبقات تتطلب نهجاً متطوراً
- البروكسي السكني مع IPs المحمول يوفر أعلى معدل نجاح
- Playwright مع التخفي هو الأداة الموصى بها للتعامل مع التوقيعات
- التأخير العشوائي والحد من المعدل ضروريان لتجنب الحجب
- البيانات العامة المتاحة تشمل: صفحات المبدعين، الفيديوهات، الهاشتاقات، والترندات
- فكر دائماً في API الرسمي كبديل عندما يكون متاحاً
للمزيد من المعلومات حول البروكسي السكني وحلول الاستخراج، زوروا صفحة الأسعار أو صفحة حالات الاستخدام.






