web-dev-qa-db-ja.com

pythonリクエストを使用してCSRFトークンを取得する

私は現在Pythonリクエストを使用しており、サイトにログインするためにCSRFトークンが必要です。私の理解からリクエスト。Session()はCookieを取得しますが、明らかにトークンが必要です。また、私もコードのどこに配置するか知りたいインポートリクエスト

user_name = input('Username:')
payload = {
'username': 'user_name',
'password': 'randompass123'
}


with requests.Session() as s:
p = s.post('https://examplenotarealpage.com', data=payload)
3
Noah

次のコード例を参照してください。これを直接使用して、ログイン情報の保存にCookieのみを使用するWebサイトにログインできます。

import requests

LOGIN_URL = 'https://examplenotarealpage.com'
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}

response = requests.get(LOGIN_URL, headers=headers, verify=False)

headers['cookie'] = '; '.join([x.name + '=' + x.value for x in response.cookies])
headers['content-type'] = 'application/x-www-form-urlencoded'
payload = {
    'username': 'user_name',
    'password': 'randompass123'
}

response = requests.post(LOGIN_URL, data=payload, headers=headers, verify=False)
headers['cookie'] = '; '.join([x.name + '=' + x.value for x in response.cookies])

CSRFトークンの可能な場所はいくつかあります。ウェブサイトが異なれば、ブラウザに渡す方法も異なります。それらのいくつかを次に示します。

  • 応答ヘッダーを付けることができます。その場合、取得は簡単です。
  • ページメタがCSRFトークンを保持する場合があります。それを取得するには、ページのhtmlコンテンツを解析する必要があります。そのための適切なCSSセレクターを見つけます。例を参照してください。

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(response.text, 'lxml')
    csrf_token = soup.select_one('meta[name="csrf-token"]')['content']
    
  • JavaScriptコードを含むスクリプトタグ内に含めることができます。それを取得するのは難しいでしょう。ただし、いつでも regex を使用して分離できます。

1
Dipu
import requests
from bs4 import BeautifulSoup
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 
           (KHTML, like Gecko) Chromium/80.0.3987.160 Chrome/80.0.3987.163 
           Safari/537.36'
 }
login_data = {
             'name' : 'USERNAME',
             'pass' : 'PASSWORD',
             'form_id':'new_login_form',
             'op':'login'
  }

with requests.Session() as s:
    url = 'https://www.codechef.com/'
    r = s.get(url,headers=headers,verify=False)
    #print(r.content) # to find name of csrftoken and form_build_id
    soup = BeautifulSoup(r.text, 'lxml')

    csrfToken = soup.find('input',attrs = {'name':'csrfToken'})['value']
    form_build_id = soup.find('input',attrs = {'name':'form_build_id'}) 
    ['value']

    login_data['csrfToken'] = csrfToken
    login_data['form_build_id'] = form_build_id

    r = s.post(url,data=login_data,headers = headers)
    print(r.content)

これを直接使用できますが、変更する点がいくつかあります。
1。ブラウザネットワークオプションでユーザーエージェントを確認します
2.print(r.content)でcsrf-tokenとform_build_idのname属性を確認し、csrftokenとform-b​​uild-idを見つけてname属性を確認します。

最終段階 :

r.contentでログアウトを検索する場合は、ログインしています。

0
ROHIT kashyap