Discord API端点调用requests库失败,浏览器重放XHR却正常
针对你遇到的问题,以下是几个关键的修复点和对应的解决方案:
1. 令牌有效性与格式错误
你的代码中'authorization': 'TOKEN'是占位符,必须替换为真实的Discord令牌:
- 如果是机器人账号,格式应为
'Bot YOUR_BOT_TOKEN' - 如果是用户令牌(注意:使用用户令牌自动化操作违反Discord服务条款,可能导致账号封禁),直接填入完整令牌字符串
同时要确保令牌未过期、权限包含添加关系的相关权限。
2. 手动设置Content-Length导致的不匹配
requests库会自动计算并设置Content-Length请求头,你手动指定的'content-length': 2可能与实际请求体长度不符,引发服务器验证失败,必须删除这个头。
3. 请求体格式错误
你传递的json='{}'是字符串类型,而requests的json参数需要接收字典对象。即使空对象是API允许的,字符串格式也会导致请求解析失败,应改为json={}。
4. 请求头大小写不匹配
代码中的'referrer-Policy'需要改为'Referrer-Policy'(首字母大写),Discord服务器对请求头大小写敏感,错误的格式会影响验证。
5. 可选:x-super-properties的兼容性问题
这个头用于识别客户端环境,你当前的取值对应Windows Brave浏览器,如果你的请求环境与该信息不匹配,可能被服务器拦截。可以先尝试去掉这个头,若依然失败再生成匹配当前环境的Super Properties值。
修正后的代码
import requests # 替换为你的真实令牌 TOKEN = "YOUR_ACTUAL_TOKEN" # 替换为目标用户ID USER_ID = "TARGET_USER_ID" headers = { 'accept': '*/*', 'accept-language': 'en-US,en;q=0.9', 'authorization': TOKEN, 'content-type': 'application/json', 'sec-ch-ua': '\'Not_A Brand\';v=\'99\', \'Brave\';v=\'109\', \'Chromium\';v=\'109\'', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '\'Windows\'', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'sec-gpc': '1', 'x-context-properties': 'eyJsb2NhdGlvbiI6IlVzZXIgUHJvZmlsZSJ9', 'x-debug-options': 'bugReporterEnabled', 'x-discord-locale': 'en-US', # 若去掉后失败,可恢复该行并确保值匹配当前环境 # 'x-super-properties': 'eyJvcyI6IldpbmRvd3MiLCJicm93c2VyIjoiQ2hyb21lIiwiZGV2aWNlIjoiIiwic3lzdGVtX2xvY2FsZSI6ImVuLVVTIiwiYnJvd3Nlcl91c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEwOS4wLjAuMCBTYWZhcmkvNTM3LjM2IiwiYnJvd3Nlcl92ZXJzaW9uIjoiMTA5LjAuMC4wIiwib3NfdmVyc2lvbiI6IjEwIiwicmVmZXJyZXIiOiIiLCJyZWZlcnJpbmdfZG9tYWluIjoiIiwicmVmZXJyZXJfY3VycmVudCI6IiIsInJlZmVycmluZ19kb21haW5fY3VycmVudCI6IiIsInJlbGVhc2VfY2hhbm5lbCI6InN0YWJsZSIsImNsaWVudF9idWlsZF9udW1iZXIiOjE3MTYyMSwiY2xpZW50X2V2ZW50X3NvdXJjZSI6bnVsbH0=', 'Referrer-Policy': 'strict-origin-when-cross-origin' } r = requests.put(f'https://discord.com/api/v9/users/@me/relationships/{USER_ID}', json={}) match r.status_code: case 204: print('Added a user') case _: print(f'Unexpected error: {r.status_code} | {r.text}')
额外注意事项
- 优先使用机器人账号操作,避免使用用户令牌违反Discord服务条款
- 确保机器人账号已被授予
CREATE_INSTANT_INVITE等相关权限,且有权访问目标用户所在的服务器 - 若问题仍存在,可先用Postman等工具直接测试API请求,排除代码层面的问题
内容的提问来源于stack exchange,提问作者byte
相关产品推荐
相关产品推荐

