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:
長時間ログインしたままにしたいので、そのドメインの下のページをリクエストするたびに、コンテンツがログインしているかのように表示されます。
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 を参照してください。
私はあなたが別の解決策を見つけたことを知っていますが、この質問を見つけて同じものを探している私のような人にとっては、それは次のようなリクエストで達成できます:
まず、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...
簡単にするために、サイトの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
これがいつか誰かの助けになることを願っています。
ユーザー名<...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
を実行します
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)