code-root/tiktok-deep-scraper
GitHub: code-root/tiktok-deep-scraper
一个纯API的TikTok深度抓取工具,通过逆向Web API请求签名实现无浏览器爬取,能从账号简介中提取电话号码、推断国家地区并自动分类商业类型。
Stars: 0 | Forks: 0
# TikTok 深度简介抓取工具
**English** · [العربية](README.ar.md)
一个纯 API(无浏览器,无 Selenium)工具,可深度抓取 TikTok 以发现账号并从其简介中提取**电话号码**,然后通过概率分布猜测每个号码的**国家/地区**。
它的工作原理是手动对 TikTok web-API 请求进行签名,并使用带有浏览器模拟功能的 [`curl_cffi`](https://github.com/lexiforest/curl_cffi) 来绕过 Akamai 的 TLS 指纹识别。
## 功能
- **纯 API** — 无需浏览器自动化;直接发送签名的 HTTP 请求。
- **深度、持续抓取** — 对关注者图谱进行广度优先搜索(BFS):一个账号 → 其关注者 → 他们的关注者 → ……直到可配置的深度。边界会自动扩展,因此搜索会持续进行并自动加深。
- **关键词 / 标签种子** — 通过搜索关键词发现账号。
- **电话号码提取** — 支持阿拉伯语/波斯语和拉丁数字、WhatsApp 链接以及常见的分隔符。
- **带有概率的国家/地区检测** — 使用数字结构加上简介信号(旗帜、城市/国家名称、区号)的混合算法。
- **自动商业类型分类** — 使用加权关键词算法从其简介中对每个账号进行分类(房地产、汽车、餐厅、外卖、营销、医疗等),并随着号码的收集自动完成计算。
- **持久化状态** — 已经抓取过的用户将被记录并在未来的运行中跳过(无需重新抓取)。
- **增量、去重的 JSON 输出。**
## 工作原理
请求按照 TikTok 的 `webmssdk` 方式在客户端进行签名:
| 签名 | 来源 |
| ------------- | ---------------------------------------- |
| `X-Gnarly` | 在 `gnarly.py` 中计算(基于 ChaCha) |
| `X-Bogus` | `1`(一个静态占位符即可满足) |
| `msToken` | 随机的 128 字符串 |
| `X-Dynosaur` | 从浏览器中捕获的可重用 token,存储在 `config.json` 中(仅用于搜索) |
使用的 endpoint:
- 用户搜索:`/api/search/user/full/`(需要 `X-Dynosaur`)
- 关注者列表:`/api/user/list/?scene=67`(无需 `X-Dynosaur`)
由于 TLS/JA3 指纹识别,普通的 `requests` 会被拦截(返回空响应体);而带有 `impersonate` 的 `curl_cffi` 可以解决此问题。
## 安装
```
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
## 配置
复制示例配置并填入你自己的值:
```
cp config.example.json config.json
```
编辑 `config.json`:
- **`cookie`** — 来自你浏览器的完整登录 cookie 字符串。它**必须**包含 `sessionid=...`(获取关注者列表需要登录)。
- **`x_dynosaur`** — 从浏览器 Network(网络)选项卡中的搜索请求捕获的 token。它可在不同查询中重复使用;如果搜索开始返回空响应,请刷新它。
- **`impersonate`** — `curl_cffi` 浏览器配置文件(默认为 `firefox133`)。
- 其他可调参数:`max_followers_per_user`、`max_depth`、`max_users`、`delay_min`/`delay_max`、`keywords`、`output`、`state`。
### 如何捕获 `cookie` 和 `x_dynosaur`
1. 在你的浏览器中登录 `tiktok.com`。
2. 打开 DevTools → Network(网络),然后执行一次**用户搜索**。
3. 打开对 `/api/search/user/full/` 的请求:
- 复制完整的 `Cookie` 请求标头 → `cookie`。
- 复制 `X-Dynosaur` 查询参数 → `x_dynosaur`。
## 用法
### 1) 单账号关注者扫描 (`search_bio.py`)
```
python3 search_bio.py coderoot.ksa
python3 search_bio.py user1 user2 --max-followers 1000
python3 search_bio.py someuser --no-seed
```
### 2) 深度持续抓取爬虫 (`deep_search.py`)
```
# 从 keywords / hashtags
python3 deep_search.py --keywords "مطعم" "عقارات" "توصيل" --max-depth 6
# 从 seed accounts
python3 deep_search.py --seeds coderoot.ksa --max-depth 6 --max-followers 800
# 更大的 limits
python3 deep_search.py --keywords "متجر" --max-users 200000 --max-depth 6
```
| 选项 | 描述 | 默认值 |
| ------------------ | --------------------------------------------- | ------------------ |
| `--keywords` | 开始抓取所用的搜索关键词/标签 | 来自配置 |
| `--seeds` | 开始抓取所用的种子用户名 | — |
| `--max-depth` | 关注者树中的展开深度 | 4 |
| `--max-followers` | 每个账号最多获取的关注者数 | 1000 |
| `--max-users` | 最多处理的账号数(安全上限) | 1000000 |
| `--state` | 已经抓取过的用户的状态文件 | `output/crawl_state.json` |
| `--reset-state` | 忽略状态并重新开始 | 关闭 |
| `--delay-min/max` | 请求之间的随机延迟(秒) | 0.3 / 1.0 |
- 只要边界不为空,就会**持续**运行并不断加深。
- 随时可以通过 **Ctrl+C** 停止;进度和状态会被保存。
- 私密账号不会被展开(其关注者列表不公开)。
### 3) 丰富现有文件 (`enrich_country.py`, `enrich_categories.py`)
```
python3 enrich_country.py # add/refresh country info
python3 enrich_categories.py # add/refresh business-type category
python3 enrich_country.py path/to/file.json
```
## 输出格式
结果会保存到 `output/tiktok-bio.json`(一个去重的 JSON 数组):
```
{
"name": "Restaurant Mawazin Dubai",
"username": "bouchtadubai",
"phone": "0547166686",
"country": "United Arab Emirates",
"country_ar": "الإمارات",
"country_iso": "AE",
"dial_code": "+971",
"country_confidence": 0.636,
"country_probs": { "AE": 0.636, "SA": 0.364 },
"category": "Restaurants & Food",
"category_ar": "مطاعم وأطعمة",
"category_confidence": 1.0,
"category_tags": ["restaurant"],
"bio": "... Deira Dubai ...",
"source": "search:مطعم"
}
```
`source` 是 `search:`、`seed:@` 或 `follower_of:@` 中的一种。
## 国家/地区检测算法
1. **明确的国家代码**(开头包含 `+` / `00` / 已知代码) → 高置信度。
2. **本地格式** — 国家手机前缀:
- `01[0125]`(11 位数字) → 埃及。
- `05x`(10 位数字) → 沙特阿拉伯 / 阿联酋,通过前缀区分
(`053/057/059` = 沙特,`052` = 阿联酋,`050/054/055/056/058` = 共享)。
- `920 / 800` → 沙特统一/免费号码。
- 不以 0 开头的 8 位数字 → 海湾地区 8 位编号。
3. **简介信号** — 旗帜表情符号(🇸🇦🇦🇪🇪🇬…)、城市/国家名称以及文本中注明的区号会提升匹配候选对象的得分。
得分会被标准化为概率分布(`country_probs`),以 ISO 代码作为键,得分最高的候选者将成为 `country`/`country_confidence`。
## 商业类型分类
每个账号都会使用基于简介和名称的加权关键词列表,被分类到约 17 个类别(房地产、汽车、外卖、营销、餐厅、服装、美容、医疗、教育、清洁、家具、承包、印刷、科技、金融、旅游、商店)之一。得分会被标准化为概率分布;得分最高的类别将成为带有 `category_confidence` 的 `category`/`category_ar`,并且 `category_tags` 会列出前 3 个类别键。没有明确商业信号的账号将不予分类(`null`),而不是被强行归类。
## 项目结构
```
.
├── search_bio.py # single-account follower scan (pure API)
├── deep_search.py # deep continuous BFS crawler
├── country.py # phone -> country probability algorithm
├── categories.py # bio -> business-type classification
├── phones.py # phone-number extraction from bio text
├── enrich_country.py # add country info to an existing results file
├── enrich_categories.py # add category info to an existing results file
├── gnarly.py # X-Gnarly request-signature generator
├── config.example.json # config template (copy to config.json)
├── requirements.txt
└── output/ # results & state (git-ignored)
```
## 关于 Storage TE
本项目由 **[Storage TE](https://storage-te.com/)** 构建和维护 — 这是一家专注于**逆向工程**、自动化、增长工具、定制编程和 AI 的软件公司。我们构建 Web/移动应用、管理后台、数据提取和潜在客户生成 pipeline(例如 Google 地图和社交媒体潜在客户)、签名/反机器人研究,以及面向社交媒体的数字增长平台。
在 **[storage-te.com](https://storage-te.com/)** 了解更多。
## 维护者、公司与联系方式 👤
| | |
| --------- | ---------------------------------------- |
| 开发者 | Mostafa Al-Bagouri |
| 公司 | [Storage TE](https://storage-te.com/) |
| WhatsApp | +20 100 199 5914 |
| 电子邮件 | info@storage-te.com |
### 收款二维码(在 Binance 或任何 BSC 钱包中扫描)
| USDT · BSC | BTC · BSC |
| :--------: | :-------: |
|  |  |
这两个二维码编码的是上方相同的 BSC (BEP-20) 地址。
阿拉伯语文档:**[README.ar.md](README.ar.md)**
## 关键词
`tiktok` · `tiktok-api` · `tiktok-scraper` · `web-scraping` · `crawler` · `osint` · `lead-generation` · `phone-numbers` · `data-extraction` · `reverse-engineering` · `x-gnarly` · `x-bogus` · `msToken` · `curl-cffi` · `tls-fingerprinting` · `country-detection` · `business-classification` · `followers` · `bio-scraper` · `arabic` · `python` · `automation` · `storage-te`
## 免责声明
仅供研究和教育使用;请遵守 TikTok 的服务条款及所有适用法律。
## 许可证
[MIT](LICENSE)
标签:逆向工具