以下は、Cookの公式ウェブサイト(https://www.cooksillustrated.com/sign_in)へのログインに使用しようとしているコードです。Pythonデータスクラップ - フォーム認証の問題
セッションを開始し、認証トークンと隠れたエンコードフィールドを取得し、電子メールとパスワードフィールドの「名前」と「値」を渡します(chromeの要素を調べることで見つけられます)。フォームに他の要素が含まれていないようです。しかし、postメソッドは私をログインさせません。
CSRFトークンのすべてが "=="で終わっていることに気がつきましたので、削除しようとしました。しかし、それは動作しませんでした。
"名前"の代わりにフォーム入力の "id"フィールドを使用するようにポストを修正しようとしました(暗闇の中のちょうどショット...名前は私のものから動作するはずです他の例に見られる)。
ご意見をいただければ幸いです。
import requests, lxml.html
s = requests.session()
# go to the login page and get its text
login = s.get('https://www.cooksillustrated.com/sign_in')
login_html = lxml.html.fromstring(login.text)
# find the hidden fields names and values; store in a dictionary
hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]')
form = {x.attrib['name']: x.attrib['value'] for x in hidden_inputs}
print(form)
# I noticed that they all ended in two = signs, so I tried taking that off
# form['authenticity_token'] = form['authenticity_token'][:-2]
# this adds to the form payload the two named fields for user name and password
# found using the "inspect elements" on the login screen
form['user[email]'] = 'my_email'
form['user[password]'] = 'my_pw'
# this uses "id" instead of "name" from the input fields
#form['user_email'] = 'my_email'
#form['user_password'] = 'my_pw'
response = s.post('https://www.cooksillustrated.com/sign_in', data=form)
print(form)
# trying to see if it worked - but the response URL is login again instead of main page
# and it can't find my name
# responses are okay, but I think that just means it posted the form
print(response.url)
print('Christopher' in response.text)
print(response.status_code)
print(response.ok)
CSRFトークンの末尾にある「==」は、Base64文字列であるため、[padding](https://en.wikipedia.org/wiki/Base64#Output_Padding)です。 – Adrian
ありがとうございます。デコードや削除が必要なのでしょうか?それとも、「そのまま」合格するのでしょうか? –
CSRFは** C ** ross - ** S ** ite ** R ** equest ** F ** orgeryの略で、悪意のあるサイト、電子メール、プログラムなどによってユーザーのブラウザが不要な操作を実行します。トークンは、これを防ぐ手段です。そのまま渡す必要があります。 – Adrian