无法使用 Python 请求库从 Web 服务器获取时间(状态代码 401)

Unable to Fetch Time from Web Server using Python Requests Library (Status Code 401)

提问人:Amber Sonlit 提问时间:11/10/2023 最后编辑:Amber Sonlit 更新时间:11/10/2023 访问量:30

问:

我目前正在开发一个 Python 脚本,该脚本不断从 Web 服务器获取当前时间并打印出来。但是,我遇到了身份验证问题,导致 401 状态代码。我提供了所有必要的标头和访问令牌,但响应指示存在身份验证问题。网络服务器的链接:http://cyber.cs.du.edu/timekeeper/(这是我的大学为这项任务而制作的假设网站)

from datetime import datetime
import time

def get_current_time():
    try:
        time_api_url = "http://cyber.cs.du.edu/timekeeper/api/v1/time"
        headers = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpcCI6IjE3Mi4xNy4wLjEiLCJybmQiOiIxMWEzN2Q1YTQ3ZTQxY2ViNzMwZWEyNDg5N2MzOWMwZTUwM2QzNDU1NGQ5MjFjNmE0NGY2NGJlMDI5OTkxYTU5IiwiYWdlbnQiOiJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE5LjAuMC4wIFNhZmFyaS81MzcuMzYiLCJleHAiOjE2OTk1NTM4NTJ9.fFIpbEmAhotro4MgL0GTSbYrtl--t92MTFKnNX-tnfw',
            'Connection': 'keep-alive',
            'Cookie': '_cap=344691521684862355; _fbp=fb.1.1684862355417.17791420; _attrb=%22293b6266-57cb-4269-93ef-a6308b74f593%22; _scid=8509b8d8-90ea-4e40-840d-6f19637fbe27; _ga_S2V8B3QG10=GS1.2.1693412411.17.0.1693412411.0.0.0; _gcl_au=1.1.1900453194.1694548891; _ga_EQYTG2FRZB=GS1.1.1694643835.4.1.1694643921.0.0.0; _ga_3R9779E9CE=GS1.1.1697141496.2.1.1697141511.0.0.0; _ga_YD6NSK449L=GS1.1.1698702601.3.0.1698702602.59.0.0; _ga_G3QL5ZJ7V2=GS1.1.1698706614.2.1.1698706721.60.0.0; cebs=1; _gid=GA1.2.7375447.1699384534; _ga_KDCJP7WQR2=GS1.2.1699384534.32.1.1699384541.0.0.0; _sctr=1%7C1699340400000; cebsp_=3; _scid_r=8509b8d8-90ea-4e40-840d-6f19637fbe27; _ce.s=v~cdafb05ef8918fcf3bc3bb022cd2ae51233ea0de~lcw~1699393884317~vpv~3~v11.cs~348336~v11.s~690beb20-7db7-11ee-8ffb-e3470a664e62~v11.sla~1699393884364~gtrk.la~loov8lm7~v11.send~1699393884316~lcw~1699393884366; _ga_7KPJG812Y3=GS1.1.1699394129.1.1.1699394621.0.0.0; _ga=GA1.2.1823087093.1684861047; _ga_CMGRJVENZ2=GS1.1.1699484166.33.0.1699484166.60.0.0; _ga_0F4BY0DEFX=GS1.1.1699484166.5.0.1699484166.0.0.0; _ga_RPN0H7RH0P=GS1.2.1699484369.203.1.1699484382.0.0.0; bt=1699553552.3100853; _acdk=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0cyI6MTY5OTU1MzU1MiwiZXhwIjoxNjk5NTUzNTYyLCJ0b2tlbiI6ImV5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpwY0NJNklqRTNNaTR4Tnk0d0xqRWlMQ0p5Ym1RaU9pSXhNV0V6TjJRMVlUUTNaVFF4WTJWaU56TXdaV0V5TkRnNU4yTXpPV013WlRVd00yUXpORFUxTkdRNU1qRmpObUUwTkdZMk5HSmxNREk1T1RreFlUVTVJaXdpWVdkbGJuUWlPaUpOYjNwcGJHeGhMelV1TUNBb1RXRmphVzUwYjNOb095QkpiblJsYkNCTllXTWdUMU1nV0NBeE1GOHhOVjgzS1NCQmNIQnNaVmRsWWt0cGRDODFNemN1TXpZZ0tFdElWRTFNTENCc2FXdGxJRWRsWTJ0dktTQkRhSEp2YldVdk1URTVMakF1TUM0d0lGTmhabUZ5YVM4MU16Y3VNellpTENKbGVIQWlPakUyT1RrMU5UTTROVEo5LmZGSXBiRW1BaG90cm80TWdMMEdUU2JZcnRsLS10OTJNVEZLbk5YLXRuZncifQ.lkFT0blGLG50DJy_jfQUFuUdHDhnId1WBBk68vIQbeM',
            'Host': 'cyber.cs.du.edu',
            'Referer': 'http://cyber.cs.du.edu/timekeeper/',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest',
            'X-Timekeeper-Channel': 'Web'
        }

        response = requests.get(time_api_url, headers=headers)

        print(response)

        if response.status_code == 200:
            try:
                current_time = response.json().get('current_time')
                formatted_time = datetime.utcfromtimestamp(current_time).strftime('%Y-%m-%d %H:%M:%S')
                print(formatted_time)
            except ValueError:
                print("Invalid JSON response")

        else:
            print(f"Error: {response.text}")

    except Exception as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    try:
        while True:
            get_current_time()
            time.sleep(1)  # Adjust the sleep interval as needed
    except KeyboardInterrupt:
        print("Script stopped.")

我正在使用 Python requests 库向时间 API 发出 GET 请求。 我已经包含了必要的标头,并且我确定访问令牌和 cookie 是正确的。 但是,我一直收到 401 状态代码,并显示错误“未经授权”。

我已经仔细检查了访问令牌和 cookie 的正确性,并确保访问令牌具有所需的范围。

使用正确的访问令牌和 Cookie,脚本应成功向时间 API 端点发出请求并打印当前时间。

尽管提供了正确的访问令牌,但可能导致 401 未授权错误的原因是什么?我可能缺少任何其他标头或参数吗?

身份验证 http 安全性 python 请求

评论


答:

0赞 Andrej Kesely 11/10/2023 #1

要从服务器获得正确的结果,您可以使用以下示例:

import re

import requests

url = "http://cyber.cs.du.edu/timekeeper/api/v1/time"

headers = {
    "X-TimeKeeper-Channel": "Web",
}

with requests.session() as s:
    html_text = s.get("http://cyber.cs.du.edu/timekeeper/").text

    token = re.search(r'__window_token = "([^"]+)', html_text).group(1)
    headers["Authorization"] = f"Bearer {token}"
    s.headers.update(headers)
    response = s.get(url).json()

    print(response)

指纹:

{'day': 9, 'hour': 21, 'microsecond': 754999, 'minute': 41, 'month': 11, 'second': 8, 'year': 2023}