1. # 使用js2py模拟登录人人网
    2. import requests, js2py, json
    3. def login():
    4. # 创建session对象(因为后续登录都需要用到请求头和cookies,所以直接用到会话保持)
    5. session = requests.session()
    6. # 设置请求头
    7. session.headers = {
    8. 'user-agent': 'user-agent'
    9. }
    10. # 发送get请求,获取json数据(这里的数据包含了部分post请求所需要的数据,即data)
    11. response = session.get(url='www.baidu.com')
    12. # 创建n(通过js代码得知,发送get请求之后,代码将data赋值给了n)
    13. n = json.loads(response.content.decode())['data']
    14. # 创建t
    15. t = {
    16. 'user_num': '1337050665',
    17. 'password': 'ssaj23jds'
    18. }
    19. # 获取前置js代码
    20. rsa_js = session.get('../rsa.js').content.decode()
    21. bigint_js = session.get('../BigInt.js').content.decode()
    22. barrett_js = session.get('../Barrett.js').content.decode()
    23. # 创建js环境对象
    24. context = js2py.EvalJs()
    25. # 将变量和获取的前置js代码加载到环境对象中
    26. context.execute(rsa_js)
    27. context.execute(bigint_js)
    28. context.execute(barrett_js)
    29. context.n = n
    30. context.t = t
    31. # 执行关键js代码
    32. pwd_js = """
    33. t.password = t.password.split("").reverse().join(""),
    34. setMaxDigits(130);
    35. var o = new RSAKeyPair(n.e,"",n.n)
    36. , r = encryptedString(o, t.password);
    37. """
    38. context.execute(pwd_js)
    39. # 获取加密密码
    40. password = context.r
    41. # 构建formdata,并发送post请求模拟登陆
    42. formdata = {
    43. 'phoneNum': '1337050665',
    44. 'password': context.r,
    45. 'c1': '-100',
    46. 'rkey': n['rkey']
    47. }
    48. response = session.post(url='login...', data=formdata)
    49. # 检验
    50. print(response.content.decode())
    51. if __name__ == '__main__':
    52. login()