2016-09-16 271 views
2

我想使用Python登录到我的Google帐户,但是当我打印html结果时,它不显示我的用户名。这就是我知道它没有登录。使用Python登录Google帐户?

如何使用Python登录到谷歌?到目前为止,我已经看到了两个受欢迎的模块,用于这个urllib.request或Requests,但是没有人帮助我登录到巨人Google。

代码:

import requests 

# Fill in your details here to be posted to the login form. 
payload = { 
'Email': '[email protected]', 
'Passwd': 'accountemailpassword' 
} 

# Use 'with' to ensure the session context is closed after use. 
with requests.Session() as s: 
p = s.post('https://accounts.google.com/signin/challenge/sl/password', data=payload) 
# print the html returned or something more intelligent to see if it's a successful login page. 
print(p.text) 

登录表单信息:

<input id="Email" name="Email" placeholder="Enter your email" type="email" value="" spellcheck="false" autofocus=""> 

<input id="Passwd" name="Passwd" type="password" placeholder="Password" class=""> 

<input id="signIn" name="signIn" class="rc-button rc-button-submit" type="submit" value="Sign in"> 

当我在控制台登陆会给我4链接请求,所以如果我甚至使用了正确的我不知道URL。

Request URL:https://accounts.google.com/signin/challenge/sl/password 
Request Method:POST 
Status Code:302 

Request URL:https://accounts.google.com/CheckCookie?hl=en&checkedDomains=youtube&checkConnection=youtube%3A503%3A1&pstMsg=1&chtml=LoginDoneHtml&service=youtube&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fhl%3Den%26feature%3Dsign_in_button%26app%3Ddesktop%26action_handle_signin%3Dtrue%26next%3D%252F&gidl=CAASAggA 
Request Method:GET 
Status Code:302 

Request URL:https://accounts.google.com/CheckCookie?hl=en&checkedDomains=youtube&checkConnection=youtube%3A503%3A1&pstMsg=1&chtml=LoginDoneHtml&service=youtube&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fhl%3Den%26feature%3Dsign_in_button%26app%3Ddesktop%26action_handle_signin%3Dtrue%26next%3D%252F&gidl=CAASAggA 
Request Method:GET 
Status Code:302 

request URL:https://www.youtube.com/signin?hl=en&feature=sign_in_button&app=desktop&action_handle_signin=true&next=%2F&auth=xAMUT-baNWvXgWyGYfiQEoYLmGv4RL0ZTB-KgGa8uacdJeruODeKVoxZWwyfd-NezfxB6g. 
Request Method:GET 
Status Code:303 

我目前使用Python 3.4.2 &不要使用谷歌的API计划。

+1

我建议OAuth发送纯文本密码。 http://stackoverflow.com/questions/10271110/python-oauth2-login-with-google –

回答

0

除了使用oAuth或他们的API,谷歌有像captcha等东西,以防止机器人暴力和猜测密码。

你可以尝试欺骗用户代理,但我仍然相信这是静默。

+0

会像https://pypi.python.org/pypi/fake-useragent结束工作 –

+0

你实际上并不需要一个用户代理;) –

1

这将让你登录:

from bs4 import BeautifulSoup 
import requests 


form_data={'Email': '[email protected]', 'Passwd': 'your_password'} 
post = "https://accounts.google.com/signin/challenge/sl/password" 

with requests.Session() as s: 
    soup = BeautifulSoup(s.get("https://mail.google.com").text) 
    for inp in soup.select("#gaia_loginform input[name]"): 
     if inp["name"] not in form_data: 
      form_data[inp["name"]] = inp["value"] 
    s.post(post, form_data) 
    html = s.get("https://mail.google.com/mail/u/0/#inbox").content 

如果您保存并在浏览器中打开HTML中,你会看到Loading [email protected],你需要使用Javascript实际加载的页面。你可以通过输入一个错误的密码进一步验证,如果你确实会再次看到登录页面的html。

你可以在浏览器中看到比你提供的更多的贴子,这些值包含在gaia_loginform中。

<form novalidate method="post" action="https://accounts.google.com/signin/challenge/sl/password" id="gaia_loginform"> 
    <input name="Page" type="hidden" value="RememberedSignIn"> 
    <input type="hidden" name="GALX" value="5r_aVZgnIGo"> 
    <input type="hidden" name="gxf" value="AFoagUUk33ARYpIRJqwrADAIgtChEXMHUA:33244249"> 
    <input type="hidden" id="_utf8" name="_utf8" value="&#9731;"/> 
    <input type="hidden" name="bgresponse" id="bgresponse" value="js_disabled"> 
    <input type="hidden" id="pstMsg" name="pstMsg" value="0"> 
    <input type="hidden" id="dnConn" name="dnConn" value=""> 
    <input type="hidden" id="checkConnection" name="checkConnection" value=""> 
    <input type="hidden" id="checkedDomains" name="checkedDomains" 
     value="youtube"> 

我显然不会分享我的电子邮件或密码,但我可以有存储在一个变量my_mail下面我的电子邮件,你可以看到,当我们测试了这个问题,它是存在的:

In [3]: from bs4 import BeautifulSoup 

In [4]: import requests 

In [5]: post = "https://accounts.google.com/signin/challenge/sl/password" 

In [6]: with requests.Session() as s: 
    ...:   soup = BeautifulSoup(s.get("https://accounts.google.com/ServiceLogin?elo=1").text, "html.parser") 
    ...:   for inp in soup.select("#gaia_loginform input[name]"): 
    ...:    if inp["name"] not in form_data: 
    ...:      form_data[inp["name"]] = inp["value"] 
    ...:   s.post(post, form_data) 
    ...:   

In [7]: my_mail in s.get("https://mail.google.com/mail/u/0/#inbox").text 
Out[7]: True 
+0

我设置变量my_mail =我的电子邮件和输出返回什么都没有 my_mail =“[email protected]” –

+0

输出不可能是没有什么。根据第一个代码示例,按照发布的代码运行代码,创建form_data字典。 –

+0

检查这张图片的代码,并告诉我,如果你可以发现我做错了什么,这将是非常感激http://imgur.com/lDgt8IM –

相关问题