请问这个代码是哪里错了呀?

回复 已回复2 星标
更多

请问这个代码是哪里错了呀?


Access Token Data: {'state': 0, 'code': 40140113, 'errno': 40140113, 'data': {}, 'message': 'code_verifier 验证失败', 'error': 'code_verifier 验证失败'}
Access Token not found in response.


想获取access token来着,发现总是报错,请懂的大佬帮帮忙:


import requests
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()

将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')

1# 03-26 06:49

不能去除等号,不能有特殊字符例如-和_,输出的时候循环验证一下,有的话重新输出

此帖已被锁定,无法回复
新窗口打开 关闭