ヤフービジネスのIDとパスワード数百件。
はたしてこのエクセルリストのIDとパスワードでログインできるのでしょうか。
パスワードを変更してもエクセルのリストが更新されないこと多数。
そこで、スクレイピングでログイン確認をします。
簡単かと思いきや少しはまったのでメモします。
結論
#直接ログイン画面からログインしない。ヤフー内の別のページからログイン画面に遷移してログインする。
例えば
直接ログイン画面に遷移せず
https://business.yahoo.co.jp/
↓
https://login.bizmanager.yahoo.co.jp/login
の順番で遷移します。
ヤフービジネスログイン画面のソースをみてみると多数のhidden項目があります。
この.crumbが空だとログインできない(何もおこらない)仕組みになっているようです。
なのでhiddenの.crubが空の状態で正しいIDとパスワードを入力しても、何もおこらないし、間違ったIDとパスワードを入力しても「IDとパスワードが違います」の画面すら表示されないのです。
<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に値が入力されています。
<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回目のログインははじかれてました。
コピペに全角でもまざっていたのかと思って気にもとめないでいましたが。