2016-12-29 2 views
0

Я пытаюсь изменить имя пользователя учетной записи на веб-сайте. Есть 3 параметра POST требуемые:Запросы на Python - Отправить по два запроса на этой же странице?

1) NEWNAME
2) пароль
3) authenticityToken

authenticityToken генерируется случайным образом каждый раз, когда страница загружена. Это тип ввода скрытых:

<input type="hidden" name="authenticityToken" value="0640ce533fc7a51b88f79ce17cdbd611f4dc2360"/> 

То, что я пытаюсь добиться, чтобы получить значение authenticityToken и на той же странице POST 3 параметров, необходимых, как указано выше. На данный момент мой код получает подлинностьToken, используя запрос GET, а затем отправляет другой запрос POST. Она возвращает

Bad подлинность маркера

Код настоящее время я использую ниже:

import requests 
from bs4 import BeautifulSoup 

url = "https://account.mojang.com" 

#Login and save cookies 
r = requests.post("https://account.mojang.com/login", data={'username':'theUsername','password':'thePassword','remember':'true'}) 
Logincookies = r.cookies 

#Parse the page to get rename link 
soup = BeautifulSoup(r.text, "html.parser") 
renamePage = None 
sources = soup.findAll('a',{"href":True}) 
for source in sources: 
    if("/me/renameProfile/" in source["href"]): 
     renamePage = source["href"] 


#Get AuthToken 

authToken = None 
r = requests.get(url + renamePage,cookies=Logincookies) 
parser = BeautifulSoup(r.text,"html.parser") 
srcs = parser.findAll('input') 
for src in srcs: 
    if(src["name"] == "authenticityToken"): 
     authToken = src["value"] 
print(authToken) 


r = requests.post(url + renamePage, cookies=Logincookies, data={'newName':'theNewUsername','password':'thePassword','authenticityToken':authToken}) 
print(r.text) 

Еще раз, как я могу сделать это так, что GET и запрос POST перейти к вместе, чтобы он не использовал новую страницу и не получил новую аутентичностьToken?

ответ

0

Таким образом, решение было использовать библиотеку под названием RoboBrowser и кормить его той же сессии, используемый в качестве моих предыдущих запросов:

import requests 
from bs4 import BeautifulSoup 
from robobrowser import RoboBrowser 

session=requests.session() 
r = session.post(...) 
r = session.get("...") 

browser.open(url+renamePage) 
rename_form = browser.get_form(class_='standard') 
rename_form['newName'].value = "theNewUser" 
rename_form['password'].value = "theNewPass" 

browser.submit_form(rename_form) 
+0

Вы не _need_ RoboBrowser - RoboBrowser на самом деле [с использованием request.Session()] (https://github.com/jmcarp/robobrowser/blob/master/robobrowser/browser.py#L72), поскольку указано @Andersson жизнеспособный способ получить то, что вы хотите - вы даже создаете экземпляр сеанса через request.session() (но явно не указываете его использование) в своем ответе. – Jmills

+0

Нет. Я только что прокомментировал код RoboBrowser и отправил запрос POST: r = session.post (url + renamePage, data = {'newName': newname, 'password': password}), и я получил обратно authenticityToken. – RaghavJhavar

0

Попробуйте использовать Session. Это позволит вам использовать тот же cookies, маркер доступа и т.д. в различных запросах:

s = requests.Session() 
url = "https://account.mojang.com" 
r = s.post("https://account.mojang.com/login", data={'username':'theUsername','password':'thePassword','remember':'true'}) 
Logincookies = r.cookies 
... 
r = s.get(url + renamePage,cookies=Logincookies) 

P.S. В некоторых случаях вам также может потребоваться указать клиента в headers, например. headers={ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0" }

+0

Я уже попробовал, что, прежде чем я разместил его. Кажется, я нашел библиотеку, чтобы исправить это. Это называется Robobrowser. – RaghavJhavar

 Смежные вопросы

  • Нет связанных вопросов^_^