Вам необходимо отправить сообщение на правильный 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)