zl程序教程

您现在的位置是:首页 >  其他

当前栏目

抖音sign值生成失效分析(2020-03)

2023-03-15 22:06:04 时间
这两天发现抖音分享页面 用户视频数据获取不到了
目前用户信息还是可以

之前的sign生成方法抖音视频分享页面_signature

我简单检查了一遍发现是sign值错误。

一开始我以为是抖音更新了sign的生成方法,经过检查和与之前的代码对比,生成方法还是与之前一样。

于是我猜测应该是我的程序被识别出来,导致被ban掉。

我用selenium打开了链接:https://www.iesdouyin.com/share/user/102064772608

一经对比果然发现是selenium被识别到了。 (右图为正常浏览)

查看下接口。返回的数据是空的,这说明我们该驱动生成的sign值不正确。

为了进一步追踪导致生成错误的原因,我选择了一个固定的抖音ID下 的 tac 和 dytk,放到了本地执行生成sign的代码。

经过对比,发现在相同的可见参数下,生成的sign值 其中只有9位是不一样的。 我们接下来就可以一个一个排除干扰因素。

这样大致就有了方向,我查看了下两个浏览器的 navigator。

除了基本的 webdriver = True 之外,还有 languages 不大相同 (其他的指纹信息太难对比了)。

按照以往的经验,直接给了一个开发者模式的options,访问之后,webdriver还是为True。 在网上搜索后,发现是谷歌浏览器自 79.0.3945.36版本开始,修复了非无头模式下“自动化” navigator.webdriver是未定义的问题。 这里有几个解决方法:

  • 1 将Chrome回滚一个版本,ChromeDriver回滚对应Chrome的版本即可。(pass,对于我来说在服务器调试太过繁琐)
  • 2 启用mitmproxy拦截请求,在请求发送到服务端之前修改js文件,来掩盖webdriver指纹信息。(pass,目前并无法判断服务短是否只根据navigator.webdriver来进行ban选)

3: 最新检索出来的结果,也是目前我正在使用的方法,可以在linux 运行。 使用 driver.execute_cdp_cmd 命令。代码如下:

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
                    """ })

接下来我们启动一个 使用execute_cdp_cmd命令的界面。

虽然navigator.webdriver 已经变成未定义了,但是可以看到 接口返回的数据还是为空。

不要着急。我再次选择一个固定的抖音ID下 的 tac 和 dytk,放到了本地执行生成sign的代码。

好像距离真相又近了一步,这已经可以发现,我们目前模拟生成的sign值 只和真实的值 在ASCII上差了1位

我没有继续去查询还有哪些driver指纹被识别出来,实在太劳民伤财了。

这里经过我大约有200多次的测试。我组合出来所有字符的变换规则,基本上是固定的。

# less_list:如果我们生成的sign值 倒数第二位字符(X)在该列表中,那么真实的值需要用值(X)的ASCII减去1。比如m要换成l。 
less_list = ['d','V','J','t','m','L','R','l','X','b','Z','B','r','3','v','N','D','P','9','1','H','7','T','z','j','f','x','p','h','5','F','.']
# add_list: 和less相反,真实值需要用假X的ASCII+1,比如假值为M,真值则为n。
add_list = ['a','K','W','M','u','Q','S','A','e','U','O','Y','I','0','k','E','y','c','w','2','s','8','4','6','C','o','g','q','-','i','G','n',]
这样就解决问题了,可以正常的去抓取数据。

通过ASCII - sign值切换代码:

sig = '我们初次生成出来的值'
less_list = ['d','V','J','t','m','L','R','l','X','b','Z','B','r','3','v','N','D','P','9','1','H','7','T','z','j','f','x','p','h','5','F','.']
add_list = ['a','K','W','M','u','Q','S','A','e','U','O','Y','I','0','k','E','y','c','w','2','s','8','4','6','C','o','g','q','-','i','G','n',]
if sig[-2] in less_list:
    flag = '-1'
    sig = sig[:-2] + chr(ord(sig[-2])-1) + sig[-1:]
elif sig[-2] in add_list:
    flag = '+1'
    sig = sig[:-2] + chr(ord(sig[-2])+1) + sig[-1:]
else:
    print("新字符:",sig)   # 可能会出现新字符, 新字符默认取 ASCII +1
    sig = sig[:-2] + chr(ord(sig[-2])+1) + sig[-1:]

访问更多内容可查看专栏:爬虫案例合集