使用不记名令牌和刷新令牌从 api 请求数据

时间:2021-06-21 06:19:56

标签: python api bearer-token

我仍然是网络抓取的初学者,我正在尝试从 API 中提取数据,但问题是它有一个不记名令牌,并且该令牌在 5 到 6 小时后更改,因此我必须再次访问该网页并再次复制令牌,所以有没有办法提取数据而无需再打开网页并再次复制令牌

我在网络请求中也发现了此信息,因为有人告诉我可以使用 refresh_token 进行访问,但我不知道该怎么做

缓存控制:无缓存, 连接:保持连接, 内容长度:177, 内容类型:应用程序/json;字符集=UTF-8, 饼干:dhh_token=;刷新令牌=; _hurrier_session=81556f54bf555a952d1a7f780766b028, 错误:1

import pandas as pd
from time import sleep


def make_request():
    headers = {
        'Connection': 'keep-alive',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'sec-ch-ua': '^\\^',
        'Accept': 'application/json',
        'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJMdXRiZlZRUVZhWlpmNTNJbGxhaXFDY3BCVTNyaGtqZiIsInN1YiI6MzEzMTcwLCJleHAiOjE2MjQzMjU2NDcsInJvbCI6ImRpc3BhdGNoZXIiLCJyb2xlcyI6WyJodXJyaWVyLmRpc3BhdGNoZXIiLCJjb2QuY29kX21hbmFnZXIiXSwibmFtIjoiRXNsYW0gWmVmdGF3eSIsImVtYSI6ImV6ZWZ0YXd5QHRhbGFiYXQuY29tIiwidXNlcm5hbWUiOiJlemVmdGF3eUB0YWxhYmF0LmNvbSIsImNvdW50cmllcyI6WyJrdyIsImJoIiwicWEiLCJhZSIsImVnIiwib20iLCJqbyIsInEyIiwiazMiXX0.XYykBij-jaiIS_2tdqKFIfYGfw0uS0rKmcOTSHor8Nk',
        'sec-ch-ua-mobile': '?0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
        'Content-Type': 'application/json;charset=UTF-8',
        'Origin': 'url',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Dest': 'empty',
        'Referer': 'url',
        'Accept-Language': 'en-US,en;q=0.9,ar-EG;q=0.8,ar;q=0.7',
        'dnt': '1',
    }

    
    data = {
        'status': 'picked'
    }
    response = requests.post('url/api', headers=headers, json=data)
    print(response.text)

    return json.loads(response.text)


def extract_data(row):
    data_row = {
        'order_id': row['order']['code'],
        'deedline': row['order']['deadline'].split('.')[0],
        'picked_at': row['picked_at'].split('.')[0],
        'picked_by': row['picked_by'],
        'processed_at': row['processed_at'],
        'type': row['type']
    }
    return data_row



def periodique_extract(delay):
    extract_count = 0
    while True:
        extract_count += 1
        data = make_request()
        if extract_count == 1 :
            df = pd.DataFrame([extract_data(row) for row in data['data']])
            df.to_csv(r"C:\Users\di\Desktop\New folder\a.csv", mode='a')
        else:
            df = pd.DataFrame([extract_data(row) for row in data['data']])
            df.to_csv(r"C:\Users\di\Desktop\New folder\a.csv", mode='a',header=False)
        print('exracting data {} times'.format(extract_count))
        sleep(delay)


periodique_extract(60)

#note: as the website is track live operation so I extract data every 1 min ```

1 个答案:

答案 0 :(得分:0)

有时这些令牌需要设置 JavaScript 执行并自动添加到 API 请求中。这意味着您需要在实际运行 javascript 的内容中打开页面,以获取令牌。 IE。实际上是在浏览器中打开页面。

一种解决方案可能是使用 Selenium 或 Puppeteer 之类的东西在令牌过期时打开页面以获取新令牌,然后将其提供给脚本。但这取决于页面上的具体情况,没有链接就很难说正确的解决方案。但是如果你在浏览器中打开页面,复制令牌,然后运行你的脚本的方法有效,那么这很可能也有效。