找一个账号的图片和视频(时间线不会给你)
找一个账号的图片和视频(时间线不会给你)
想要一个账号的图片,最直觉的做法是取他的时间线,然后留下带媒体的那些帖子。
★实测结果:这个做法几乎一条都拿不到。★
媒体时间线和普通时间线在测试中返回的帖子零重叠 —— 不是"重叠很少",是★一条都不重合★。它们是同一个账号的两个独立视图,取其中一个,对另一个一无所知。
实测行为
| 数据源 | 命中率 | 与普通时间线的重叠 |
|---|---|---|
| 图片视图 | ★88% 带图★ | ★0%★ |
| 视频视图 | ★100% 带视频★ | ★0%★ |
| 普通时间线 | 混合 | — |
为什么重叠是零而不是部分: ★它们是不同的索引,不是同一份列表的过滤版本。★ 普通时间线是把所有内容按时间排序;媒体视图是它们自己的集合。
实际后果: ★"取时间线再过滤 media"的代码,不是"取图片的慢办法" —— 它是一个几乎什么都取不到的办法。★
每个视图是它自己的一个调用 —— 而你通常需要不止一个。
怎么读
import requests
BASE = "https://api.socialapi.tech"
KEY = "your_api_key"
HDRS = {"X-API-Key": KEY}
def media(username, limit=100):
"""图片和视频是两个独立视图 —— 两个都要取。"""
def get(path):
r = requests.get(f"{BASE}{path}",
params={"username": username, "limit": limit},
headers=HDRS, timeout=60)
r.raise_for_status()
return r.json()["data"]
return {"photos": get("/v1/user/photos"),
"videos": get("/v1/user/videos")}
m = media("nasa")
print(f"{len(m['photos'])} 条带图 · {len(m['videos'])} 条带视频")
⚠️ ★图片和视频返回的结构不同,而这正是脚本会悄无声息返回空的地方。★
在帖子数据里,photos 是一个 URL 字符串列表,而 videos 是一个对象列表,每个带 url、type、thumbnail 和 duration_ms。用遍历其中一个的方式去遍历另一个,既没有输出也不会报错 —— 最糟的那种 bug。
for p in post.get("photos", []):
download(p) # ★一个字符串★
for v in post.get("videos", []):
download(v["url"]) # ★一个对象 —— 注意这个键★
另外两个值得知道的视图
精选(Highlights) —— 账号自己置顶挑选的内容。★这是唯一一个由「作者本人」告诉你什么才重要的视图★,在评估一个陌生账号时是个很好的捷径。
长文(Articles) —— X 的长文帖子。它们比普通帖子长得多,而★我们专门为这个视图请求了纯文本正文★(其它地方为了省流量是关着的)。做内容分析时,一篇长文抵得上很多条短帖。
def articles(username, limit=20):
"""长文帖子,带完整正文。"""
r = requests.get(f"{BASE}/v1/user/articles",
params={"username": username, "limit": limit},
headers=HDRS, timeout=60)
r.raise_for_status()
return r.json()["data"]
★四个视图,对"这个账号发布了什么"给出四个不同的答案。★
你要哪一个,完全取决于你在问什么问题 —— 而只用默认时间线,回答的是一个比大多数人以为的窄得多的问题。
四个视图都以用户名为键 —— 区别只在于你在问哪个问题。
这一页不是关于什么
这一页讲的是在一个账号上找到媒体,不是下载视频文件**。**
这个区别很重要: ★我们返回帖子里带的 URL★,而取文件本身是你自己控制的另一个步骤。我们是数据接口,不是下载服务 —— 而★人们搜的那些"下载这个视频"的工具,完全是另一个品类的产品★。
数据视图真正擅长的是: ★审查一个账号在视觉上发布了什么、在一批账号里找出媒体密集的那些、或者建一个"带媒体的帖子"数据集做分析★ —— 这些需要的都是 URL 和元数据,不是字节。
大家会问的问题
怎么拿一个账号的图片? 用图片视图 —— ★不要用"时间线加过滤"★,那几乎什么都拿不到。
怎么拿一个账号的视频? 视频视图,实测 100% 是带视频的帖子。
过滤时间线为什么不管用? ★媒体视图是独立的索引,不是被过滤的时间线★ —— 实测重叠 0%。
tweet media 是什么? 附在帖子上的图片、视频或 GIF。 ★URL 随帖子数据一起返回。★
有媒体查看器吗? 任何能展示账号媒体标签页的工具都是 —— ★那个标签页是标准的公开视图★。
怎么从一条帖子下载视频? URL 就在帖子数据里; ★取文件是你这边的步骤★。我们返回数据,不返回文件。
你们提供视频下载器吗? 不提供 —— ★那是另一个产品品类★。我们返回 URL 和元数据。
URL 给的是什么分辨率? 平台提供什么就是什么。 ★视频条目带 type 和时长★,你可以据此挑选。
我的图片循环为什么返回空?
★因为 photos 是字符串列表,videos 是对象列表。★ 用一个的方式遍历另一个,会悄无声息地产出空。
怎么同时处理两种媒体? 按字段分支。 ★永远不要假设它们结构相同★ —— 这是这里最常见的一个 bug。
能拿到缩略图吗? 能,在视频条目上。 ★图片没有单独的缩略图字段。★
媒体视图能回溯多远? 和任何时间线一样分页 —— 存档深度那套现实同样适用。
媒体视图包含转发吗? 计数之前先确认 —— ★一张被转发的图片可能出现在视图里★,但它不是这个账号自己的作品。
精选(Highlights)是什么? ★账号自己置顶挑选的内容★ —— 唯一一个由作者策展的视图。
为什么要用精选? 快速评估一个陌生账号。 ★那是他希望被评判的东西。★
X 的长文是什么? 一种长格式帖子,比普通帖子长得多。
能拿到长文的完整正文吗? 能 —— ★纯文本正文是专门为那个视图请求的★,其它地方没有。
长文值得为分析去取吗? ★非常值得★ —— 一篇长文承载的可分析文本,多过几十条短帖。
能搜索媒体帖子内部吗? 搜索匹配的是帖子正文,★不是图片里的内容★ —— 图片搜索能做和不能做什么。
能查一张图是谁发的吗? 通过平台不能。 ★把 URL 拿到通用的以图搜图引擎去。★
GIF 算视频吗?
它们一般走视频那个结构。 ★检查 type,不要凭假设。★
能拿受保护账号的媒体吗? 不能。 ★和受保护账号的其它一切是同一条边界。★
怎么建一个媒体数据集? 翻媒体视图,存 URL 加元数据 —— 导出模式。
取媒体会更贵吗? 就是一个普通调用 —— ★你取的是帖子数据,不是二进制文件★。
能判断一个账号有多"视觉化"吗? 拿媒体视图的量和时间线的量对比 —— ★但不要把它们当作包含关系★。
媒体请求能批量吗? 单个账号靠翻页。 ★跨账号的话,批量适用于资料和帖子★。
已删除的帖子会从媒体视图消失吗? 会 —— 删除移除了什么。
有我该知道的图片尺寸限制吗? 平台会重新编码上传的文件 —— ★你取到的是它提供的版本★,不是原图。
默认该用哪个视图? ★没有默认 —— 按问题选。★ 要图片用图片、要视频用视频、要文本用长文、要作者自己的选择用精选。
这里最大的一个错误是什么? ★以为时间线里包含着那些媒体。★ 实测重叠为零。
简短版
★媒体视图和普通时间线在测试中返回的帖子零重叠。★ 取时间线再按附件过滤,不是拿到一个账号图片的慢路径 —— 它是一条几乎什么都拿不到的路。
★而且两种媒体结构不同:photos 是字符串列表,videos 是对象列表。★ 用一个的方式遍历另一个会返回空,而且不会有任何报错告诉你。
我们的 API 把图片、视频、精选和长文做成四个独立视图 —— ★长文的正文是专门为那个端点请求的★,因为那正是"完整文本就是重点"的唯一场景。只读、固定按次价格。
我们不做什么: 下载文件。★我们返回 URL 和元数据;取字节是另一个产品,而我们不是那个。★
延伸阅读:图片搜索到底匹配什么 · 时间线能回溯多远 · 跨账号批量 · 导出你采集到的东西。