抖音视频去水印接口分析 | 增加X-Bogus等验证及python服务器搭建
最近有很多热心网友反馈抖音去水印又不行了,之前是时不时被blocked,现在直接连内容都没有了,返回直接就是空了,我们今天简要给大家分析一下请求过程,并附上X-Bogus生成接口及源码。
请求过程分析
我们还是先获取一个抖音链接
https://v.douyin.com/S2pF3G8/
通过访问重定向
https://www.douyin.com/video/7190042191169883427
然后提取到其中的视频ID
7190042191169883427
如果是之前,我们会直接GET请求
https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7190042191169883427
然后就能得到响应内容了。
但是这种方法已经失效了,今天我们会讲解如何在增加一些请求头参数以及X-Bogus后,可以仍然获取到JSON格式的数据。
X-Bogus你可以理解为是一个根据视频ID及user-agent通过JS生成的用户信息参数,它可以用于校验,详细的一篇分析可以参考Freebuf上的《【JS 逆向百例】某音 X-Bogus 逆向分析,JSVMP 纯算法还原》
我们这里已经给大家部署好相关的接口了,你可以POST请求https://tiktok.iculture.cc/X-Bogus,然后请求是JSON格式的,传入你的url和user-agent
{
"url":"https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7190049956269444386&aid=1128&version_name=23.5.0&device_platform=android&os_version=2333",
"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
便可以获得如下结果
{
"X-Bogus": "DFSzswSLfwUANnEftawINt9WcBj3",
"param": "https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7190049956269444386&aid=1128&version_name=23.5.0&device_platform=android&os_version=2333&X-Bogus=DFSzswSLfwUANnEftawINt9WcBj3"
}
如果你需要用于抖音视频去水印,则可以直接提取上述的param部分作为请求的URL,使用GET请求访问,但是你会发现可能仍然请求不到任何内容。
因此,记得请求头中需要携带以下内容
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Referer:https://www.douyin.com/
Cookie:msToken=uTa38b9QFHB6JtEDzH9S4np17qxpG6OrROHQ8at2cBpoKfUb0UWmTkjCSpf72EcUrJgWTIoN6UgAv5BTXtCbOAhJcIRKyZIT7TMYapeOSpf;odin_tt=324fb4ea4a89c0c05827e18a1ed9cf9bf8a17f7705fcc793fec935b637867e2a5a9b8168c885554d029919117a18ba69; ttwid=1%7CWBuxH_bhbuTENNtACXoesI5QHV2Dt9-vkMGVHSRRbgY%7C1677118712%7C1d87ba1ea2cdf05d80204aea2e1036451dae638e7765b8a4d59d87fa05dd39ff; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWNsaWVudC1jc3IiOiItLS0tLUJFR0lOIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLVxyXG5NSUlCRFRDQnRRSUJBREFuTVFzd0NRWURWUVFHRXdKRFRqRVlNQllHQTFVRUF3d1BZbVJmZEdsamEyVjBYMmQxXHJcbllYSmtNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVKUDZzbjNLRlFBNUROSEcyK2F4bXAwNG5cclxud1hBSTZDU1IyZW1sVUE5QTZ4aGQzbVlPUlI4NVRLZ2tXd1FJSmp3Nyszdnc0Z2NNRG5iOTRoS3MvSjFJc3FBc1xyXG5NQ29HQ1NxR1NJYjNEUUVKRGpFZE1Cc3dHUVlEVlIwUkJCSXdFSUlPZDNkM0xtUnZkWGxwYmk1amIyMHdDZ1lJXHJcbktvWkl6ajBFQXdJRFJ3QXdSQUlnVmJkWTI0c0RYS0c0S2h3WlBmOHpxVDRBU0ROamNUb2FFRi9MQnd2QS8xSUNcclxuSURiVmZCUk1PQVB5cWJkcytld1QwSDZqdDg1czZZTVNVZEo5Z2dmOWlmeTBcclxuLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tXHJcbiJ9
这里Cookie指的一提的是msToken可以是随机107位大小写英文字母、数字生成,以下是一个简单的样例
def generate_random_str(self, randomlength=107):
"""
根据传入长度产生随机字符串
"""
random_str = ''
base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789='
length = len(base_str) - 1
for _ in range(randomlength):
random_str += base_str[random.randint(0, length)]
return random_str
当然,部分网友也分析了ttwid的生成方式,你可以通过POST请求https://ttwid.bytedance.com/ttwid/union/register/,请求体使用JSON格式
{"region":"cn","aid":1768,"needFid":false,"service":"www.ixigua.com","migrate_info":{"ticket":"","source":"node"},"cbUrlProtocol":"https","union":true}
然后在响应头的Set-Cookie中,你可以获得ttwid
ttwid=1%7C7ZLJzwjjEw7NLeADTpVd-3eId-ZEIg0jpCEzTV9p_2A%7C1677681848%7C4ff4f97328ddc18b6d46c259bc26a05d2e654b50e3f21b27b8f9e9e8f9fcec82; Path=/; Domain=bytedance.com; Max-Age=31536000; HttpOnly; Secure
只需要稍加提取就可以使用了
ttwid=1%7C7ZLJzwjjEw7NLeADTpVd-3eId-ZEIg0jpCEzTV9p_2A%7C1677681848%7C4ff4f97328ddc18b6d46c259bc26a05d2e654b50e3f21b27b8f9e9e8f9fcec82;
本地服务器搭建
使用了python语言,代码如下:
from flask import Flask, request, jsonify
import execjs
import urllib.parse
app = Flask(__name__)
@app.route('/X-Bogus', methods=['POST'])
def generate_request_params():
data = request.get_json()
url = data.get('url')
user_agent = data.get('user_agent')
query = urllib.parse.urlparse(url).query
xbogus = execjs.compile(open('./X-Bogus.js').read()).call('sign', query, user_agent)
new_url = url + "&X-Bogus=" + xbogus
response_data = {
"param": new_url,
"X-Bogus": xbogus
}
return jsonify(response_data)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8700)
为方便操作,我们的系统是centos7.9,宝塔面板。
首先在wwwroot目录下创建一个python目录,并将文件上传:
然后安装phton管理器:
安装3.9.10版本:
添加一个项目:
默认是启动不了的,我们进入命令行窗口启动:
启动试试:
python3 server.py
报错:
Traceback (most recent call last):
File "server.py", line 1, in <module>
from flask import Flask, request, jsonify
ModuleNotFoundError: No module named 'flask'
少什么就安装什么:
pip3 install flask
运行再报错:
No module named 'execjs'
继续安装
pip3 install PyExecJS
出现如下网址,表示启动正常:
Running on http://172.21.213.148:8700/ (Press CTRL+C to quit)
小程序测试解析是否正常,如果报错:
Could not find an available JavaScript runtime.
需要安装nodejs环境,在宝塔面板node管理器中安装即可
正常后,按CTRL+C结束,使用下面的命令以后台方式运行
nohup python3 server.py &
小程序中调用的效果预览:
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱: 2554509967@qq.com