/1dreamGN/Blog

1dreamGN

selenium模拟微信UA请求踩的坑

8
2025-01-18
selenium模拟微信UA请求踩的坑

某天一朋友分享给我一个url,他让我写一个python脚本批量动态模拟请求,打开看了一下,网站首先先校验UA头是否为微信,用burp打开抓包看一下,觉得就是改个UA的事情,但是他又说后台是会记录请求IP、UA、设备ID等各种记录,需要每次不同才行,那我心想着改个随机微信UA再添加个代理池功能得了,于是开始操作。

首先我先只在火狐上面用插件模拟UA头看是否能绕过,用的插件是User-Agent Switcher and Manager 直接选择WeChat的UA,点击应用,访问url,成功访问(这里就不上图了,涉及隐私)。

既然成功了,那我就开始写脚本,用python的selenium模块模拟浏览器操作。

xxx省略代码,我用的是Chrome,结果第一个坑就来了,这个url只能访问http,结果模拟一直跳转到https,在网上搜各种资料都不行,无奈我让朋友再给我一个支持https的链接,作罢。

接下来又来了一个坑,UA头在脚本打印出的结果是已经替换,但是浏览器打开我用f12查看的时候并没有更改成功,包括抓包也是,我想着奇了怪了,明明我的写法是对的呀。

    # 配置 headers
    new_ua = random.choice(ua_list)  # 使用随机微信 UA
    # 配置 Firefox 选项
    chrome_options = Options()
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.set_preference("general.useragent.override", new_ua)  # 设置 UA

忘了说了,这个站点判断如果是微信UA,还会动态请求其他url,都没有被替换UA,一时间头都大了。

然后我想着用seleniumwire的interceptor替换请求头,在终端打印后显示替换成功,抓包也显示替换成功,但是浏览器f12还是没能替换成功,我都无奈了。然后把下面的这段代码注释了。

  # 设置请求头
    def interceptor(request):
        # if request.url.startswith('https://'):
        #     request.url = request.url.replace('https://', 'http://')  # 将 HTTPS 改为 HTTP
        # 清理重复的请求头(统一转换为小写)
        for key in list(request.headers.keys()):
            if key.lower() in headers:  # 如果请求头已存在,先删除
                del request.headers[key]
        # 添加自定义请求头
        for key, value in headers.items():
            request.headers[key] = value

    driver.request_interceptor = interceptor

改来改去又有很多坑,我觉得代码没问题,仔细想了想,之前用了火狐加插件就可以模拟,我为何不用火狐的driver来模拟呢,将chrome替换成火狐,结果莫名其妙的成功了。

合着之前踩坑改的代码都可以删了,对此为何换个浏览器模拟就能成功,我也没去深究。我在网上搜并没有更换浏览器模拟之类的解决方法,这次也是机缘巧合柳暗花明又一村,哈哈哈。