# 使用js2py模拟登录人人网
import requests, js2py, json
def login():
# 创建session对象(因为后续登录都需要用到请求头和cookies,所以直接用到会话保持)
session = requests.session()
# 设置请求头
session.headers = {
'user-agent': 'user-agent'
}
# 发送get请求,获取json数据(这里的数据包含了部分post请求所需要的数据,即data)
response = session.get(url='www.baidu.com')
# 创建n(通过js代码得知,发送get请求之后,代码将data赋值给了n)
n = json.loads(response.content.decode())['data']
# 创建t
t = {
'user_num': '1337050665',
'password': 'ssaj23jds'
}
# 获取前置js代码
rsa_js = session.get('../rsa.js').content.decode()
bigint_js = session.get('../BigInt.js').content.decode()
barrett_js = session.get('../Barrett.js').content.decode()
# 创建js环境对象
context = js2py.EvalJs()
# 将变量和获取的前置js代码加载到环境对象中
context.execute(rsa_js)
context.execute(bigint_js)
context.execute(barrett_js)
context.n = n
context.t = t
# 执行关键js代码
pwd_js = """
t.password = t.password.split("").reverse().join(""),
setMaxDigits(130);
var o = new RSAKeyPair(n.e,"",n.n)
, r = encryptedString(o, t.password);
"""
context.execute(pwd_js)
# 获取加密密码
password = context.r
# 构建formdata,并发送post请求模拟登陆
formdata = {
'phoneNum': '1337050665',
'password': context.r,
'c1': '-100',
'rkey': n['rkey']
}
response = session.post(url='login...', data=formdata)
# 检验
print(response.content.decode())
if __name__ == '__main__':
login()