2016-08-14 53 views
-1

如何在python3中使用請求登錄tumblr? 這是我的代碼,但它不能很好的工作,並返回到登錄頁面。 我使用request.post來發布登錄表單數據,並失敗。python3登錄網站tumblr.com

import requests 
from bs4 import BeautifulSoup 

start_url = 'https://www.tumblr.com' 

# set a session for request 
s = requests.Session() 
s.headers.update({'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0', 'accept-language': 'zh-CN,zh;'} 
       ) 

# get the form_key for login_in 
r = s.get(start_url) 
login_soup = BeautifulSoup(r.text, 'lxml') 
hidden_div = login_soup.find('div', class_='form_row_hidden').find_all('input') 
key_dict = {} 

for input_tag in hidden_div: 
    tmp_dict = input_tag.attrs 
    key_dict.update({tmp_dict['name']: tmp_dict['value']}) 

user_data_dict = {'determine_email': '×××××××××', 
        'user[email]': '××××××××', 
        'user[password]': '××××××××', 
        'user[age]': '', 
        'tumblelog[name]': ''} 

key_dict.update(user_data_dict) 


# log in tumblr 
r_login=s.post(start_url, headers=headers, data=key_dict) 

home_soup=BeautifulSoup(r.text, 'lxml') 
print(home_soup) 
# the output is still the log-in page. 
+0

你的例外是什麼?爲什麼不使用[pytumblr](https://github.com/tumblr/pytumblr)API庫? – cuongnv23

+0

我可以只使用請求來登錄tumblr而不是使用API​​嗎? – aquasamss

+0

你可以。首先,您必須向用戶代理商提出tumblr.com/login的獲取請求,就像您一樣。在這個請求的結果中,你必須解析並得到'form_key'的值,這個值用來做一個真正的post來登錄。獲得'form_key'之後,將其包含在'key_dict'中併發布信息。爲確保您已經登錄,請向https://www.tumblr.com/svc/post/get_post_form_builder_data發送獲取請求以確認。 – cuongnv23

回答

2

你幾乎是目標。

首先,你必須要求tumblr登錄頁面(https://tumblr.com/login)。 (你沒有)

然後,你必須解析html頁面,並得到form_key值。該值用於進行真正的登錄。

最後,請POST請求,與有效載荷:

{'user[email]': your_mail, 
'user[password]': your_pass, 
'form_key': form_key 
} 

下面是在Python 2示例代碼,但我不使用BeautifulSoup(你問到只使用requests;)

In [1]: import requests 

In [2]: from lxml import html 

In [3]: url = 'https://www.tumblr.com/login' 

In [4]: ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36' 

In [5]: headers = {'User-Agent': ua} 

In [6]: s = requests.session() 

In [7]: lg = s.post(url, headers=headers) 

In [8]: lg_html = html.fromstring(str(lg.text)) 

In [9]: form_key = lg_html.xpath("//meta[@name='tumblr-form-key']/@content")[0] 

In [10]: payload = {'user[email]': 'your_mail', 
    ....:   'user[password]': 'your_pass', 
    ....:   'form_key': form_key} 

In [11]: # real login 

In [12]: s.post(url, headers=headers, data=payload) 
Out[12]: <Response [200]> 

In [13]: print s.get('https://www.tumblr.com/svc/post/get_post_form_builder_data').text 
{"meta":{"status":200,"msg":"OK"},"response":{"channels":[{"name":"your_name","tags":[]}],"limits":{"videoSecondsRemaining":300,"preuploadPhotoUsed":0,"preuploadAudioUsed":0,"inlineEmbedsPerPost":5}}} 
+0

請包括一個完整的答案,不只是引用評論。現在,這不是一個真正的答案 –

+0

爲什麼這不是一個答案? OP詢問如何使用'requests'來登錄tumblr,並且我的代碼可以做到這一點。 – cuongnv23

+0

你應該多解釋一下。包括你在評論中說的話,只是描述它是如何工作的。 –