一、先说结论

Simple Live 里抖音直播的“播放”和“搜索”走的接口不一样。

如果只是打开某个抖音直播间,默认内置的 ttwid 很多时候就够了。但如果要在 Simple Live 里搜索主播、搜索房间名,抖音接口经常会要求登录态。这时候只填一个 ttwid 不够,需要浏览器登录后的完整 Cookie。

可以先按这个理解:

只看直播:默认 ttwid 多数情况下可以兜底
搜索主播 / 房间:建议使用完整 www.douyin.com Cookie

这篇写给不熟悉浏览器开发者工具的人。只要按步骤做,不需要懂前端。

二、Cookie 是什么

Cookie 可以粗略理解成“浏览器帮你保存的一串登录凭据”。

你在电脑浏览器里登录抖音后,浏览器每次请求 www.douyin.comlive.douyin.com,都会在请求头里带上一段类似这样的东西:

cookie: key1=value1; key2=value2; key3=value3

这一整行就是我们要复制的东西。

它不等同于密码,但很接近登录凭据。拿到你的完整 Cookie 的人,有可能在一段时间内用你的登录态请求抖音接口。所以不要发给别人,不要贴到公开 issue,也不要截图发群里。

Simple Live 需要它,是因为抖音搜索接口对匿名请求不太友好。浏览器能搜,是因为浏览器带着你的登录态。Simple Live 想在 App 里调用同一个搜索能力,也要带上这个登录态。

三、不要只复制 ttwid

很多人第一次会去浏览器 Cookie 列表里找 ttwid,然后只复制这一项。

这通常不够。

ttwid 更像一个设备 / 访客标识,它对播放有帮助,但它不一定代表“你已经登录”。搜索主播、房间名时,接口更关心完整的登录 Cookie,里面可能还会有 sid_guardsessionidpassport_csrf_tokenmsToken 等一批字段。

所以这篇教程里说的 Cookie,默认都指“完整 Cookie”,也就是一整串字段。

你要复制的是这种:

ttwid=...; sid_guard=...; sessionid=...; passport_csrf_token=...; msToken=...

不要只复制这种:

ttwid=...

建议用电脑端 Chrome 或 Edge。下面以 Edge / Chrome 这一类 Chromium 浏览器为例。

1. 打开抖音网页并登录

先打开:

https://www.douyin.com/

或者:

https://live.douyin.com/

登录自己的账号。扫码、验证码都可以。确认页面右上角能看到登录后的状态。

2. 打开开发者工具

F12

如果 F12 没反应,可以试:

Ctrl + Shift + I

打开后,点上方的 Network,中文浏览器里一般叫“网络”。

3. 刷新页面

在 Network 面板打开的情况下,按一下:

Ctrl + R

或者直接点浏览器刷新。

这样 Network 里会出现很多请求。不要被列表吓到,我们只需要其中任意一个带 Cookie 的抖音请求。

4. 找一个 www.douyin.com 或 live.douyin.com 请求

在 Network 请求列表里,随便点一个域名是下面这些的请求:

www.douyin.com
live.douyin.com

不一定非要点中搜索接口。

只要这个请求的 Request Headers 里有完整 Cookie,一般就可以用。你可以点页面、进个人页、进直播页、刷新首页,都会产生请求。

点开某个请求后,右侧或下方会看到 Headers

往下找:

Request Headers

再找:

cookie: ...

注意,是 Request Headers 里的 cookie

不要复制 Response Headers 里的 set-cookie。那是服务器返回给浏览器的单个设置项,浏览器下一次请求真正带出去的是 Request Headers 里的 cookie

你可以复制整行:

cookie: ttwid=...; sid_guard=...; sessionid=...

也可以只复制冒号后面的值:

ttwid=...; sid_guard=...; sessionid=...

Simple Live 都能识别。

五、如果浏览器显示成两行

有些复制方式会变成这样:

cookie
ttwid=...; sid_guard=...; sessionid=...

也没关系。Simple Live 做了兼容,会识别 cookie 下一行的内容。

也支持你把整段请求头都复制进去,例如:

accept: application/json
accept-language: zh-CN,zh;q=0.9
cookie: ttwid=...; sid_guard=...; sessionid=...
referer: https://www.douyin.com/
user-agent: Mozilla/5.0 ...

应用会从里面提取 cookie 那一行。

这部分逻辑在主 App 里是这样处理的:

simple_live_app/lib/modules/mine/account/account_controller.dart

处理时会先尝试从整段文本里找 cookie:,找不到再把输入当作纯 Cookie:

String _normalizeDouyinCookieInput(String input) {
  var cookie = _extractDouyinCookieFromHeaderText(input) ?? input.trim();
  if (cookie.toLowerCase().startsWith("cookie:")) {
    cookie = cookie.substring(cookie.indexOf(":") + 1).trim();
  }
  if (!cookie.contains("=")) {
    cookie = 'ttwid=$cookie';
  }
  return cookie;
}

所以不用太纠结复制格式。只要里面有完整 Cookie,应用会尽量帮你提取。

六、粘贴到 Simple Live

在 Simple Live 里打开:

设置 -> 账号管理 -> 抖音直播 -> Cookie 登录

把刚才复制的内容粘贴进去,点确定。

保存后,账号管理页会显示一个摘要。如果 Cookie 里有 sid_guard,应用会尝试解析一个预计有效期。这个时间只能作参考,因为退出登录、改密码、账号风控都可能让 Cookie 提前失效。

如果显示“有效期无法判断”,也不一定代表不能用,只是 Cookie 里没有能被当前逻辑解析的标准过期字段。

七、手机端怎么导入

手机上直接粘贴超长 Cookie 很容易失败:输入框长度、剪贴板、聊天软件转发,都可能把内容截断。

所以现在 Android / iOS 里加了“从文件导入 Cookie”。

推荐流程是:

  1. 在电脑上新建一个文本文件,例如:

    douyin-cookie.txt
    
  2. 把完整 Cookie 粘进去。

  3. 保存文件,最好用 UTF-8。

  4. 通过微信文件传输、QQ、网盘、数据线等方式传到手机。

  5. 手机打开 Simple Live:

    设置 -> 账号管理 -> 抖音直播 -> 从文件导入 Cookie
    
  6. 选择这个 txt 文件。

导入时会自动 trim(),也就是去掉文件开头和结尾的空格、空行。文件里可以是纯 Cookie,也可以是 Cookie: xxx,也可以是整段 Request Headers。

这也是为什么推荐用文件。电脑复制方便,手机负责导入,不要在手机上和一大段 Cookie 较劲。

八、TV 怎么办

TV 端不内置浏览器登录抖音。

原因很简单:TV 上打开网页登录体验很差,很多情况下也没法正常完成扫码、验证码、复制 Cookie 这些动作。

推荐做法是:

电脑或手机主 App 获取完整 Cookie
-> 在主 App 保存
-> 通过同步功能同步到 TV

不要在 TV 上尝试只填 ttwid。如果你要用抖音搜索,还是完整 Cookie 更靠谱。

九、为什么任意请求都可以

很多人会问:一定要找到 aweme/v1/web/live/search/ 这个搜索请求吗?

不一定。

Cookie 属于浏览器对这个域名发请求时携带的一组凭据,不绑定某一个具体请求。只要你已经登录,浏览器访问 www.douyin.comlive.douyin.com 时,很多请求都会带上同一批 Cookie。

Simple Live 搜索时会把你保存的 Cookie 放到请求头里:

cookie: 你保存的完整 Cookie

所以获取 Cookie 时,重点看两件事:复制到的 Cookie 是否完整,是否来自登录后的浏览器请求。

当然,如果你刚好能在 Network 里点到搜索接口,那也可以。但没必要为了找它折腾半天。

十、为什么 Android 会报 HEAD 请求失败

之前 Android 上有一个容易误导的问题:同一个 Cookie,Windows 能用,Android 搜索时报:

发送HEAD请求失败

原因是搜索前会先对抖音域名发一个 HEAD 请求,尝试补一些网页 Cookie。Android 网络环境、系统 TLS、服务端策略都有可能让这个 HEAD 请求失败。

后来 Simple Live 改了兜底逻辑:如果你本地已经保存了完整 Cookie,HEAD 失败时会继续用已保存 Cookie 请求搜索。

对应代码在:

simple_live_core/lib/src/douyin_site.dart

大概逻辑是:

try {
  headResp = await HttpClient.instance.head(
    'https://live.douyin.com',
    header: requestHeaders,
  );
} catch (e) {
  if (dyCookie.isEmpty) {
    rethrow;
  }
  _logDebug("抖音搜索预取 Cookie 的 HEAD 请求失败,使用已保存 Cookie 继续:$e");
}

所以如果你还遇到类似问题,先确认自己导入的是完整 Cookie,不要只导入 ttwid

十一、Cookie 会失效吗

会。

Cookie 会过期。常见失效原因有:

  • 你在浏览器里退出了抖音登录。
  • 修改密码或账号安全状态变化。
  • 抖音服务端主动让登录态过期。
  • Cookie 本身过期。
  • 账号触发风控,需要重新验证。

Simple Live 会尝试从 sid_guard 解析一个预计有效期,但这只是参考。

如果某天搜索突然不能用了,最直接的处理方式是:

重新在电脑浏览器登录抖音
-> 重新复制完整 Cookie
-> 重新粘贴或从文件导入

十二、几个常见错误

只填 ttwid

表现:

播放可能还能用,搜索不稳定或提示需要登录

处理:

重新复制完整 Request Headers Cookie

表现:

看起来有 Cookie,但字段很少,搜索还是失败

处理:

去 Request Headers 里复制 cookie,不要复制 Response Headers 里的 set-cookie

复制内容被截断

表现:

电脑能用,手机粘贴后不能用

处理:

把 Cookie 保存成 txt 文件,传到手机后用“从文件导入 Cookie”

登录后没有刷新 Network

表现:

Network 里看到的还是登录前请求,Cookie 不完整

处理:

登录成功后保持开发者工具打开,再刷新一次页面

这个不要做。

Cookie 接近登录凭据。别人拿到后,至少在一段时间内可能可以用你的登录态请求接口。遇到问题可以描述现象,不要把完整 Cookie 发出来。

十三、最后记几句

获取抖音 Cookie 这件事,最关键的就三句话:

要登录后的完整 Cookie
要复制 Request Headers 里的 cookie
不要只复制 ttwid

电脑端复制最方便,手机端建议用文件导入,TV 端建议从主 App 同步。

如果以后抖音网页改版,开发者工具的位置可能会变,但原理不会变:浏览器能搜索,是因为请求里带着登录态;Simple Live 要搜索,也要带着同一份登录态。