利用refresh的方法获得Authorization,实现爬虫

Intro: 一些废话

大家都知道,有的网站进行post请求的时候需要带上参数,确认登录状况。之前一直碰到的情况是Headers里面需要Cookie参数,同时payload中带上一串加密代码,一般是bs64加密。

最近进行爬虫的时候发现了Authorization这种情况,发起请求时不带Cookie,而是在headers里面带上Authorization参数,json data中是请求参数。以往碰到需要JS加密需要逆向解密的爬虫,我都是急流勇退选择转用selenium了,然而这次发现久不用selenium,它竟然升级了,变得比较复杂。同时也因为Authorization这种授权的方式导致加载Cookie进行登录的方式失效,利用Selenium更需要滑动验证码一连串复杂指令,还是requests更加方便。

分析思路

首先是发现Authorization这个参数可以使用一段时间。这个无需多言,把抓包到的headers参数全部带上,不要偷懒就能运行一段时间。大概15分钟之后,token失效,这时返回的内容为“token expired”。

这时候我在网页端随意点选了一个(注意不是刷新页面!),让动态页面加载更新的东西从而生成新的Authorization,然后我发现抓包界面显示了一个“refresh”的请求,这就是突破口!

多说一句,这个refresh请求需要一些耐心,因为网页端很难自然refresh,所以最好是先写一段代码用原始的有效的Authorization运行,直到它返回token expired,再去网页端点选,创造捕捉refresh的条件。

如图所示就是这个refresh请求的内容,这里终于用到了Cookie

它的返回值为:

{"refresh_token":"...","token":"..."}

经过尝试和分析,可知refresh_token是用于payload发起下一次refresh请求,而token则是用于构造Authorization参数

验证猜想

写了一串代码来验证我的思路对了没:

# 测试refresh参数

import requests
import json
from lxml import etree


def get_token(token_refresh):
    url = 'https://.../token/refresh'
    # headers参数全部用浏览器复制的,不知道这样的爬虫会不会有法律问题,所以我都省略了,请见谅
    headers = {
        'authority': 'passport. ... .com',
        'method': 'POST',
        'path': '/token/refresh',
        'scheme': 'https',
        'Accept': 'application/json',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Content-Length': '737',
        'Content-Type': 'application/json',
        'Cookie': '...',
        'Origin': 'https://analytics. ... .com',
        'Referer': 'https://analytics. ... .com/',
        'Sec-Ch-Ua': '...',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Ch-Ua-Platform': 'Windows',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'User-Agent': '...',
    }
    data = {
        "from": "analytics",
        "client_id": "...",
        "response_type": "TOKEN",
        "flag": "...",
        "refresh_token": token_refresh, }     # 这个是传入的参数
    res = requests.post(url=url, headers=headers, json=data)
    content = etree.HTML(res.content)
    # print(content)
    content_s = etree.tostring(content).decode().replace('\n', '').replace('<html><body><p>', '').replace(
        '</p></body></html>', '').replace('b{', '{').replace(' ', '')
    parse = json.loads(content_s)
    print(content_s)
    token = parse['token']
    token_refresh_forNext = parse['refresh_token']
    print(token)
    print(token_refresh_forNext)
    return token, token_refresh_forNext


if __name__ == "__main__":
    token,token_refresh = get_token('第一个token传入浏览器复制的')
    get_token(token_refresh)

运行成功没有报错,也成功打印了新的token和refresh_token

另外一个惊喜发现就是refresh_token也是之前的有效Authorization中能提取出的,就能解决这个函数传入的第一个参数的来源了。

分析思路 续

后面我写完整代码的时候,发现有时候对refresh发起请求也会报错,错误代码是:{errcode: "30405"}。这次还是依葫芦画瓢在网页端点选一次(是的,浏览器里那个页面我一直没关),这次捕捉到了一个全新的页面:checksession(如图)

可以看到是一个get请求,需要加载json data,但里面不像refresh一样需要refresh_token,response里生成refresh_token和token,这点同refresh页面。小小总结一下就是这个checksession也能用于生成token,而且限制变少了,携带的变量参数只有一个可能会更新的Cookie参数。

问题解决

这样一来,JS逆向解密的过程就被简化为自行请求refresh,得到新生成的token,并构造新的Authorization,实现爬虫了,完美!

保留声明

弱弱地说一句,因为担心逆向爬虫会有legal问题,所以我就不放是哪个网站了,因此有些说不清楚的问题欢迎大家来交流!此文章仅提供思路!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现爬虫自动获取和过期自动更新的cookie,你可以按照以下步骤操作: 1. 使用一个库,比如`requests`来发送HTTP请求。在发送请求时,可以使用`Session`对象来自动处理cookie的保存和管理。 2. 首先,创建一个`Session`对象,并发送一个登录请求来获取初始的cookie。你可以通过在请求头中设置合适的参数,比如用户名和密码,来实现登录。 3. 一旦登录成功并获取到cookie,`Session`对象会自动保存这些cookie,并在后续的请求中自动发送。 4. 为了处理cookie的过期问题,你可以在每次请求之前检查cookie的有效期。如果cookie已过期,你可以实现一个函数来自动重新获取新的cookie。 5. 在重新获取cookie时,你可以通过发送另一个登录请求或者使用其他方式来获取新的cookie。一旦获取到新的cookie,更新`Session`对象中的cookie,并继续后续的请求。 下面是一个示例代码,演示了如何使用`requests`库和`Session`对象来实现自动获取和更新cookie: ```python import requests session = requests.Session() def login(): # 发送登录请求并获取初始cookie login_data = {'username': 'your_username', 'password': 'your_password'} response = session.post('http://example.com/login', data=login_data) response.raise_for_status() def check_cookie_expiry(): # 检查cookie是否过期 if 'expires' in session.cookies: # 判断cookie是否过期的逻辑 return True else: return False def refresh_cookie(): # 获取新的cookie login() def make_request(): # 发送请求前检查cookie是否过期 if check_cookie_expiry(): refresh_cookie() response = session.get('http://example.com/protected_page') response.raise_for_status() # 处理响应 # 登录获取初始cookie login() # 发送请求 make_request() ``` 在上面的示例中,`login()`函数用于发送登录请求并获取初始的cookie。`check_cookie_expiry()`函数用于检查cookie是否过期。`refresh_cookie()`函数用于重新获取新的cookie。`make_request()`函数用于发送请求前检查cookie是否过期,并在需要时刷新cookie。你可以根据自己的需求修改代码,以适应不同的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值