### 题目描述
现在正在做一个爬虫,使用nodejs模拟登录正方教务系统的项目。在模拟登录的时候遇到了问题,模拟登录的时候一共需要三个参数分别是密码,用户名以及csrftoken。现在已经解决了密码加密和用户名,只剩下csrftoken无法解决。
教务系统地址:http://202.119.206.62/jwglxt/...
csrftoken存在于教务系统的登录页面之中
只需要获取到这个在将值放入POST的参数之中即可
### 相关代码
以下为主要代码
const superagent = require('superagent')
const cheerio = require('cheerio')
var rsa = require('node-bignumber')
const base64 = require('../public/base64')
const hex2b64 = base64.hex2b64
const b64tohex = base64.b64tohex
const headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8',
'Accept-ncoding': 'gzip,deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Upgrad-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
var timestamp = new Date().getTime()
const loginUrl = 'http://202.119.206.62/xtgl/lo...' + timestamp
const csrfktokenUrl = 'http://202.119.206.62/xtgl/lo...' + timestamp
const getPublicKeyUrl = 'http://202.119.206.62/xtgl/lo...' + timestamp + '&_=' + timestamp
superagent.get(getPublicKeyUrl).send(headers).end((err, res) => {
if (err) console.log(err)
const modulus = b64tohex(JSON.parse(res.text)['modulus'])
const exponent = b64tohex(JSON.parse(res.text)['exponent'])
var pub = new rsa.Key()
pub.setPublic(modulus, exponent)
var mm = '*****'
var encrypted = pub.encrypt(mm)
agent.get(csrfktokenUrl).send(headers).end((err, res) => {
if (err) console.log(err)
const $ = cheerio.load(res.text)
csrftoken = $('#csrftoken').val()
console.log('csrftoken', csrftoken)
// console.log(res.text)
agent.post(loginUrl).send(headers).send({
csrftoken: csrftoken,
mm: hex2b64(encrypted),
yhm: '******'
}).end((err, res) => {
if (err) console.log(err)
const $ = cheerio.load(res.text)
// console.log(res.text)
csrftoken = $('#csrftoken').val()
console.log('csrftoken1', csrftoken)
// const tips = $('#tips').html()
// console.log('tips', tips)
})
})
})
### 问题出现的环境背景及自己尝试过哪些方法
目前,我的思路是使用superagent,请求loginUrl进行登录,请求csrfktokenUrl获得csrfktoken,请求getPublicKeyUrl获取rsa公钥
同时,当使用loginUrl登陆的时候csrfktoken必须为当前loginUrl页面的csrfktoken,而不能是其他的csrfktoken,否则会无法登录成功
但是因为请求的csrfktokenUrl和loginUrl是一样的,理应获取的csrfktoken也应该是一样的
可是输出的结果不一样
而我都一直使用csrfktokenUrl请求的csrfktoken作为登录参数进行登录,所以老是无法登录成功
但我也无法获取loginUrl的csrfktoken作为登录参数进行登录,因为要获得csrfktoken必须要在请求结束才可以获得,所以造成老是无法登录的情况
### 你期待的结果是什么?
1、我还在想,能否在同一个会话session中访问请求页面,这样请求相同的页面获得csrfktoken也应该会一样,但我没有找到使用session的方法,或者有什么保持同一会话的方法能告诉我
2、superagent可以换着法使用从而达到请求同一页面获取的csrfktoken也一样
3、或者有什么其他的办法能够告知
谢谢!
直接get这个登录页面,然后解析html拿到token不就行了?