Python脚本发送POST请求获取下载链接返回失败求助
我想用Python脚本向网站发送POST请求获取下载链接,但请求返回:
{"status":"ok","c_status":"FAILED","mess":"An error has occurred. Please try again! "}
但在Firefox开发者工具中重新发送相同请求时,能得到包含下载链接的成功响应:
{"status":"ok","mess":"","c_status":"CONVERTED","vid":"F_HoMkkRHv8","title":"Cake - The Distance (Official Video)","ftype":"mp3","fquality":"128","dlink":"https://dl143.y2mate.com/?file=M3R4SUNiN3JsOHJ6WWQ3aTdPRFA4NW1rRVJIOGxQSXZuWjV4OHhnbVNvOUZ0Wmt1MmVlbGFPWkpLSzRNeEl1dVd1aGQ4VHZYUDkyYlkwbVB2NVFqZldPQTQ5NWcvRzNwNm9FMVRkeHpVMU9xdmV1enhYUWtyMUt3TFA3cktwQlpRSHh3a1doMWkyaWUzS0tTdmhEMzdsNk00VWliZkMwWXR5OENNUENOb01rZWpUdVNOcWV4ZzlZV3UzdWI0TTg9"}
我试过添加或移除请求头,结果都一样,希望有人能指出问题所在。我的Python代码如下:
import requests url = "http://yt1s.com/api/ajaxConvert/convert" header = { "Host": "yt1s.com", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate, br", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Content-Length": "94", "Origin": "null", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "Connection": "keep-alive", "Cookie": "_ga=GA1.2.1571820535.1667494818; _gid=GA1.2.1382638961.1668295256; prefetchAd_3897490=true; prefetchAd_4425332=true; AdskeeperStorage=%7B%220%22%3A%7B%22svspr%22%3A%22https%3A%2F%2Fyt1s.com%2Fen422%22%2C%22svsds%22%3A1%7D%2C%22C1351947%22%3A%7B%22page%22%3A1%2C%22time%22%3A1668295270300%7D%7D", } data = 'vid=F_HoMkkRHv8&k=0%2Be9UUPRJ7ryRtXVXps4nRRiPRF1HVSf5l7v3sVU68OOkTWDWvLn%2FHeNOCGBh7Z%2B3Xo%3D' r = requests.post(url, headers= header, data = data) print (r.text) with open('output.txt', 'w') as output: output.write(str(r.text))
- 数据参数格式错误:你在
data里使用了HTML实体编码的&作为参数分隔符,实际POST请求需要用原始的&。将data中的&替换为&即可修复这个问题。 - 请求头冗余或错误:
- 不要手动设置
Content-Length,requests库会自动计算并添加该字段,手动设置的长度若与实际数据长度不符会导致请求失败。 Origin字段设置为null不正确,应改为与浏览器请求一致的https://yt1s.com。Sec-Fetch-*系列头是浏览器自动生成的,手动设置可能不匹配服务器预期,建议移除这些头,只保留必要的User-Agent、Accept、Accept-Language、Content-Type、Cookie、Host、Origin。
- 不要手动设置
- URL协议不匹配:目标网站使用HTTPS协议,你的请求用了HTTP,可能会被重定向或拦截,将URL改为
https://yt1s.com/api/ajaxConvert/convert。 - Cookie时效性问题:Cookie中的
_ga、_gid等字段有有效期,你使用的是旧Cookie,可能已经失效。建议从当前浏览器开发者工具中复制最新的Cookie替换到代码里。
修改后的示例代码:
import requests url = "https://yt1s.com/api/ajaxConvert/convert" header = { "Host": "yt1s.com", "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Origin": "https://yt1s.com", "Connection": "keep-alive", # 替换成你当前浏览器的最新Cookie "Cookie": "_ga=GA1.2.xxx.xxx; _gid=GA1.2.xxx.xxx; prefetchAd_3897490=true; prefetchAd_4425332=true; AdskeeperStorage=%7B%220%22%3A%7B%22svspr%22%3A%22https%3A%2F%2Fyt1s.com%2Fen422%22%2C%22svsds%22%3A1%7D%2C%22C1351947%22%3A%7B%22page%22%3A1%2C%22time%22%3A1668295270300%7D%7D", } data = 'vid=F_HoMkkRHv8&k=0%2Be9UUPRJ7ryRtXVXps4nRRiPRF1HVSf5l7v3sVU68OOkTWDWvLn%2FHeNOCGBh7Z%2B3Xo%3D' r = requests.post(url, headers=header, data=data) print(r.text) with open('output.txt', 'w') as output: output.write(r.text)
内容的提问来源于stack exchange,提问作者Taylor

