找一个账号的图片和视频(时间线不会给你)

12 min readSocialAPI 工程团队

找一个账号的图片和视频(时间线不会给你)

想要一个账号的图片,最直觉的做法是取他的时间线,然后留下带媒体的那些帖子。

★实测结果:这个做法几乎一条都拿不到。★

媒体时间线和普通时间线在测试中返回的帖子零重叠 —— 不是"重叠很少",是★一条都不重合★。它们是同一个账号的两个独立视图,取其中一个,对另一个一无所知。


实测行为

数据源 命中率 与普通时间线的重叠
图片视图 ★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 和元数据;取字节是另一个产品,而我们不是那个。★

延伸阅读:图片搜索到底匹配什么 · 时间线能回溯多远 · 跨账号批量 · 导出你采集到的东西。