如何用 TwexAPI 检测 X 付费推广
自然传播和付费推广在时间线里可能看起来很像。做市场研究、活动复盘或竞品监控时,这个区别很重要:用户主动转发带来的扩散,和投放驱动的曝光,不应该混在同一组指标里解释。
TwexAPI 会在推文对象里返回 is_paid_promotion 字段。配合 POST /twitter/tweets/lookup,你可以检查一组 tweet ID,标记哪些帖子被识别为付费推广,并把原始响应、候选来源和后续指标保存在一起。
为什么这个字段重要
为什么这个字段重要 指它能把“内容表现”拆成付费曝光和自然讨论两条线。手动查看时间线会漏掉不再展示给你的推广内容;批量查询则能把判断放进稳定的数据流程。
- 付费推广标签:当
is_paid_promotion === true时,把该帖子标记为付费推广样本。 - 批量处理:把候选 tweet ID 组成数组,一次请求返回一组推文对象。
- 证据留存:保存原始 JSON、候选来源、抓取时间和互动指标,方便复盘时解释判断。
- 研究闭环:先用 Advanced Search、活动列表或人工样本收集候选 ID,再用 lookup 验证推广标记。
注意:false 或缺失字段不应被写成“绝对没有投放”。更稳妥的表达是“本次查询未返回付费推广标记”。这能避免把平台可见性、样本来源或字段缺失误读成确定结论。
技术实现:批量标注
批量标注 指向 POST /twitter/tweets/lookup 提交 tweet ID 数组,读取响应 data 中每个推文对象的 is_paid_promotion。这个流程不负责发现所有广告,它负责把你已经收集到的候选 tweet ID 做证据化标注。
1import requests
2from datetime import datetime, timezone
3
4API_URL = "https://api.twexapi.io/twitter/tweets/lookup"
5TOKEN = "YOUR_TWEXAPI_BEARER_TOKEN"
6
7def clean_tweet_ids(tweet_ids):
8 cleaned = []
9 seen = set()
10
11 for value in tweet_ids:
12 tweet_id = str(value).strip()
13 if not tweet_id or tweet_id in seen:
14 continue
15 cleaned.append(tweet_id)
16 seen.add(tweet_id)
17
18 return cleaned
19
20def lookup_tweets(tweet_ids):
21 cleaned_ids = clean_tweet_ids(tweet_ids)
22 if not cleaned_ids:
23 return []
24
25 response = requests.post(
26 API_URL,
27 headers={
28 "Authorization": f"Bearer {TOKEN}",
29 "Content-Type": "application/json",
30 "Accept": "application/json",
31 },
32 json=cleaned_ids,
33 timeout=30,
34 )
35 response.raise_for_status()
36 payload = response.json()
37
38 if payload.get("code", 200) >= 400:
39 raise RuntimeError(payload.get("msg", "TwexAPI returned an error"))
40
41 return payload.get("data") or []
42
43def classify_paid_promotions(tweet_ids, candidate_source):
44 fetched_at = datetime.now(timezone.utc).isoformat()
45 rows = []
46
47 for tweet in lookup_tweets(tweet_ids):
48 if not tweet:
49 continue
50
51 text = tweet.get("full_text") or tweet.get("text") or ""
52 user = tweet.get("user") or {}
53 is_paid = tweet.get("is_paid_promotion") is True
54
55 rows.append({
56 "tweet_id": tweet.get("tweet_id") or tweet.get("id"),
57 "is_paid_promotion": is_paid,
58 "promotion_label": "paid" if is_paid else "not_marked_paid",
59 "candidate_source": candidate_source,
60 "screen_name": user.get("screen_name"),
61 "created_at_datetime": tweet.get("created_at_datetime"),
62 "favorite_count": tweet.get("favorite_count"),
63 "retweet_count": tweet.get("retweet_count"),
64 "reply_count": tweet.get("reply_count"),
65 "view_count": tweet.get("view_count"),
66 "text_preview": text[:160],
67 "fetched_at": fetched_at,
68 "raw": tweet,
69 })
70
71 return rows
72
73candidate_ids = ["123456789", "987654321", "555666777"]
74results = classify_paid_promotions(candidate_ids, candidate_source="competitor_launch_search")
75
76paid_rows = [row for row in results if row["is_paid_promotion"]]
77print(f"Checked {len(results)} tweets; paid promotion marked: {len(paid_rows)}")候选 ID 从哪里来
候选 ID 来源 指你如何决定哪些推文需要进入 lookup。不要只抓已经爆掉的帖子,否则会把研究样本偏向高互动内容。
常见来源包括:
- Advanced Search:按竞品账号、品牌词、活动 hashtag 或 URL 域名收集候选帖子。
- 活动落地页日志:把带来流量的 X 帖子 URL 解析成 tweet ID。
- 人工样本池:研究人员把看到的疑似推广帖加入候选列表。
- 历史活动列表:对过去的活动 tweet ID 做回溯标注,区分自然扩散和推广曝光。
如果你用 Advanced Search 收集候选,建议把查询、sortBy、采集时间和原始 tweet ID 一起保存。这样后面发现样本偏差时,能回到候选来源重新调整。
市场研究工作流
市场研究工作流 指把 is_paid_promotion 作为标注字段,而不是单独看一条帖子。常见用法包括:
- 付费/自然占比:统计某个竞品账号、活动 hashtag 或产品关键词下,被标记为付费推广的帖子占比。
- 创意表现对比:只拿已确认付费推广的样本比较视频、图片、线程、链接帖的互动和浏览。
- 投放节奏分析:按小时、星期和活动阶段观察推广内容出现的时间分布。
- 复盘分层:把自然爆发内容和付费放大内容分开复盘,避免误判创意质量。
这类分析不应该把单个布尔字段解释成完整预算估算。更可靠的做法是把它作为“是否被标记为推广”的证据,再和发布时间、互动指标、创意形式、目标页面和活动阶段一起分析。
应保存哪些字段
应保存的字段 指后续能解释每一次付费/自然标注的最小证据集合。保存足够上下文,后续才能解释每一次分类:
| 字段 | 用途 |
|---|---|
tweet_id | 去重和复查 |
is_paid_promotion | 标记是否返回付费推广信号 |
promotion_label | 区分 paid、not_marked_paid、missing 等分析状态 |
candidate_source | 说明推文如何进入数据集 |
created_at_datetime 和 fetched_at | 分析投放时间和抓取时间 |
user.screen_name | 按账号聚合 |
text、urls、media | 做创意和落地页分析 |
favorite_count、retweet_count、reply_count、view_count | 对比表现 |
| 原始 JSON | 字段变化或模型调整后可重新处理 |
常见误判
常见误判 指把字段解释过度,或者把样本收集偏差当成市场结论。建议特别注意三点:
is_paid_promotion === true可以作为付费推广证据;false或缺失只表示本次响应未返回该标记。- 候选 ID 的来源会影响结论。只收集高互动帖子,会高估付费推广对“爆款”的影响。
- 互动表现不能直接等于投放预算。浏览、点赞和转推还会受创意、受众、发布时间和自然讨论影响。
小结
小结 指把付费推广检测做成可重复的标注流程:先收集候选 tweet ID,再调用 /twitter/tweets/lookup 批量获取推文对象,读取 is_paid_promotion,保存原始响应、候选来源和互动指标。这样你可以在竞品监控、活动复盘和创意分析中,把付费推广样本和自然讨论分开看。