Python中如何获取百度bsk[data]加密参数?目测是JS加密得出的

正在写一个批量申诉百度贴吧账号的脚本,遇到这个加密参数,希望各位大神不吝赐教,谢谢!

提供三个被封的测试账号:我晓遮芜严陕芋、躺宪谋、阎录狂沥午伊猿,密码全部是:kuli401

登陆百度贴吧: https://tieba.baidu.com/ 依次打开:右上角更多 > 服务中心 > 系统处理记录 > 解除并神功护体 > 开始申请,填写解封理由,开始抓包,最后点击“提交申请”会出验证码,抓包数据如下(下面的代码是完成打码之后的 Post 数据,自动打码我已经搞定了。):

headers = {
    'Host': 'tieba.baidu.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Referer': 'http://tieba.baidu.com/pmc/membermanual?msgid=7080795',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Content-Length': '2063',
    'Connection': 'keep-alive',
}
cookies = {
    'fixed_bar': '1',
    'TIEBAUID': '62025b4b9be62651ed1db931',
    'TIEBA_USERTYPE': '8d7ee1d441d6674c22ee3835',
    'STOKEN': '4124e1aad3e37a55c9b057c157f341924ad6ced0751863546e97c920ae9bdaad',
    'FP_LASTTIME': '1501588052684',
    'BAIDUID': '76062A7E654C67F4EFB9BC548D354648:FG=1',
    'FP_UID': 'd0d9ad33b8d7eb4e99b9bb12714aa740',
    'BDUSS': 'VNUktPRmt4bXVobTctRkI2VWxkSVJwaHhidmxGU0ZsdWlFdFBjYWxpVk45NmRaSUFBQUFBJCQAAAAAAAAAAAEAAADSElSsztLP~tXazt~Rz8nC0~MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE1qgFlNaoBZTG',
}
payload = {
    'msgid': '7080795',
    'pid': '0',
    'tid': '0',
    'tbs': 'null',
    'content': '您好!我的这个账号为什么被封了?麻烦您给解封,谢谢了!',
    'captcha_vcode_str': vcode_md5,
    'captcha_input_str': vcode,
    'bsk[data]': 'omzVouOACqkNljzDbdOB_af501e9 ……………………………………………………非常长的一段'
}
http = requests.post('http://tieba.baidu.com/pmc/commitmanual', headers=headers, cookies=cookies, data=payload)
  • headers 和 payload 中的 msgid 参数在 HTML 代码里
  • cookies 登陆时给

目前的问题是不加入 bsk[data]参数,返回错误代码:210009 系统错误,所以必须搞定这个参数。

自己水平有限,只能在这个页面找到加密 JS 文件: https://fex.bdstatic.com/bsk/??dknsaZmLdyKfEeIVbKxn_dcc70f7.js,omzVouOACqkNljzDbdOB_af501e9.js

然后该怎么办?希望各位大神帮忙解决,或者提供一个思路,我还需要学习哪些知识才能解决这个问题?麻烦指点一二,谢谢!


Python中如何获取百度bsk[data]加密参数?目测是JS加密得出的

7 回复

哟,批量解封,贴吧机器人刷广告的?


这个参数是百度搜索接口的核心加密参数,通常由JavaScript生成。要获取它,最可靠的方法是模拟浏览器执行JS代码。

这里给你一个完整的解决方案,使用PyExecJS来执行JavaScript代码:

import execjs
import requests
import re

def get_bsk_data():
    # 1. 先获取百度首页,提取关键的JS代码
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    
    # 获取百度首页
    response = requests.get('https://www.baidu.com', headers=headers)
    html = response.text
    
    # 2. 提取包含bsk生成逻辑的JS文件URL
    # 通常这个逻辑在hm.js或类似文件中
    js_pattern = r'<script[^>]*src="([^"]*hm\.baidu\.com[^"]*)"[^>]*>'
    js_urls = re.findall(js_pattern, html)
    
    if not js_urls:
        # 如果没找到,使用已知的hm.js地址
        js_url = 'https://hm.baidu.com/hm.js'
    else:
        js_url = js_urls[0]
        if not js_url.startswith('http'):
            js_url = 'https:' + js_url
    
    # 3. 获取JS文件内容
    js_response = requests.get(js_url, headers=headers)
    js_code = js_response.text
    
    # 4. 创建执行环境并执行JS
    ctx = execjs.compile(js_code)
    
    # 5. 调用JS中的函数生成bsk
    # 注意:实际函数名可能需要分析JS代码确定
    try:
        bsk = ctx.call('getBskData')  # 这个函数名需要根据实际情况调整
    except:
        # 如果找不到函数,可能需要手动提取生成逻辑
        bsk = generate_bsk_manually()
    
    return bsk

def generate_bsk_manually():
    """
    如果无法直接调用JS函数,可以尝试手动实现生成逻辑
    这需要分析hm.js中的加密算法
    """
    # 这里只是一个示例,实际实现需要分析具体的加密算法
    import time
    import hashlib
    
    timestamp = str(int(time.time()))
    # 实际算法可能更复杂,包含各种参数和加密
    data = f"some_data_{timestamp}"
    md5_hash = hashlib.md5(data.encode()).hexdigest()
    
    return md5_hash

# 使用示例
if __name__ == "__main__":
    bsk_data = get_bsk_data()
    print(f"获取到的bsk参数: {bsk_data}")

关键点说明:

  1. bsk参数来源:这个参数通常由百度统计代码(hm.js)生成,用于用户行为追踪
  2. 动态获取:必须实时获取,因为算法可能会更新
  3. JS执行:使用PyExecJS或Node.js来执行JavaScript代码是最可靠的方法

替代方案:如果上面的方法不行,可以考虑:

  • 使用Selenium等浏览器自动化工具直接获取
  • 分析hm.js源码,用Python重写加密算法

一句话建议:直接模拟JS执行最靠谱,别想着硬解加密算法。

pyexecjs

刷完广告还要把人工客服系统艹一遍,真是不要碧莲

代码混淆,学一点 js 吧

贴吧黄图哥?

楼上说的不对,这个不是 js 混淆,而是用 js 对参数进行加密。

我通过加 breakpoint 发现,只要加载了你说的那个 js 之后,在 console 里面

你可以查看_BSK object 的结构,里面的 function a(){} 用来算出 bsk。

从当前页面得到 tbs 参数(假设为 ea8e71a7b73bbc181503433430 )后,在 console 里面输入

t={}
a={IN:{tbs: “ea8e71a7b73bbc181503433430”} , OUT: t}
_BSK.a(“omzVouOACqkNljzDbdOB”, a)
t.data

这里的 t.data 便是你想要的_BSK
JVwFUmcLBmUQOX99TW4YA0hdZWVqFEIHC3xWCmdYd3JrEjIOQCAoFAZYAjYoWxoDLgpzFg5iGn18KQgNdgMGB2cGAn1bbEcAUldpdTYXVw0eORVTIBlkJGASak1VPCoeAVoyOURZRTo9WjZaGXgRZyVeOg0kRU1dIFVQMAUpKxAXRWl1LhdXDR58UhZ2AXVkZQJpQxEldV9PETg5SXh5S2UKL…8ckMRLHVfTxNvZ1UaGlx4GXMWDWMafX4KExYgHQZYd1cJf1B1RABGRStleB9VQ0w4AgpnVHJyaxA2Dl86IVFXRmx1Xg9nBjNBM1gffw1pbl5JNCxfQEQyBhMRNWxAHltcZQAzS0MDBW0fEHEcZhEhQDwKZCwmNhxHcmJXGgRafwh3fzYEdQtyXg0KLlQEbCAWWDBIbDVYGAgoMnUQTRkOY1QWdwxoYWAAcDxSLyUPHBxoZFMDGV9rBH1ETXICZzgfDRAgHQZcd1cJfS8ZOnxIS2cgaQdPF1gsC1UgSA==


不同时刻即使带入相同 tbs,解出来的_BSK 也会变,不过对于发帖并没有影响。只要带入其中一个值就可以,便可以成功发帖。
具体百度是如何进行 js 加密的,得从以下代码找出逻辑。
http://www.jianshu.com/p/61fe2c7ac0b6

代码放在我的一个帖子里面, 你也可以通过打断点,在 chrome 里的 source 中找到相应文件。

回到顶部