2

Python スクリプトを使用してウィキペディアにログインしようとしていますが、こちらの手順に従っても、うまくいきません。

import urllib
import urllib2
import cookielib

username = 'myname'
password = 'mypassword'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6")]
login_data = urllib.urlencode({'wpName' : username, 'wpPassword' : password})
opener.open('http://en.wikipedia.org/w/index.php?title=Special:UserLogin', login_data)
resp = opener.open('http://en.wikipedia.org/wiki/Special:Watchlist')

私が得るのは「あなたはログインしていません」ページだけです。スクリプトを使用して別のサイトにログインしようとしましたが、同じ否定的な結果が得られました。クッキーと関係があるか、信じられないほど単純なものが欠けているのではないかと思います。しかし、私はそれを見つけることができません。

4

5 に答える 5

2

これらの2行を追加

r = bs(response.content)
print r.get_text()

ログインしているかどうかはわかるはずですよね?「ウォッチリストのアイテムを表示または編集するには、ログインしてください」というメッセージが何度も表示されます。ただし、ログインとパスワードを使用して、上記のクリーンなコードを使用しています。

間違いはどこですか?

于 2013-11-03T22:27:19.540 に答える
2

( Charles Proxyなどのツールを使用して) ログイン URL に送信された生のリクエストを調べると、実際にはwpNamewpPassword、 のwpLoginAttempt4つのパラメータが送信されていることがわかりますwpLoginToken。最初の 3 つは静的でいつでも入力できますが、4 番目のものはログイン ページの HTML から解析する必要があります。ログインできるようにするには、他の 3 つに加えて、解析したこの値をログイン URL に投稿する必要があります。

Requestsと を使用した作業コードは次のBeautifulSoupとおりです。

import requests
from bs4 import BeautifulSoup as bs


def get_login_token(raw_resp):
    soup = bs(raw_resp.text, 'lxml')
    token = [n.get('value', '') for n in soup.find_all('input')
             if n.get('name', '') == 'wpLoginToken']
    return token[0]

payload = {
    'wpName': 'my_username',
    'wpPassword': 'my_password',
    'wpLoginAttempt': 'Log in',
    #'wpLoginToken': '',
    }

with requests.session() as s:
    resp = s.get('http://en.wikipedia.org/w/index.php?title=Special:UserLogin')
    payload['wpLoginToken'] = get_login_token(resp)

    response_post = s.post('http://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login',
                           data=payload)
    response = s.get('http://en.wikipedia.org/wiki/Special:Watchlist')
于 2012-09-22T22:51:14.570 に答える
0

Content-Type: application/x-www-form-urlencodedPOSTリクエストにヘッダーを追加する必要があります。

于 2012-09-22T21:14:29.717 に答える
0

また、次の行を追加したところ、ログインしていないように見えます。

page = response.text.encode('utf8')

if page.find('Not logged in'):
    print 'You are not logged in.  :('
else:
    print 'YOU ARE LOGGED IN!  :)'
于 2014-08-02T23:37:18.527 に答える