如何通过Python向TinEye发送带图片的POST请求?
解决TinEye图片上传POST请求400错误的调试指南
400错误基本是请求格式不合法,给你几个排查方向和修正方案:
核对Multipart表单的参数名
TinEye对表单字段名要求很严,抓包看到的上传字段名是什么就必须用什么——网页端一般是image,别瞎改成file或者别的。要是抓包发现还有其他必填参数(比如csrf令牌),也得一并塞进fields里。别瞎改Content-Type
用MultipartEncoder的时候,它会自动生成带正确boundary的Content-Type,手动写反而容易错。其他请求头里,User-Agent和Referer得带上,不然服务器可能直接拒掉你的请求,比如用Chrome的UA就行。文件必须用二进制模式读
上传图片时,得用open("your_image.jpg", "rb"),用文本模式打开的话,文件内容会乱码,服务器解析不了,直接返回400。修正后的代码示例(网页端上传)
先拿session获取csrf令牌,再构造请求:import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from bs4 import BeautifulSoup # 用session维持会话,自动处理cookie session = requests.Session() index_res = session.get("https://tineye.com/") # 从页面里提取csrf令牌 soup = BeautifulSoup(index_res.text, "html.parser") csrf_token = soup.find("input", {"name": "csrfmiddlewaretoken"})["value"] # 构造multipart表单 encoder = MultipartEncoder( fields={ "csrfmiddlewaretoken": csrf_token, "image": ("test.jpg", open("test.jpg", "rb"), "image/jpeg") } ) # 设置请求头,只需要指定Content-Type和Referer、UA headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Referer": "https://tineye.com/", "Content-Type": encoder.content_type } # 发送请求 res = session.post("https://tineye.com/search", headers=headers, data=encoder) print(res.status_code) print(res.text)排查反爬限制
TinEye网页端有反爬,光带csrf还不够,要是频繁请求可能会触发验证,得确保你的请求和正常浏览器行为一致——比如不要一下子发太多请求,UA别太奇怪。别搞混网页端和API接口
要是用官方API,地址是https://api.tineye.com/rest/search,得带api_key参数,字段要求和网页端不一样,别把网页端的参数直接套到API上,肯定报错。
内容的提问来源于stack exchange,提问作者windowshopr
相关产品推荐
相关产品推荐

