LoginSignup
3
3

More than 3 years have passed since last update.

ヤフービジネスにSelenium Pythonでログインする 

Posted at

ヤフービジネスのIDとパスワード数百件。
はたしてこのエクセルリストのIDとパスワードでログインできるのでしょうか。
パスワードを変更してもエクセルのリストが更新されないこと多数。
そこで、スクレイピングでログイン確認をします。

簡単かと思いきや少しはまったのでメモします。

結論

直接ログイン画面からログインしない。ヤフー内の別のページからログイン画面に遷移してログインする。

例えば
直接ログイン画面に遷移せず
https://business.yahoo.co.jp/

https://login.bizmanager.yahoo.co.jp/login
の順番で遷移します。

ヤフービジネスログイン画面のソースをみてみると多数のhidden項目があります。
この.crumbが空だとログインできない(何もおこらない)仕組みになっているようです。
なのでhiddenの.crubが空の状態で正しいIDとパスワードを入力しても、何もおこらないし、間違ったIDとパスワードを入力しても「IDとパスワードが違います」の画面すら表示されないのです。

ヤフービジネスログイン画面 hiddenの.crumbに値なし
<form method="post" action="/login.php" autocomplete="off" name="login_form" onsubmit="return checkMultipleSubmit();">
<input type="hidden" name="url" value="https://business.yahoo.co.jp/" data-rapid_p="1">
<input type="hidden" name="action" value="login" data-rapid_p="2">
<input type="hidden" name=".flow" value="" data-rapid_p="3">
<input type="hidden" name=".crumb" value="" data-rapid_p="4">

https://business.yahoo.co.jp/

https://login.bizmanager.yahoo.co.jp/login
の順番で遷移すると
hiddenの.crubに値が入力されています。

ヤフービジネスhiddden.crumbにセッションの値が設定された後
<form method="post" action="/login.php" autocomplete="off" name="login_form" onsubmit="return checkMultipleSubmit();">
<input type="hidden" name="url" value="https://business.yahoo.co.jp/" data-rapid_p="1">
<input type="hidden" name="action" value="login" data-rapid_p="2">
<input type="hidden" name=".flow" value="" data-rapid_p="3">
<input type="hidden" name=".crumb" value="dD14Q0R0ZkImc2s9eGlqMXh3dTRLcVJzM29KQ3pLMlIwaHNVcVZvLQ==" data-rapid_p="4">

この状態になった後にログインすればスクレイピングでログインできるようになります。

環境
Windows10
Python3.8.3
Selenium
グーグルクローム

・driverにクロームドライバーが設定されているものとします。
・あまりにも早く進むとブロックされてしまうかもしれないのであえてtime.sleepを入れています。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#直接ログイン画面に進まない
driver.get("https://business.yahoo.co.jp/")
driver.get("https://login.bizmanager.yahoo.co.jp/login.php")    

#確実にsendkeyするために関数を作成しました。
move_textbox_id(driver,"user_name","ここにID")        
move_textbox_id(driver,"password","ここにパスワード")      

#早く進みすぎてブロックされるといやなのでゆっくりと進みます。
time.sleep(1)     

element = driver.find_element_by_xpath("//*@id='bidlogin']/div/div/form/fieldset/div[3]/input")
element.click()

try:
  #ログアウトのリンクテキストを発見できたらログインOKにしました。
   WebDriverWait(driver,8).until(EC.presence_of_element_located((By.LINK_TEXT, "ログアウト")))
except:
  #なにかしらの理由でログアウトリンクを発見できない場合の処理

def move_textbox_id(driver, id, atai):
    start = time.time()
    while driver.find_element_by_id(id).get_attribute('value')!=atai:

        driver.find_element_by_id(id).clear()
        time.sleep(1)

        #センドキーで値を入力する
        driver.find_element_by_id(id).send_keys(atai)
        time.sleep(1)

        if time.time()-start > 5 :
            return False   
    return True

ただたんにログインするだけだから簡単かと思いきや大変でした。
とくにシークレットモードで操作している場合、直接ログイン画面からログインすると絶対にログインできないです。
確かにスクレイピングでなくて手作業でログインするときも1回目のログインははじかれてました。
コピペに全角でもまざっていたのかと思って気にもとめないでいましたが。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3