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

如何处理「页面因闲置而过期」错误?网站用户生成器开发遇阻

解决Laravel网站注册请求返回「页面过期」的问题

嘿,我来帮你搞定这个问题!你碰到的「页面过期」提示,在Laravel这类框架里基本都是CSRF验证没通过导致的,你的代码思路方向对,但细节上有几个小问题,咱们调整一下就能解决。

问题出在哪?

你现在的代码把XSRF-TOKEN直接放到请求头里,但Laravel默认认的是这两种方式:

  1. 表单参数里的_token(页面注册表单里的隐藏字段)
  2. 请求头里的X-XSRF-TOKEN(注意是X-开头的,不是你用的XSRF-TOKEN
    而且你之前的POST请求是空的,没有提交任何注册必填字段,框架自然会判定请求无效。

修改后的完整代码

import requests
from bs4 import BeautifulSoup

with requests.Session() as s:
    # 第一步:访问注册页面,既获取cookie,也提取页面里的CSRF token
    register_page = s.get('http://www.watchill.org/register')
    soup = BeautifulSoup(register_page.content, "html.parser")
    
    # 从页面的隐藏表单字段里拿Laravel需要的_token
    csrf_token = soup.find('input', {'name': '_token'})['value']
    
    # 配置请求头,保持正常的User-Agent即可
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 OPR/62.0.3331.116"
    }
    
    # 准备注册必填的表单数据,必须包含_token和网站要求的注册字段
    form_data = {
        '_token': csrf_token,
        'name': '测试用户001',  # 替换成你要生成的用户名
        'email': 'test_user_001@example.com',  # 替换成唯一的测试邮箱
        'password': 'your_secure_password',  # 替换成符合要求的密码
        'password_confirmation': 'your_secure_password'  # Laravel注册通常需要密码确认
    }
    
    # 发送POST请求,把表单数据放在data参数里(这才是表单提交的正确方式)
    r = s.post('http://www.watchill.org/register', headers=headers, data=form_data)
    
    # 打印响应内容看看结果
    print(BeautifulSoup(r.content, "html.parser"))

几个关键细节说明

  • 优先用页面里的_token:有些网站的CSRF token会同时存在cookie和页面表单里,用页面提取的token比直接用cookie里的更可靠,避免编码问题。
  • 必须提交完整表单字段:空的POST请求肯定会被拦截,你得把目标网站注册页面要求的所有必填字段都填上,比如用户名、邮箱、密码这些。
  • Session的作用requests.Session()已经帮你自动维护了cookie的持久化,不用手动处理cookie传递,这一步你之前做的是对的。

额外的排查技巧

如果还是不行,可以试试解码cookie里的XSRF-TOKEN(因为它是URL编码的),然后加到请求头里:

import urllib.parse
xsrf_token = urllib.parse.unquote(s.cookies["XSRF-TOKEN"])
headers["X-XSRF-TOKEN"] = xsrf_token

不过大部分情况下,用表单里的_token就能解决问题啦。

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

火山引擎 最新活动