python - 使用 python 请求进行 Web 抓取的 JWT 不记名授权
问题描述
这是我在 StackOverflow 上的第一篇文章,请多多包涵。
我正在编写一个通过 REST API 发出请求然后返回值的函数,但是我在身份验证部分遇到了问题。
身份验证是 JWT 不记名令牌,是检索数据所必需的(尽管我不需要登录,因此在这方面它是未经授权的 API)。
def get__price(jwt, cookie):
headers = {
'authority': 'www.dextools.io',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'accept': 'application/json',
'authorization': f'Bearer {jwt}', # HERE IS THE VAR I NEED
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'content-type': 'application/json',
'sec-gpc': '1',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://www.dextools.io/app/uniswap/pair-explorer/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852',
'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
#'cookie': f'__cfduid={cookie}; ai_user=hizb^|2021-04-03T00:16:45.460Z; ai_session=5vAmv^|1617443356577.045^|1617443356577.045',
}
params = (
('v', '1.9.1'),
('pair', '0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852'),
('ts', '1617443384-0')
)
try:
response = requests.get('https://www.dextools.io/api/uniswap/1/pairexplorer', headers=headers, params=params)
except Exception as e:
print(f"ERROR: {e}")
我试图向网站发出请求https://www.dextools.io
并获取任何 JWT 令牌,但使用 Sessions 似乎不起作用。
也许它并不重要,但是当我转到包含我的 eyJxxxxxxxxxxxxxxx 令牌的地方时,我可以在浏览器上找到这个 JWT 令牌developer tools > Local Storage > (website url) > t
。t
任何帮助将不胜感激,谢谢。
解决方案
您好,看到网站的网络请求,我可以通过下面的代码获取数据,但如果网站阻止它,您可能需要获取新密码。下面生成的 jwt 令牌有效期为 6 到 8 分钟,您可以重新使用jwt 令牌直到那个时候,然后您需要通过调用该登录 url 来获取新的 jwt 令牌,如下面的代码中提到的。
代码:
import time
import requests
s = requests.session()
headersdict = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'Referer': 'https://www.dextools.io/app/uniswap/pair-explorer/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852',
'Origin': 'https://www.dextools.io'}
s.headers.update(headersdict)
payload = {"id": "anyone", "password": "TfY6WC6F4L4+S6xwvPo8QoHlYZ50rK2DrJnEAWBoMqU="}#you can use this password to generate new jwt tokens if it blocks you check network requests and get this password again but i dont think they will block it that way.
s1 = s.post("https://www.dextools.io/back/user/login", json=payload)
jwt = s1.headers["X-Auth"]
headersdict = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'Referer': 'https://www.dextools.io/app/uniswap/pair-explorer/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852',
'Origin': 'https://www.dextools.io',
'authorization': f'Bearer {jwt}'}
s.headers.update(headersdict)
params = (
('v', '1.9.1'),
('pair', '0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852'),
('ts', f'{time.time()}-0')
)
response = s.get('https://www.dextools.io/api/uniswap/1/pairexplorer', params=params)
print(response.text)
如果您有任何问题,请告诉我:)
推荐阅读
- python - 如何在 Python-Django 框架中解决未定义的变量模型错误
- css - 如何在小型设备上呈现 Bootstrap 4 表?
- flutter - Flutter auth ui facebook sdk问题
- python - scipy插值的问题
- android - 为 Google Play 多人游戏创建不同的房间
- google-cloud-platform - 子文件夹的 GCS 对象更改通知
- python - 是否有可能获得 Spacy 命名实体识别的置信度分数
- angular - 我应该使用 null 作为数字的值吗 - Angular
- node.js - 如何在nodejs中promise类型的函数中完成.map函数后返回对象
- php - 调用Factory时Laravel记录被删除