python-3.x - 使用 python3 和请求登录 Twitter

标签 python-3.x session python-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">

密码部分/ token 部分如下所示:

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

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

我知道身份验证 token 发生了变化,这就是为什么我让它从函数中获取它。当我尝试运行它时,它只是转到主页而不是我需要的页面。

我认为的一个问题是,当我打印出我在帖子中发送的标题时,它会显示:

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

我以为我改成了chrome的标题,但它似乎没有坚持。

另外,我知道如果我使用 Oauth,有一种方法,但我不允许使用它,我必须基于能够像使用浏览器一样登录来做到这一点。

你能告诉我我所做的事情是否有什么问题,以及如何解决它的任何提示吗?我尝试过使用请求和登录来解决其他堆栈溢出问题,但这些也不起作用。

编辑:好的,我做了一个response.request.headers,我认为它带有正确的 header ,所以我认为这不是问题

打印的标题:

 {'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>

请注意,每次登录时,您都会收到我们注意到您的帐户最近登录过...电子邮件。

关于python-3.x - 使用 python3 和请求登录 Twitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757096/

相关文章:

python - 请求 UnicodeEncodeError : error

python - 如何删除Python列表中小于特定字符数的所有元素

python - 文件 I/O 操作会释放 Python 中的 GIL 吗?

python-3.x - 从元数据动态创建 DataFrame 列

python - 简单的向下条形图(Python 3)

amazon-web-services - 没有粘性 session ,Vaadin 不能在云中使用吗?

python - 保存麻烦的网页并导入回Python

python - usn 解析器将类似 json 的数据转换为 pandas 数据帧

php - 登录成功后运行另一个查询

c# - 在 .ashx 文件中创建了一个 session 并想在 .aspx 页面中访问但我发现了空值