2016-09-28 5 views
0

私は、私が作業しているプロジェクトを持っており、要件はユーザー名とパスワードを使ってウェブサイトにログインすることです。私はPythonでそれを行う必要がありますし、ログインしている人にしかアクセスできないサイトの一部にアクセスできるようにしなければなりません。これを行うためにいくつかのバリエーションを試してみましたが、まだ。ここに私のコードは次のとおりです。python3とリクエストを使用してツイッターにログインする

それにログインする機能:

デフセッション2(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"> 

私はそれが機能からそれを得る持っている理由である認証トークンの変更を、知っています。これを実行しようとすると、必要なページではなくメインページに移動します。

{ 'エンコーディングを受け入れる]::「GZIPを、収縮させる」、「接続」:「キープ思う

一つの問題は、私はポストに送るヘッダを印刷するとき、それが言うことです': '/'、 'のUser-Agentを': '」、' 受け入れ生きているのpython-要求を/ 2.9.1を'}私はクロームのヘッダーに変更と思ったが、固執していないよう

はまた、私は私がのOauthを使用する場合の方法があるけど、私はそれを使用することはできませんよ、私は、ブラウザを使用していますようにログインすることができることに基づいて、それをしなければなりません。

私がやったことに何か問題があるかどうか、それを修正する方法のヒントがありますか?私は要求とログインを使用して他のスタックオーバーフローの問題を試みましたが、それらはうまくいきませんでした。

EDIT:[OK]を、私は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'} 
+0

はかなり複雑な手順である、彼らはその理由のためのAPIを持っています。 *私はどこから来ているブラウザを使っているようにログインすることができるかに基づいてそれをしなければならないのですか? –

+0

私のアドバイザー/上級者は、Webクローラーやボットのようにする必要があると言います。また、パスワードとユーザー名を入力するためにgoogle chromeを使用しているのと同じ方法でログインする必要があります。彼はライブデータの場合と同じようにAPIを使用しないようにと言ってくれました。彼は現在のデータではなく、数日前のデータを取得したいと考えています。 – user2827286

+0

ブラウザが開かないようにしていますか?私は試してみたいと思うし、それがうまくいくと彼はそれでうまくいくと思う。主なものは、pythonを使ってログインし、データを取得することです。 – user2827286

答えて

1

これはであなたをログに記録します。

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> 

あなたがログインするたびにご注意ください。あなたのアカウントの最近のログインに気付きました... email。ツイッターにログイン

+0

それは働いて、ありがとう。私はほぼ一週間それを周りに頭を抱えていた。今私は私のログインと美しいスープを使用して私が欲しいデータを取得するために私のログインを使用することができます。今私がしなければならないのは、htmlタグやものを使わずにドキュメントに印刷することだけです。あなたの助けをもう一度ありがとう。 – user2827286

+0

心配はいりません。どうぞよろしくお願いいたします。 –

関連する問題