侧边栏壁纸
  • 累计撰写 13 篇文章
  • 累计收到 1 条评论

POST 登录到底是怎么发生的?拿 1314zf.com 后台练一遍手

2026-9-4 / 0 评论 / 12 阅读

GET 和 POST 这两个词,做网络相关的多少都听过,但真让你写一段"登录"的脚本,很多人会卡在第一步——不知道往哪发、发什么、怎么看才算成功。这篇就拿我自己的站(www.1314zf.com,emlog 程序)当例子,把一次 POST 登录从页面到代码完整走一遍。学会了这套,绝大多数带登录的接口你都能自己摸出来。

POST 登录到底是怎么发生的?拿 1314zf.com 后台练一遍手

先分清 GET 和 POST

说白了就两句话:

  • GET 是去要数据的,参数挂在网址后面,比如 ?page=2
  • POST 是把数据交上去的,表单内容放在请求体里,不暴露在网址上

登录、发评论、提交表单、改设置,基本都是 POST。因为密码这种东西不能写在网址里让人看到。

打开登录页,先"偷看"表单

浏览器访问 https://www.1314zf.com/admin/,F12 打开开发者工具,或者直接右键查看网页源码,找到登录那一段表单,核心信息就这几行:

<form method="post" action="./account.php?action=dosignin&s=">
    <input name="user"  type="text">       用户名 / 邮箱
    <input name="pw"    type="password">   密码
    <input name="login_code" type="text">  验证码
    <input name="persist" type="checkbox"> 记住登录
</form>

别看它不起眼,写登录脚本需要的全部信息都在这了:

  • action 告诉你要往哪发:./account.php?action=dosignin,相对 admin 目录,完整地址就是 https://www.1314zf.com/admin/account.php?action=dosignin
  • method="post" 告诉你要用 POST
  • 几个 name 就是提交时要带的字段名:user、pw、login_code、persist

字段名一个都不能错,错了服务器就收不到。这也是新手最容易翻车的地方——先看表单再写代码,别瞎猜。

验证码这一步,老老实实人工配合

emlog 后台登录带图形验证码,图片地址是 https://www.1314zf.com/include/lib/checkcode.php(在登录页源码里能直接看到)。

脚本里的做法是:先把这张验证码图下载下来,打开看一眼,把数字手动填进去,再提交。全自动识别验证码不在本文范围——那属于灰色地带,还容易触发风控,正经项目别碰。

Python 实现:四步登录

代码用 Python 的 requests 库,思路是"一个会话、拿图、填表、看结果"。

# -*- coding: utf-8 -*-
"""
POST 登录实例: 登录 1314zf.com (emlog) 后台
流程: 建会话 -> 下载验证码 -> 人工输入 -> POST 提交 -> 判断结果
"""
import requests

BASE = 'https://www.1314zf.com'

# 1) 建会话。requests.Session 会自动管理 cookie,
#    登录的会话状态全靠它, 不要用裸 requests.post
s = requests.Session()
s.headers['User-Agent'] = (
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    'AppleWebKit/537.36 (KHTML, like Gecko) '
    'Chrome/120.0 Safari/537.36'
)

# 2) 先访问一次登录页, 拿到会话 cookie, 再下载验证码
s.get(BASE + '/admin/')
code_img = s.get(BASE + '/include/lib/checkcode.php')
with open('checkcode.png', 'wb') as f:
    f.write(code_img.content)

code = input('请打开 checkcode.png 输入验证码: ')

# 3) 构造 POST 表单并提交
data = {
    'user': '你的用户名或邮箱',
    'pw': '你的密码',
    'login_code': code,
    'persist': '1',   # 记住登录
}
r = s.post(BASE + '/admin/account.php?action=dosignin&s=', data=data)

# 4) 看结果
print('HTTP 状态码:', r.status_code)
print('最终地址:', r.url)
print('会话Cookie:', dict(s.cookies))

input() 这一步脚本会停下来等你在黑窗口里输入验证码,输入完回车就继续提交。

怎么判断登录成功了

请求发出去了,怎么知道成没成?三个办法:

  1. 看 Cookie:emlog 登录成功会在会话里种下 em_auth_key 之类的认证 cookie,打印 dict(s.cookies) 能看到
  2. 看跳转:成功一般会 302 跳到后台 https://www.1314zf.com/admin/,看 r.url 落在哪
  3. 看受保护页面:登录后再 GET 一个只有后台才能访问的地址,能拿到正常内容就说明会话有效

常见坑,按顺序排

  1. 不建 Session 直接用 requests.post:验证码和登录提交成了两次独立请求,cookie 对不上,永远登录失败。这是最高频的错
  2. 忘了 User-Agent:部分环境会拒掉没有浏览器标识的请求,先把请求头带上
  3. 验证码有时效:下载验证码和提交之间别拖太久,过期了重新来
  4. 字段名抄错:拿不准就开 F12 网络面板,看真正的 Form Data 是什么
  5. 登录成功不等于完事:后续访问后台页面还得靠同一个 session,别新开请求

收个尾

POST 登录的原理就这么点东西:找表单、照搬字段、保持会话。学会了这一套,登录类接口基本都能举一反三——改改 URL、换换字段名就是另一个网站的登录脚本。下一篇可以接着讲登录之后怎么带着 cookie 抓后台数据、怎么处理分页。


评论一下?

OωO
取消