web-dev-qa-db-ja.com

Pythonのリクエストモジュールを使用してWebサイトに「ログイン」する方法

PythonのRequestsモジュールを使用してWebサイトにログインする要求を投稿しようとしていますが、実際には機能していません。私はこれが初めてなので...ユーザー名とパスワードのCookieを作成する必要があるのか​​、見つけたHTTP認証の種類を作成する必要があるのか​​わかりません(??).

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'

だから今、私は「ポスト」とクッキーを使用することになっていると思います。

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}

r = requests.post(url, cookies=ck)

content = r.text

q = PyQuery(content)

title = q("title").text()

print title

私はクッキーのことを間違っていると感じています...私は知りません。

正しくログインできない場合は、ホームページのタイトルが「Locationary.com」に表示され、ログインしている場合は「ホームページ」になります。

リクエストとCookieについていくつか説明してくれて、助けていただければ幸いです。 :D

ありがとう。

...それでもまだうまくいきませんでした。さて...ログインする前に、これがホームページのHTMLの表示です:

</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>

だから私はそれを正しくやっていると思うが、出力はまだ「Locationary.com」

2nd EDIT:

長時間ログインしたままにしたいので、そのドメインの下のページをリクエストするたびに、コンテンツがログインしているかのように表示されます。

75
Marcus Johnson

必要な情報がログイン後すぐに表示されるページにある場合...

python-requests docsのように、代わりにck変数payloadを呼び出しましょう:

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

そうでなければ...

https://stackoverflow.com/a/17633072/111362 を参照してください。

39
katy lavallee

私はあなたが別の解決策を見つけたことを知っていますが、この質問を見つけて同じものを探している私のような人にとっては、それは次のようなリクエストで達成できます:

まず、Marcusが行ったように、ログインフォームのソースをチェックして、フォームが投稿するURL、およびユーザー名とパスワードフィールドの名前属性の3つの情報を取得します。彼の例では、それらはinUserNameとinUserPassです。

それが得られたら、requests.Session()インスタンスを使用して、ログインURLにペイロードとしてログインの詳細を含む投稿要求を行うことができます。セッションインスタンスからリクエストを作成することは、通常リクエストを使用することと本質的に同じです。単に永続性を追加するだけで、Cookieなどを保存して使用できます。

ログイン試行が成功したと仮定すると、セッションインスタンスを使用して、サイトにさらにリクエストを行うことができます。お客様を識別するCookieは、リクエストの承認に使用されます。

import requests

# Fill in your details here to be posted to the login form.
payload = {
    'inUserName': 'username',
    'inUserPass': 'password'
}

# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
    p = s.post('LOGIN_URL', data=payload)
    # print the html returned or something more intelligent to see if it's a successful login page.
    print p.text

    # An authorised request.
    r = s.get('A protected web page url')
    print r.text
        # etc...
196
tigerFinch

簡単にするために、サイトのURLが http://example.com/ であり、ユーザー名とパスワードを入力してサインアップする必要があると仮定して、ログインページに移動します。 say http://example.com/login.php 今、ソースコードを表示し、フォームタグのようなアクションURLを検索します

 <form name="loginform" method="post" action="userinfo.php">

userinfo.phpを使用して、 ' http://example.com/userinfo.php 'となる絶対URLを作成し、単純なpythonスクリプトを実行します。

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

これがいつか誰かの助けになることを願っています。

30

ユーザー名<...name=username.../>およびパスワード<...name=password../>のWebサイトフォームで使用される入力の名前を確認し、以下のスクリプトでそれらを置き換えます。また、ログインする目的のサイトを指すようにURLを置き換えます。

login.py

#!/usr/bin/env python

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': '[email protected]', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)

disable_warnings(InsecureRequestWarning)を使用すると、未検証のSSL証明書を使用してサイトにログインしようとしたときに、スクリプトからの出力がすべて抑制されます。

追加:

このスクリプトをUNIXベースのシステムのコマンドラインから実行するには、ディレクトリ(つまり、home/scripts)に配置し、このディレクトリを~/.bash_profileまたは端末で使用される同様のファイルのパスに追加します。

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH

次に、home/scripts/login.py内にこのpythonスクリプトへのリンクを作成します

ln -s ~/home/scripts/login.py ~/home/scripts/login

ターミナルを閉じ、新しいターミナルを起動して、loginを実行します

1
David

requests.Session()ソリューションは、CSRF保護付きのフォームへのログインを支援しました(Flask-WTFフォームで使用)。 csrf_tokenが非表示フィールドとして必要かどうかを確認し、ユーザー名とパスワードを使用してペイロードに追加します。

import requests
from bs4 import BeautifulSoup

payload = {
    'email': '[email protected]',
    'password': 'passw0rd'
}     

with requests.Session() as sess:
    res = sess.get(server_name + '/signin')
    signin = BeautifulSoup(res._content, 'html.parser')
    payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
    res = sess.post(server_name + '/auth/login', data=payload)
0
naaman