提问人:Amber Sonlit 提问时间:11/10/2023 最后编辑:Amber Sonlit 更新时间:11/10/2023 访问量:30
无法使用 Python 请求库从 Web 服务器获取时间(状态代码 401)
Unable to Fetch Time from Web Server using Python Requests Library (Status Code 401)
问:
我目前正在开发一个 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 未授权错误的原因是什么?我可能缺少任何其他标头或参数吗?
答:
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}
评论