この方法でしばらくログインしていないと言って、この前置きをします。そのため、「受け入れられている」方法のいくつかを見逃している可能性があります。
これがあなたが求めているものかどうかはわかりませんが、のようなライブラリmechanize
や、のようなより堅牢なフレームワークがselenium
なければ、基本的なケースでは、フォーム自体を見て、を探しますinputs
。たとえば、を見てwww.reddit.com
、レンダリングされたページのソースを表示すると、次のフォームが見つかります。
<form method="post" action="https://ssl.reddit.com/post/login" id="login_login-main"
class="login-form login-form-side">
<input type="hidden" name="op" value="login-main" />
<input name="user" placeholder="username" type="text" maxlength="20" tabindex="1" />
<input name="passwd" placeholder="password" type="password" tabindex="1" />
<div class="status"></div>
<div id="remember-me">
<input type="checkbox" name="rem" id="rem-login-main" tabindex="1" />
<label for="rem-login-main">remember me</label>
<a class="recover-password" href="/password">reset password</a>
</div>
<div class="submit">
<button class="btn" type="submit" tabindex="1">login</button>
</div>
<div class="clear"></div>
</form>
ここにいくつかinput
の's- op
、、、およびuser
が表示されます。また、パラメータに注意してください。これは、フォームが投稿されるURLであり、したがって、ターゲットになります。したがって、最後のステップは、パラメーターをペイロードにパックし、それをリクエストとしてURLに送信することです。また、以下では、新しいを作成し、Cookieを処理する機能を追加し、ヘッダーも追加して、リクエストを実行するための少し堅牢なオープナーを提供します):passwd
rem
action
POST
action
opener
import cookielib
import urllib
import urllib2
# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# Add our headers
opener.addheaders = [('User-agent', 'RedditTesting')]
# Install our opener (note that this changes the global opener to the one
# we just made, but you can also just call opener.open() if you want)
urllib2.install_opener(opener)
# The action/ target from the form
authentication_url = 'https://ssl.reddit.com/post/login'
# Input parameters we are going to send
payload = {
'op': 'login-main',
'user': '<username>',
'passwd': '<password>'
}
# Use urllib to encode the payload
data = urllib.urlencode(payload)
# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)
# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()
これははるかに複雑になる可能性があることに注意してください。たとえば、GMailでもこれを行うことができますが、毎回変更されるGALX
パラメータ(パラメータなど)を取り込む必要があります。繰り返しますが、これがあなたが望んでいたものであるかどうかはわかりませんが、それが役立つことを願っています。