CoWIN公共API在Postman、终端返回403但浏览器可正常访问如何解决
问题产生原因
这个问题本质是服务端的反爬虫拦截机制导致的,具体触发原因如下:
- 服务端会校验请求头的
User-Agent字段,Postman、curl、wget等工具默认发送的UA带有工具自身标识,和浏览器的UA规则不符,被服务端识别为非合法浏览器请求后直接返回403 - 部分反爬规则还会校验
Referer、Origin字段,要求请求来源为CoWin官方域名,工具默认请求不会携带这些来源标识,也会触发拦截 - 浏览器发起请求时会自动携带
Accept、Accept-Language等标准请求头,工具默认发送的请求头字段不全,也可能触发校验拦截
可行解决方案
方案1:直接复用浏览器的请求配置
这是最快捷的验证方案:
- 在Chrome中正常访问接口成功后,按F12打开开发者工具,切换到「网络」面板,找到对应接口的请求记录
- 右键该请求记录,选择「复制 - 复制为cURL(bash)」
- 把复制的内容直接粘贴到终端执行,即可正常拿到返回结果;如果需要适配到Postman或者代码中,只需要把复制的curl命令对应的请求头全部迁移过去即可
方案2:手动配置模拟浏览器的请求头
核心需要在请求中添加以下请求头即可绕过基础校验:
User-Agent:和你本地Chrome浏览器的UA保持完全一致,可以在Chrome地址栏输入chrome://version查看Referer:固定设置为https://www.cowin.gov.in/Accept:设置为application/json, text/plain, */*
附Python requests调用示例:
import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", "Referer": "https://www.cowin.gov.in/", "Accept": "application/json, text/plain, */*" } url = "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByDistrict?district_id=512&date=06-05-2021" resp = requests.get(url, headers=headers) print(resp.json())
注意事项
该接口为公共服务接口,存在请求频率限制,不要高频发起请求,否则会触发IP封禁限制。
内容的提问来源于stack exchange,提问作者Arpan Nagar
相关产品推荐
相关产品推荐

