1. js文件定位
在network中通过发送账号密码的js报文中initiaor查询根据发送的数据中关键字在全部报文中search在登录按钮上的Element中Event listener 查找点击按钮触发的js请求
2. 在python中执行js文件
通过分析js文件,得出密码的加密过程,按照js文件的加密过程执行一次得出密码加密后数值,则可以将post的form表单数据写好,就可以实现登录。
在python中执行js代码可以通过js2py模块,需要pip install js2py
3. 登录实现代码
import requests
import js2py
import json
session
= requests
.session
()
url
= 'http://activity.renren.com/livecell/rKey'
headers
= {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded',
'X-Requested-With': 'XMLHttpRequest'
}
session
.headers
= headers
response
= session
.get
(url
)
n
= json
.loads
(response
.content
)['data']
print(n
)
t
= {
'password' : '1xxxxxx'
}
rsa_js
= session
.get
('http://s.xnimg.cn/a85738/wap/mobile/wechatLive/js/RSA.js',).content
.decode
()
bigint_js
= session
.get
('http://s.xnimg.cn/a85738/wap/mobile/wechatLive/js/BigInt.js',).content
.decode
()
barrett_js
= session
.get
('http://s.xnimg.cn/a85738/wap/mobile/wechatLive/js/Barrett.js',).content
.decode
()
context
= js2py
.EvalJs
()
context
.execute
(rsa_js
)
context
.execute
(bigint_js
)
context
.execute
(barrett_js
)
context
.n
= n
context
.t
= t
kw_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
(kw_js
)
print(context
.r
)
data
= {
'phoneNum': '173xxxxxxx',
'password': context
.r
,
'c1': -100,
'rKey': n
['rkey']
}
post_url
= 'http://activity.renren.com/livecell/ajax/clog'
response
= session
.post
(post_url
, data
=data
)
print(response
.content
.decode
())