AWS/DigitalOcean服务器无法登录Instagram,附登录脚本求助
解决AWS/DigitalOcean服务器上Instagram登录失败的实用方案
嘿,我之前在AWS和DigitalOcean服务器上碰到过一模一样的Instagram登录问题——Instagram的反机器人系统对数据中心IP和脚本化请求管得特别严。结合你给出的脚本,我整理了几个实测有效的解决办法:
1. 补全请求头,先拿CSRF Token再登录
你的脚本只设置了User-Agent,但Instagram会检查更多请求头,而且必须先访问主页拿到必要的Cookie和CSRF Token才能发起登录请求。修改你的登录函数试试:
import requests import pprint import time INSTAGRAM_URL = 'https://www.instagram.com' USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' IG_ACCOUNTS = [ {'username': 'username1', 'password': 'pass1'}, {'username': 'username2', 'password': 'pass2'}, ] def login(username, password): session = requests.Session() # 补全更贴近真实用户的请求头 session.headers.update({ 'User-Agent': USER_AGENT, 'Accept-Language': 'en-US,en;q=0.9', 'Referer': f"{INSTAGRAM_URL}/", 'X-Requested-With': 'XMLHttpRequest', 'Origin': INSTAGRAM_URL }) # 先访问主页,获取CSRF Token和初始Cookie response = session.get(INSTAGRAM_URL) csrf_token = session.cookies.get('csrftoken') if not csrf_token: print(f"获取CSRF Token失败,可能IP已被限制") return None # 把CSRF Token加入请求头 session.headers['X-CSRFToken'] = csrf_token login_url = f"{INSTAGRAM_URL}/accounts/login/ajax/" payload = { 'username': username, 'password': password } # 模拟用户输入后的延迟,再发请求 time.sleep(2) response = session.post(login_url, data=payload) res_data = response.json() pprint.pprint(res_data) if res_data.get('authenticated'): print(f"✅ {username} 登录成功") return session else: error_msg = res_data.get('message') or "未知错误" print(f"❌ {username} 登录失败:{error_msg}") return None
2. 解决IP被拉黑的核心问题
AWS和DigitalOcean的IP池大多被Instagram标记成了可疑流量,这是最常见的失败原因:
- 换用住宅代理(别用数据中心代理),住宅IP更接近真实用户的上网环境,不容易被检测
- 在会话里配置代理,每个账号尽量用不同的IP:
# 替换成你的住宅代理地址 proxies = { 'http': 'http://your-residential-proxy:port', 'https': 'http://your-residential-proxy:port' } session = requests.Session() session.proxies.update(proxies)
- 如果是固定IP的服务器,可以先在本地用账号登录一次,在Instagram的安全设置里把这个IP标记为“信任设备/IP”
3. 模拟真实用户行为,避免被识别为脚本
Instagram会检测请求频率和行为模式,你可以加这些细节:
- 在每次请求之间加随机延迟,比如
time.sleep(random.uniform(1.5, 4)),模拟用户操作间隔 - 不要连续快速登录多个账号,每个账号登录前先访问几个页面(比如首页、某个用户主页),再发起登录
- 准备一个真实浏览器的UA池,每个账号用不同的UA,避免重复
4. 处理账号验证问题
如果你的账号开了两步验证,或者Instagram触发了人机验证:
- 先在本地用该账号登录,完成验证后信任服务器IP(如果IP固定)
- 检查返回的JSON里是否有
require_login_challenge字段,如果有,说明需要验证,得额外处理验证码流程(比如手动接收短信,或者用合规的验证码识别工具)
5. 换用浏览器模拟工具(终极方案)
如果纯requests的方法还是不行,试试用playwright或者selenium模拟真实浏览器操作——它们能完全模拟用户的浏览器环境,绕过大部分反爬检测:
from playwright.sync_api import sync_playwright import random import time def login_with_playwright(username, password): with sync_playwright() as p: # 服务器上需要无头模式,本地可以改成False看界面 browser = p.chromium.launch(headless=True, args=['--no-sandbox']) page = browser.new_page(user_agent=USER_AGENT) # 模拟用户缓慢打开页面 page.goto(INSTAGRAM_URL) time.sleep(random.uniform(2, 3)) # 模拟输入账号密码(加延迟) page.fill('input[name="username"]', username) time.sleep(random.uniform(0.5, 1)) page.fill('input[name="password"]', password) time.sleep(random.uniform(0.5, 1)) # 点击登录按钮 page.click('button[type="submit"]') time.sleep(3) # 检查登录状态 if page.url == f"{INSTAGRAM_URL}/" or "/accounts/onetap/" in page.url: print(f"✅ {username} 登录成功") else: print(f"❌ {username} 登录失败,可能需要验证") browser.close()
注意:在服务器上用playwright需要先安装依赖,比如pip install playwright,然后运行playwright install chromium。
内容的提问来源于stack exchange,提问作者Js Lim
相关产品推荐
相关产品推荐

