You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用urllib/urllib2获取会话Cookie登录页面遇403错误求助

解决urllib/urllib2登录时的403 Forbidden问题

看了你的代码后,发现几个关键问题,这大概率是导致403错误的核心原因,咱们一步步来修正:

1. 表单参数名不匹配

你的requests代码里用的是userName作为用户名的参数键,但urllib代码里写成了userId——服务器根本无法识别这个错误的参数,自然会拒绝你的认证请求,后续访问目标站点肯定拿不到合法权限。

2. 缺少必要的请求头

requests会自动帮你设置合理的User-Agent和表单提交的Content-Type,但urllib2默认的请求头非常简陋,很多服务器会直接拦截这类非浏览器风格的请求:

  • User-Agent:默认的Python-urllib/2.x很容易被识别为爬虫或旧客户端
  • Content-Type:提交表单时需要明确设置为application/x-www-form-urlencoded,否则服务器可能无法解析你的请求数据

修正后的完整代码

import urllib
import urllib2
import cookielib

# 初始化CookieJar,用于保存会话Cookie
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# 不建议用install_opener修改全局默认opener,直接用当前opener发送请求更可控

# 注意:参数名要和requests代码保持一致,是userName而非userId!
values = {
    "userName": "username", 
    "password": "password", 
    "apiKey": "myApiKey"
}
auth_url = 'https://sso.somewebsite.com/api/authenticateme'
encoded_data = urllib.urlencode(values)

# 构造认证POST请求,添加必要请求头
auth_req = urllib2.Request(auth_url, encoded_data)
auth_req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36')
auth_req.add_header('Content-Type', 'application/x-www-form-urlencoded')

try:
    # 发送认证请求,Cookie会自动存入cj
    auth_resp = opener.open(auth_req)
    print(f"认证成功,响应状态码:{auth_resp.getcode()}")
    
    # 用同一个opener访问目标站点,自动携带会话Cookie
    target_req = urllib2.Request('https://download.somewebsite.com')
    target_req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36')
    target_resp = opener.open(target_req)
    print(f"目标站点访问成功,响应状态码:{target_resp.getcode()}")
    # 如需查看响应内容,可取消注释
    # content = target_resp.read()
except urllib2.HTTPError as e:
    print(f"HTTP错误:{e.code} {e.reason}")
except Exception as e:
    print(f"其他错误:{str(e)}")

额外排查建议

  • 如果还是报错,可以用浏览器开发者工具(F12)查看真实请求的所有头信息,把AcceptReferer等必要头也添加到urllib2的Request中,确保请求和浏览器发送的完全一致。
  • 可以打印认证后的CookieJar内容,确认是否成功获取到会话Cookie:print([cookie for cookie in cj])

内容的提问来源于stack exchange,提问作者hod

火山引擎 最新活动