Python: ¿cómo llamar a la función js para calcular algún valor antes de la publicación?

Utilizo Requests (2.2.1) para iniciar sesión en una url http://tx3.netease.com/logging.php?action=login , pero la lógica de inicio de sesión de esta url es diferente del mecanismo de token csrf de Django, es decir:

  1. Cuando OBTENGA esta url, hay dos valores de importación formhash y sts en texto html, los cuales se utilizarán en una función js do_encrypt (en el archivo http://tx3.netease.com/forumdata/cache/rsa/rsa_min.js ). Esto está bien, puedo agarrarlos fácilmente a través de re.

La parte clave del texto html es:

      ...  ...  

2. Después de ingresar el correo electrónico y la contraseña original ori_password , al hacer clic en el botón enviar se llamará do_encrypt , que utilizará formhash , sts y ori_password para establecer la contraseña de password real para el dictado posterior. El problema surge: parece que no hay forma de obtener password cadena de password directamente. (Para el contraste, puede obtener directamente csrfmiddlewaretoken de session_client.cookies['csrftoken'] en el caso Django)

Este es el código:

 import requests import json import re loginUrl = "http://tx3.netease.com/logging.php?action=login" client = requests.session() r = client.get(loginUrl) r.encoding='gb18030' stsPat = re.compile('') formhashPat = re.compile('') sts = stsPat.search(r.text).groups()[0] formhash = formhashPat.search(r.text).groups()[0] loginData={ 'username' : "smaller9@163.com", 'password' : ..., # Set by js function do_encrypt 'referer':'/', 'loginfield':'username', 'ori_password':'', # it's `111111`, but `do_encrypt` will set it to empty. 'loginsubmit':'true', 'sts':sts, 'formhash':formhash, } # r = client.post(url=loginUrl,data=loginData) 

Suponiendo que tenga permiso para hacerlo, intente iniciar sesión con selenium ya que creo que estará más en línea con lo que está intentando hacer en última instancia.

 from selenium import webdriver USERNAME = "foo@bar.com" PASSWORD = "superelite" # create a driver driver = webdriver.Firefox() # get the homepage driver.get("http://tx3.netease.com/logging.php?action=login") un_elm = driver.find_element_by_id("username") pw_elm = driver.find_element_by_id("ori_password") submit = driver.find_element_by_css_selector("[name=loginsubmit]") un_elm.send_keys(USERNAME) pw_elm.send_keys(PASSWORD) # click submit submit.click() # get the PHPSESSID cookie as that has your login data, if you want to use # it elsewhere # print driver.get_cookies(): # do something else ...