您当前的位置: 首页  >  博文日记

抖音视频去水印接口分析 | 增加X-Bogus等验证及python服务器搭建

作者:总管理员 时间:2023-03-15 21:08:01 阅读数:2375人阅读

最近有很多热心网友反馈抖音去水印又不行了,之前是时不时被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

标签: python

需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!