2012-09-22 11 views
1

파이썬 스크립트를 사용하여 위키 피 디아에 로그인하려고 시도하지만 지침 here에도 불구하고 작동하지 않습니다.파이썬으로 웹 사이트에 로그인

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') 

"로그인하지 않았습니다."페이지가 표시됩니다. 같은 부정적인 결과를 가진 스크립트로 다른 사이트에 로그인을 시도했습니다. 나는 그것이 쿠키와 관련이 있다고 의심한다. 그렇지 않으면 나는 여기서 아주 간단하게 무언가를 놓치고있다. 그러나 나는 그것을 찾을 수 없다.

+2

WebShop 또는 유사한 도구를 사용하여 웹 사이트를 통해 로그인 할 때 모든 패킷을 검사하여 웹 응용 프로그램이 실제로 서버에 보내는 것을 확인해야합니다. – LavaScornedOven

+0

'live http header firefox' 또는'chrome developer tools'를 사용하여 로그인 버튼을 클릭하면 모든 요청을보실 수 있습니다. 내가 보았 듯이'login_data'에서 몇 가지를 놓치고 있습니다. – RanRag

+0

흠, 그렇다면 먼저 토큰을 얻어 내 사용자 이름과 암호와 함께 보내야한다는 뜻입니까? – Conti

답변

1

당신이 (Charles Proxy와 같은 도구의 도움으로) 로그인 URL로 전송 원시 요청을 검사하는 경우, 당신은 실제로 4 개 매개 변수를 보내는 것을 볼 수 있습니다 : wpName, wpPassword, wpLoginAttemptwpLoginToken을. 첫 번째 3 개는 정적이며 언제든지 채울 수 있지만 네 번째 것은 로그인 페이지의 HTML에서 파싱해야합니다. 로그인 할 수 있으려면이 값을 다른 3 개와 함께 로그인 URL에 게시해야합니다. 여기

는 작업 코드는 RequestsBeautifulSoup을 사용하고 있습니다 :

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') 
+0

신난다, 그 트릭을 했어! 고맙습니다. :) 내 구문 분석을 위해 이미 BeautifulSoup을 사용하고 있지만 요청에 대해서는 알지 못했습니다. 그것은 urllib보다 훨씬 부드럽게 보입니다. 지금부터 그걸 사용할거야. – Conti

+0

@Conti 기꺼이 도와 드리겠습니다. 예'요청은 굉장합니다. :) –

+0

@KayZhu - 존재하지 않는 속성을 허용하기 위해 .get() 액세스 메소드를 전환하십시오. 특히 어떤 양식은 모든 입력 요소에 "이름"속성을 할당하지 않습니다. 따라서 n.get ('name', '')은 KeyMissing 예외를 throw하지 않고 이들을 처리합니다. – jmetz

0

POST 요청에 헤더 Content-Type: application/x-www-form-urlencoded을 추가해야합니다.

1

이 두 라인

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

내가 바로 로그인에있어 경우에 이해할 수 있어야 추가? "계속 주시 목록의 항목을 보거나 편집하려면 로그인하십시오." 하지만 위에서 주어진 깨끗한 코드와 로그인 및 암호를 사용하고 있습니다.

어디서 실수입니까? .

0

나는 또한 다음과 같은 라인을 추가로 로그인하지 않은 자신을 볼

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

if page.find('Not logged in'): 
    print 'You are not logged in. :(' 
else: 
    print 'YOU ARE LOGGED IN! :)' 
1

위키 백과는 이제 다른 매개 변수를 HTTPS 강제로 요구하고, wpLoginAttempt이 wploginattempt되었다, 여기 KZ 초기 대답의 업데이트 된 버전은 다음과 같습니다

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', 
    'wpEditToken': "+\\", 
    'title': "Special:UserLogin", 
    'authAction': "login", 
    'force': "", 
    'wpForceHttps': "1", 
    'wpFromhttp': "1", 
    #'wpLoginToken': '', 
    } 

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

    response_post = s.post('https://en.wikipedia.org/w/index.php?title=Special:UserLogin&action=submitlogin&type=login', 
          data=payload) 
    response = s.get('https://en.wikipedia.org/wiki/Special:Watchlist') 
관련 문제