2016-09-06 10 views
1

私はstackoverflowで投稿するのが初めてですので、噛まないでください!私は口座を作ることに頼る必要があったし、テーブル上で私の頭を叩くのを避けるために助けを求めなければならなかった...Pythonを使用してhttpsウェブサイトにログイン

私は次のウェブサイトhttps://account.socialbakers.com/loginにpythonでリクエストモジュールを使ってログインしようとしています。あたかもリクエストモジュールが行く場所だが、session.post()関数が私のために働いていないかのようです。フォームのこのタイプまたは事実についてユニークなものがあるかどうか、私はウェブサイトがhttpsで言うことができない次のポストHow to "log in" to a website using Python's Requests module?間に基づいて

<form action="/login" id="login-form" method="post" novalidate=""> 
     <big class="error-message"> 
     <big> 
      <strong> 
      </strong> 
     </big> 
     </big> 
     <div class="item-full"> 
     <label for=""> 
      <span class="label-header"> 
      <span> 
      Your e-mail address 
      </span> 
      </span> 
      <input id="email" name="email" type="email"/> 
     </label> 
     </div> 
     <div class="item-list"> 
     <div class="item-big"> 
      <label for=""> 
      <span class="label-header"> 
      <span> 
      Password 
      </span> 
      </span> 
      <input id="password" name="password" type="password"/> 
      </label> 
     </div> 
     <div class="item-small"> 
      <button class="btn btn-green" type="submit"> 
      Login 
      </button> 
     </div> 
     </div> 
     <p> 
     <a href="/email/reset-password"> 
      <strong> 
      Lost password? 
      </strong> 
     </a> 
     </p> 
     </form> 

://

ログインフォームは以下のとおりです。私は次のコードを試してみました他の人:

url = 'https://account.socialbakers.com/login' 
payload = dict(email = 'Myemail', password = 'Mypass') 
with session() as s: 
    soup = BeautifulSoup(s.get(url).content,'lxml') 
    p = s.post(url, data = payload, verify=True) 
    print(p.text) 

しかし、これはもう一度私にログインページを与え、私が持っている

で私をログに記録していないようです私は入力 '電子メール'と 'パスワード'の正しい名前を参照しているという形でチェックされています。私は明示的にクッキーを通過しようとしました。 verify = Trueパラメータは、Webサイトがhttpsであるという事実に対処する方法として提案されました。

私は、動作していないもの/リンクされた投稿のフォームとは異なるものを解決できません。

おかげ

編集:更新のp = pまでs.getは= s.post

+0

なぜPHPタグですか? – Chris

+0

申し訳ありませんが提案されました。削除された – hilton92

+0

リクエストを送信するときは、元のフォームのように 'POST'メソッドを使用する必要があります。 – martin

答えて

0

2つのことが出て見て。 1つは、s.postを使用してください。次に、フォームがネットワークタブを見て送信している他の値があれば、ブラウザでチェックする必要があります。

+0

http://stackoverflow.com/a/21930636/554807 2番目の点について詳述しています。 – GreenAsJade

+0

私はそれを見て、送られた唯一の2つは電子メールとパスワードでした。私はフォーム(上記の質問)のHTMLをチェックして、間違いなく2つの入力しかないと思います。私はまた、BeautifulSoupオブジェクトの隠れた入力を調べて、見つからなかった。 – hilton92

0

フォームはクリアテキストでパスワードを送信していません。送信前に暗号化またはハッシュ化しています。あなたがネットワーク経由形式でパスワードaaaaを入力すると、それはこの動作を複製せずに要求ライブラリを経由してログインする

b3744bb9a8adb2d67cfdf79095bd84f5e77500a76727e6d73eef460eb806511ba73c9f765d4b3738e0b1399ce4a4c4ac3aed17fff34e0ef4037e9be466adec61

ので、簡単な方法を送信します。

+0

ありがとう。私の最善のアプローチは何だろうと思いますか?私はinspect要素のネットワークログを介して送信されたものをチェックしてから、パスワードの暗号化されたバージョンを送信してみましたが、それもうまくいきませんでした。 – hilton92

+0

JavaScriptをページでトレースして、パスワードを暗号化/ハッシュしてから送信して、Pythonで再作成する方法を調べる必要があります。もう1つの選択肢は、JavaScriptを使ってブラウザ全体を模倣し、フォームに記入して仮想的にログインをクリックするという、Seleniumのようなものを使用することです。 –

2

ウェブサイトをチェックしました。平文として送信するのではなく、パスワードのSHA3ハッシュを送信しています。 headタグ内

<script src="/js/script.js"></script> 

:あなたは、メインページに含まれるscript.jsの線111でこれを見ることができます。

したがって、POSTリクエストを送信する際にこの動作を複製する必要があります。私はpysha3というライブラリを見つけたのです。

だから、まず

import sha3 
import hashlib 
import request 

url = 'https://account.socialbakers.com/login' 
myemail = "[email protected]" 
mypassword = hashlib.sha3_512(b"[email protected]").hexdigest() #take SHA3 of password 
payload = {'email':myemail, 'password':mypassword} 
with session() as s: 
    soup = BeautifulSoup(s.get(url).content,'lxml') 
    p = s.post(url, data = payload, verify=True) 
    print(p.text) 

下のコードを実行します(必要に応じてsudoを与える)pip install pysha3を実行することによってpysha3をインストールし、ページにログインし、正しいを取得します!

関連する問題