使用urllib向Watch2Gether API发送正确请求及故障排查求助
问题诊断与修复方案
核心前置错误
先列出你代码里的几个基础逻辑错误:
- 变量名错误:第一版代码构造
Request时用了未定义的url1变量,你定义的接口地址变量是url - 请求格式不匹配:你设置了
Content-Type: application/json请求头,但实际发送的是urllib.parse.urlencode生成的表单格式数据,服务器收到格式不匹配的内容自然返回400错误 - 全局变量误用:你用全局列表
items存储所有生成的streamkey,返回时固定取items[0]也就是第一次创建的房间key,所以每次打开都是旧房间 - 接口调用错误:你调用
sync_update接口是同步房间播放进度的,自然只会重置当前视频播放,不会添加新视频到列表
三个疑问的解答
1. 正确的请求构造方式
创建独立新房间的请求(预加载指定视频)
如果按文档要求用json格式请求,构造逻辑如下:
def create_room(link: str): import json import urllib.request url = "https://w2g.tv/rooms/create.json" data = { 'w2g_api_key': '你的API_KEY', 'share': link, 'bg_color': '#00ff00', 'bg_opacity': '50' } headers = { 'Accept': 'application/json', 'Content-Type': 'application/json' } # 把字典转成json字符串再编码为字节流 req_data = json.dumps(data).encode('utf-8') req = urllib.request.Request(url, req_data, headers) with urllib.request.urlopen(req) as resp: res = json.loads(resp.read()) # 直接返回当前新房间的streamkey,不要存全局列表复用旧房间 return res['streamkey']
向现有房间添加新视频
调用W2G对应播放列表添加接口,按接口要求构造对应格式的请求即可,不需要接收响应的话发送完请求就可以结束流程。
2. 未传要求的请求头也能请求成功的原因
W2G的API实际同时兼容application/json和application/x-www-form-urlencoded两种请求格式,文档要求json只是推荐用法。
你直接用urlopen发送urlencode编码的表单数据时,urllib会自动给请求加上Content-Type: application/x-www-form-urlencoded的头,服务器能正常解析表单数据,所以请求成功。
请求头的作用是告知服务器当前请求的元信息:比如你发的内容是什么格式、你能接受什么格式的返回、你的身份认证信息、客户端类型等,服务器会根据请求头的内容决定如何处理你的请求。
3. 修复urllib.request.Request的400错误
有两种可行方案:
- 方案1(符合文档要求的json格式):把请求数据用
json.dumps()转成json字符串编码后再发送,保持现有Content-Type: application/json头不变,同时修正之前的变量名错误 - 方案2(表单格式):把请求头里的
Content-Type改成application/x-www-form-urlencoded,保持现有的urlencode编码逻辑不变
内容的提问来源于stack exchange,提问作者rndnewbiee22
相关产品推荐
相关产品推荐

