调用Instagram取消关注接口时出现403错误,请求技术排查
Instagram取消关注接口返回403错误的问题排查与修复方案
看起来你已经找对了unfollow的接口端点,但403错误基本都是因为请求缺少Instagram后端要求的验证信息,结合你在登录状态下的Chrome控制台操作场景,我帮你梳理下遗漏的关键细节:
1. 完全无效的请求参数
你代码里的params = 'orem=ipsum&name=binny'是完全无关的测试数据,Instagram的/web/friendships/{user-id}/unfollow/接口不需要这类自定义参数,发送空的请求体即可,多余的无效参数反而可能触发后端的验证拦截。
2. 缺失CSRF Token验证
Instagram依赖CSRF Token防止跨站请求伪造,这是403错误最常见的原因。你需要从当前登录用户的Cookie中提取csrftoken值,并放到请求头里:
// 从Cookie中提取CSRF Token const csrfToken = document.cookie.split('; ').find(row => row.startsWith('csrftoken=')).split('=')[1];
3. 必要请求头不完整
除了Content-Type,Instagram的AJAX接口还要求几个关键请求头,缺少任何一个都可能返回403:
X-CSRFToken:上面提取的CSRF Token值X-Requested-With:固定值XMLHttpRequest,用于标识这是AJAX请求Referer:需要设置为目标用户的Instagram主页URL,比如https://www.instagram.com/目标用户名/,后端会验证请求来源的合法性
修正后的完整代码
// 提取当前登录用户的CSRF Token const csrfToken = document.cookie.split('; ').find(row => row.startsWith('csrftoken=')).split('=')[1]; var http = new XMLHttpRequest(); var url = 'https://www.instagram.com/web/friendships/8752655712/unfollow/'; http.open('POST', url, true); // 设置所有必要的请求头 http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); http.setRequestHeader('X-CSRFToken', csrfToken); http.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); http.setRequestHeader('Referer', 'https://www.instagram.com/替换成目标用户的用户名/'); http.onreadystatechange = function() { if(http.readyState == 4) { if(http.status == 200) { alert('取消关注成功!响应内容: ' + http.responseText); } else { // 处理非200状态,方便排查问题 alert(`请求失败,状态码: ${http.status},响应内容: ${http.responseText}`); } } }; // 发送空的请求体即可 http.send('');
额外注意事项
- Instagram的Web接口可能随时更新,如果你后续再次遇到问题,建议重新用Fiddler抓包对比实际浏览器发送的请求头和参数,确保你的代码和官方请求一致
- 频繁通过脚本执行取消关注操作可能触发Instagram的反机制,导致账号受限,建议谨慎操作
内容的提问来源于stack exchange,提问作者sideshowbob
相关产品推荐
相关产品推荐

