簡體   English   中英

使用python3和請求登錄推特

[英]logging into a twitter using python3 and requests

我有一個正在處理的項目,要求是使用用戶名和密碼登錄網站。 我必須用 python 完成,然后才能訪問網站的一部分,只有登錄的人才能訪問。我嘗試了一些編碼變體來做到這一點,但未能成功登錄然而。 這是我的編碼:

登錄到它的功能:

def session2(url):

#r = requests.get(url)
#ckies = []

#print("here are the cookies for twitter:\n")
#for cky in r.cookies:
#    print(cky.name, cky.value)
#    ckies.append(cky)

s = requests.Session()

session = s.get(url, verify=False)
print("\nheaders from site\n")
print(session.headers)

tree = html.fromstring(session.text)
# extract the auth token needed to login along with username and password
auth_token = list(set(tree.xpath("//input[@name='authenticity_token']/@value")))[0]
uname = "username"
pword = "password"
username = 'session[username_or_email]'
password = 'session[password]'
# payload = {name of username variable : string you want, name of password variable:
# string you want, name of auth token: string gotten from session
payload = dict(username = uname, password = pword , authenticity_token = auth_token)
header = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'}
#do post request
# might have to change headers to be a header for chrome
response = s.post(
    url,
    data = payload,
    #headers = dict(referer = url)
    headers = header
)
print("\nheaders post\n")
print(response.request.headers)
session = s.get("http://www.twitter.com/username/followers", verify=False)
print("\nheaders get\n")
print(session.headers)
print("\nhtml doc\n")
print(session.text)
return session

調用它的代碼:

url = "http://www.twitter.com/login"
sessions = session2(url)

當您檢查它時,網站上的用戶名看起來像這樣:

<input class="js-username-field email-input js-initial-focus" type="text" name="session[username_or_email]" autocomplete="on" value="" placeholder="Phone, email or username">

密碼部分/令牌部分如下所示:

<input class="js-password-field" type="password" name="session[password]" placeholder="Password">

<input type="hidden" value="ef25cb09a8c7fe16c54e3df099e206e605b1170a" name="authenticity_token">

我知道身份驗證令牌會發生變化,這就是我從函數中獲取它的原因。 當我嘗試運行它時,它只會轉到主頁而不是我需要的頁面。

我認為的一個問題是,當我打印出我在帖子中發送的標題時,它說:

{'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Accept': ' / ', 'User-Agent': 'python-requests/2.9.1'}

我以為我改成了 chrome 的標題,但它似乎沒有堅持下去。

另外,我知道如果我使用 Oauth,有一種方法,但我不允許使用它,我必須根據能夠像使用瀏覽器一樣登錄來這樣做。

你能告訴我我所做的是否有任何問題,以及如何解決它的任何提示嗎? 我已經嘗試使用請求和登錄來解決其他堆棧溢出問題,但這些也不起作用。

編輯:好的,我做了一個 response.request.headers,它出現了正確的標題,我認為,所以我不認為這是問題所在

它打印的標題:

 {'Accept': '*/*', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36', 'Cookie': '_twitter_sess=some huge amount of number/letters; guest_id=v1%3A147509653977967101', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate'}

這將使您登錄:

import requests
from bs4 import BeautifulSoup

username = "uname"
password = "pass"
# login url
post = "https://twitter.com/sessions"
url = "https://twitter.com"

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


with requests.Session() as s:
    r = s.get(url)
    # get auth token
    soup = BeautifulSoup(r.content, "lxml")
    AUTH_TOKEN = soup.select_one("input[name=authenticity_token]")["value"]
    # update data, post and you are logged in.
    data["authenticity_token"] = AUTH_TOKEN
    r = s.post(post, data=data)
    print(r.content)

您可以查看我們是否使用我自己的帳戶運行它,我們從我的個人資料中獲取我的名字:

In [30]: post = "https://twitter.com/sessions"

In [31]: url = "https://twitter.com"

In [32]: data = {"session[username_or_email]": username,
   ....:         "session[password]": password,
   ....:         "scribe_log": "",
   ....:         "redirect_after_login": "/",
   ....:         "remember_me": "1"}

In [33]: 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, "lxml")
   ....:         print(soup.select_one("b.fullname"))
   ....:     

<b class="fullname">Padraic Cunningham</b>

請注意,每次登錄時,您都會收到我們注意到您最近登錄的帳戶...電子郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM