如何使用Node.js登录ASP.NET站点并获取个人成绩单数据
ASP.NET站点登录实现逻辑与问题排查
首先纠正认知:__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION三个参数不是前端随机生成的,是ASP.NET Web Forms框架特有的服务端生成的状态校验参数,会随登录页HTML返回嵌在隐藏的input标签中,参数值和当前会话绑定,不能自行构造。
Node.js实现登录的步骤
- 第一步:安装必要依赖,推荐用
axios发起请求,cheerio解析HTML,安装命令:npm install axios cheerio - 第二步:发起GET请求访问登录页面,开启Cookie自动维护(axios可以通过创建实例配置
withCredentials: true实现自动携带和存储Cookie),获取登录页的HTML内容和会话Cookie - 第三步:用cheerio解析HTML,提取三个隐藏input的value值:
const cheerio = require('cheerio') const $ = cheerio.load(登录页HTML内容) const viewState = $('input[name="__VIEWSTATE"]').val() const viewStateGenerator = $('input[name="__VIEWSTATEGENERATOR"]').val() const eventValidation = $('input[name="__EVENTVALIDATION"]').val() - 第四步:构造POST登录请求,form表单参数除了账号、密码,还要带上上面提取到的三个参数,请求头要和浏览器抓包的登录请求头完全一致,重点校验
Content-Type、User-Agent、Referer字段 - 第五步:登录成功后保留会话Cookie,后续访问成绩单页面携带该Cookie即可
Postman请求正常、Node.js请求失败的常见原因
- Cookie处理错误:Postman会自动存储和携带请求返回的会话Cookie,大部分请求失败的原因是Node.js代码没有把GET登录页返回的会话Cookie带到POST登录请求中,导致服务端判定会话无效,参数校验失败
- 请求头缺失:Postman从Chrome粘贴请求时会自动带上所有请求头,Node.js代码如果漏了
User-Agent、Referer、Origin这类服务端校验的字段,就会被拦截,建议把两者的请求头逐一比对确保完全一致 - 参数过期:三个参数是和当前会话绑定且有时效的,不要复用之前请求拿到的旧参数,每次发起登录请求前都要重新请求登录页获取最新的三个参数
- 编码错误:手动拼接表单参数时如果有特殊字符没有做URL编码,会导致参数解析失败,建议用请求库自带的表单序列化功能提交参数,不要手动拼接参数串
内容的提问来源于stack exchange,提问作者kutaykurt
相关产品推荐
相关产品推荐

