2016-07-05 21 views
1

Я пытаюсь получить доступ к защищенной странице в twitter (например, свой собственный список) через urllib2 в Python, но этот код всегда возвращает меня на страницу входа. Любая идея, почему это так?Не удается получить доступ к странице входа с urllib2

(я знаю, что могу использовать щебетать API и прочее, но хотите узнать в целом, как это делается)

Спасибо, Рой


Код:

url = "https://twitter.com/login" 
protectedUrl = "https://twitter.com/username/likes 

USER = "myTwitterUser" 
PASS = "myTwitterPassword" 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
opener.addheaders = [('User-Agent', 'Mozilla/5.0'), ("Referer", "https://twitter.com")] 

hdr = {'User-Agent': 'Mozilla/5.0', "Referer":"https://twitter.com"} 
req = urllib2.Request(url, headers=hdr) 
page = urllib2.urlopen(req) 

html = page.read() 
s = BeautifulSoup(html, "lxml") 
AUTH_TOKEN = s.find(attrs={"name": "authenticity_token"})["value"] 

login_details = {"session[username_or_email]": USER, 
       "session[password]": PASS, 
       "remember_me": 1, 
       "return_to_ssl": "true", 
       "scribe_log": "", 
       "redirect_after_login": "/", 
       "authenticity_token": AUTH_TOKEN 
       } 

login_data = urllib.urlencode(login_details) 
opener.open(url, login_data) 
resp = opener.open(protectedUrl) 
print resp.read() 

ответ

0

Вам необходимо отправить сообщение на правильный URL-адрес, который равен "https://twitter.com/sessions", также необходимо использовать opener, когда вы делаете первоначальный запрос, чтобы получитьтак page = opener.open(req) вместо page = urllib2.urlopen(req) поэтому мы получаем печенье нужно:

url = "https://twitter.com/" 
USER = "username" 
PASS = "pass" 
post = "https://twitter.com/sessions" 
likes = "https://twitter.com/{}/likes" 

# cookies 
cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 

# headers 
head = { 
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64)"} 

# create request 
req = urllib2.Request(url, headers=head) 
# must use the opener so the cookies persist 
page = opener.open(req) 
html = page.read() 

# extract the authenticity_token 
s = BeautifulSoup(html, "lxml") 
AUTH_TOKEN = s.select_one("input[name=authenticity_token]")["value"] 

login_details = {"session[username_or_email]": USER, 
       "session[password]": PASS, 
       "remember_me": 1, 
       "redirect_after_login": "/", 
       "authenticity_token": AUTH_TOKEN 
       } 
# encode form data 
login_data = urllib.urlencode(login_details) 
r = opener.open("https://twitter.com/sessions", login_data) 

# get likes now we have logged in 
resp = opener.open(likes.format(USER)) 

print(resp.read()) 

Если запустить код, используя один из моих щебет счета без каких-либо подобных:

In [72]: login_details = {"session[username_or_email]": USER, 
    ....:     "session[password]": PASS, 
    ....:     "remember_me": 1, 
    ....:     "redirect_after_login": "/", 
    ....:     "authenticity_token": AUTH_TOKEN 
    ....:     } 

In [73]: # encode form data 

In [74]: login_data = urllib.urlencode(login_details) 

In [75]: r = opener.open("https://twitter.com/sessions", login_data) 

In [76]: # get likes now we have logged in 

In [77]: resp = opener.open(likes.format(USER)) 

In [78]: soup = BeautifulSoup(resp.read(),"lxml") 

In [79]: print(soup.select_one("p.empty-text")) 
<p class="empty-text"> 
     You haven't liked any Tweets yet. 

    </p> 

Вы можете видеть, что мы получаем успешно на страницу, которую мы хотим.

Проделав то же самое с requests.Session() объекта, код имеет намного меньше происходит:

USER = "username" 
PASS = "pass" 
post = "https://twitter.com/sessions" 
likes = "https://twitter.com/{}/likes" 
url = "https://twitter.com" 

data = {"session[username_or_email]": USER, 
     "session[password]": PASS, 
     "scribe_log": "", 
     "redirect_after_login": "/", 
     "remember_me": "1"} 

post = "https://twitter.com/sessions" 

with requests.Session() as s: 
    r = s.get(url) 
    soup = BeautifulSoup(r.content, "lxml") 
    AUTH_TOKEN = soup.select_one("input[name=authenticity_token]")["value"] 
    data["authenticity_token"] = AUTH_TOKEN 
    r = s.post(post, data=data) 
    soup = BeautifulSoup(r.content) 
    print(s.get("https://twitter.com/{}/likes".format(USER)).content) 
-1

Из опыта я имел с веб-сайтов, как это, вам нужно использовать полные заголовки HTTP, включая:

  • принимают
  • Accept-Encoding
  • принимает язык
  • ссылающейся
  • обновления нестабильным-запросы
  • ...
  • User-Agent

удалить только печенье из заголовка.

Вам также необходимо создать сеанс и обработать файлы cookie, поскольку твиттер должен быть похож на facebook. Мне лично нравится больше использовать «запросы», так как вы можете создать сеанс и легко использовать файлы cookie.

вы можете сделать что-то вроде этого:

import requests 
form time import sleep 

hd = {'h11': 'h12', 'h21': 'h22', 'h31': 'h32'} 
usrdata = {'user': USER, 'pass': PASS} 

sess = requests.Session() 
req = sess.get('http://www.twitter.com') ## to start session 
sleep(1) 
req = sess.post('https://twitter.com/sessions', data=usrdata, headers=hd) 

Надеется, что это помогает.

Смежные вопросы