请问这个代码是哪里错了呀?
想获取access token来着,发现总是报错,请懂的大佬帮帮忙:
import hashlib
import base64
import secrets
import qrcode
from io import BytesIO
from PIL import Image
import time
# 常量定义
APP_ID = "" # 替换为你的 APP ID
DEVICE_CODE_URL = "https://passportapi.115.com/open/authDeviceCode"
ACCESS_TOKEN_URL = "https://passportapi.115.com/open/deviceCodeToToken"
def generate_code_verifier_and_challenge():
"""生成 code_verifier 和 code_challenge"""
code_verifier = secrets.token_urlsafe(64)
code_challenge = base64.urlsafe_b64encode(hashlib.sha256(code_verifier.encode('utf-8')).digest()).decode('utf-8').rstrip('=')
return code_verifier, code_challenge
def get_device_code(code_verifier, code_challenge):
"""获取设备码和二维码内容"""
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'client_id': APP_ID,
'code_challenge': code_challenge,
'code_challenge_method': 'sha256'
}
response = requests.post(DEVICE_CODE_URL, headers=headers, data=data)
response.raise_for_status()
return response.json()
def get_access_token(uid, code_verifier):
"""获取 access_token"""
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
data = {
'uid': uid,
'code_verifier': code_verifier
}
response = requests.post(ACCESS_TOKEN_URL, headers=headers, data=data)
response.raise_for_status()
return response.json()
def show_qrcode_image(qrcode_content):
"""显示二维码图像"""
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(qrcode_content)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img_byte_arr = BytesIO()
img.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
image = Image.open(BytesIO(img_byte_arr))
image.show()
def main():
# 1. 生成 code_verifier 和 code_challenge
code_verifier, code_challenge = generate_code_verifier_and_challenge()
print(f"Generated code_verifier: {code_verifier}")
# 2. 获取设备码和二维码信息
device_code_data = get_device_code(code_verifier, code_challenge)
print(f"Device Code Data: {device_code_data}")
uid = device_code_data['data']['uid']
# 3. 显示二维码
show_qrcode_image(device_code_data['data']['qrcode'])
# 4. 等待用户手动确认
input("请使用 115 客户端扫描二维码并确认登录,然后按 Enter 键继续...")
# time.sleep(30)
# 5. 尝试获取 access_token
print(f"Code Verifier: {code_verifier}")
print(f"Code Challenge: {code_challenge}")
try:
print("开始获取")
token_data = get_access_token(uid, code_verifier)
print(f"Access Token Data: {token_data}")
if 'data' in token_data and 'access_token' in token_data['data']:
print(f"Access Token: {token_data['data']['access_token']}")
else:
print("Access Token not found in response.")
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
main()
paul
回复含违规内容
广东 广州
只看该作者
举报
115675115
将code_challenge = base64.urlsafe_b64encode(hashlib.sha256(code_verifier.encode('utf-8')).digest()).decode('utf-8').rstrip('=')
改为code_challenge = base64.b64encode(hashlib.sha256(code_verifier.encode('utf-8')).digest()).decode('utf-8')