37

さて、私はこれをredditボットに使用していますが、どのWebサイトにログインするかを理解できるようにしたいと思います。それが理にかなっているなら...

異なるウェブサイトが異なるログインフォームなどを使用していることに気づきました。それでは、ウェブサイトごとにそれを最適化する方法をどのように理解すればよいですか?htmlファイルで何かを探す必要があると思いますが、何がわかりません。

Mechanizeやその他のライブラリ(他のすべての回答はここにあり、実際に何が起こっているのかを学ぶのに役立ちません)を使用したくないので、すべてがどのように正確に機能するかを自分で学びたいと思います。

urllib2のドキュメントは本当に私を助けていません。

ありがとう。

4

1 に答える 1

51

この方法でしばらくログインしていないと言って、この前置きをします。そのため、「受け入れられている」方法のいくつかを見逃している可能性があります。

これがあなたが求めているものかどうかはわかりませんが、のようなライブラリ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を処理する機能を追加し、ヘッダーも追加して、リクエストを実行するための少し堅牢なオープナーを提供します):passwdremactionPOSTactionopener

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パラメータ(パラメータなど)を取り込む必要があります。繰り返しますが、これがあなたが望んでいたものであるかどうかはわかりませんが、それが役立つことを願っています。

于 2012-12-19T15:23:17.930 に答える