問題
サイトに自動ログインするプログラムを作成していますが、うまくログインできません。
とあるアプリケーションを、DjangoとSeleniumを用いて作成し、Herokuにデプロイしました。
その時、ローカルで動作していたログイン機能がデプロイすると動作しなくなりました。
Seleniumのプログラムは単体で動く(Djangoを介さない)ように設計しており、該当のPythonファイルを単体で実行しています。
使用しようとしているサイトは「ジモティー」です。
エラー内容
アクセス自体は問題ありませんが、ジモティーへログインしようとすると「メールアドレスかパスワードが間違っています。」と出ます。
該当のソースコード
Python3
1from selenium import webdriver 2from selenium.webdriver.chrome.options import Options 3from selenium.webdriver.common.by import By 4 5import pathlib 6import time 7 8appPath = pathlib.Path.cwd() / 'app' 9# appPath = '/AutoPost/app' 10 11options = Options() 12options.add_argument('--disable-gpu') 13options.add_argument('--headless=new') 14options.add_argument('--disable-desktop-notifications') 15options.add_argument("--disable-extensions") 16 17jmtyID = '***' 18jmtyPW = '***' 19 20try: 21 driver = webdriver.Chrome(options=options) 22 23 driver.get('https://jmty.jp/users/sign_in') 24 time.sleep(5) 25 IDForm = driver.find_element(By.CSS_SELECTOR, '#user_email') 26 PWForm = driver.find_element(By.CSS_SELECTOR, '#user_password') 27 IDForm.clear() 28 PWForm.clear() 29 IDForm.send_keys(jmtyID) 30 PWForm.send_keys(jmtyPW) 31 print('ID : ' + IDForm.get_attribute('value')) 32 print('PW : ' + PWForm.get_attribute('value')) 33 driver.find_element(By.CSS_SELECTOR, '#submit_button').click() 34 time.sleep(5) 35 36 print(driver.current_url) 37 if driver.find_elements(By.CSS_SELECTOR, '#main > div.system-message-component.alert > div'): 38 print(driver.find_element(By.CSS_SELECTOR, '#main > div.system-message-component.alert > div').text) 39 40finally: 41 driver.quit()
出力結果
(.env) *** AutoPost % python app/loginTest.py ID : *** PW : *** https://jmty.jp/my/posts (.env) *** AutoPost % heroku run python app/loginTest.py Running python app/loginTest.py on ⬢ ***... up, run.4360 (Basic) ID : *** PW : *** https://jmty.jp/users/sign_in メールアドレスかパスワードが違います。 パスワードの再設定はこちら
ジモティーログインエラーの再現画面(実際はヘッドレスモードでの運用です)
試したこと
初めは、メールアドレスとパスワードの保存に環境変数を使用しており、そこからソースコード直書きに変更したのが上のソースコードです。そこから試したことは、下記の通りです。
- メールアドレスとパスワードは本当に間違っていないか
コピペを使用し手作業でログインしたので間違っていないと思います。
- ローカルでの動作確認
ローカルでは、ほぼ同じソースコード(変更点はchromedriverのパス)で問題なく動作します。
Herokuのターミナルで動作させるとログインできなくなります。
- 他のサイトでのログイン
ソースコードにある通り、このDjangoアプリケーションの管理サイトにログインしようとするとそれは正常に動作します。
- 他の方法で解決を試みる
chromeのプロファイルパスを変更し、すでにchromeにログイン済みのデータをアップロードしようとしましたが、うまくいかずセキュリティー的にも危ない気がしたので断念しました。
疑問点
- このエラーの原因について
パスワードが間違っていないのならば、Selenium自体の記述は間違っていないはず(ローカルでは動作していることから)なので、ジモティーに機械でのログインを防御する何かがあるのかと思いましたが、ローカルだと動作することからその線は否定されたと思いました。また、ローカルとサーバーでSeleniumの動作に異なるものがあるのかとも考えましたが、管理サイトへのログインが正常にできていることから、この線も否定されると思います。唯一動作上で引っかかっていることは、サーバー側でchromeのプロファイルパスの設定ができているにも関わらず、管理画面のログイン状態が維持できていなかったことです。これには、Herokuはファイルの保存ができない?みたいな記事を何処かで見つけたので、その辺が関係しているのかなって思いました。
- プロファイルがアップロードできないことについて
この点に関しては、セキュリティーの観点から諦めたのでおまけ程度ですが、開発にvscodeを使用しているのですがgit pushを行ってもフォルダ名が通常に戻らず、緑のままになっていました。これはvscodeが反映できていないのかgitがうまくやってくれていないのかわからず、この原因も不明のままです。
補足情報(FW/ツールのバージョンなど)
Python 3.10.10
chromedriver==2.24.1
dj-database-url==1.2.0
Django==4.1.6
django-heroku==0.3.1
gunicorn==20.1.0
selenium==4.8.0
追記(2/27 1:00)
一時自己解決にしましたが、思い違いで解決できていなかったので、編集して再投稿としました。
編集内容としては、
- ソースコードの簡略化
実際に、今まで調べてきて簡略化できるところや不要なところ、自分で色々なことを試す上で編集している箇所を示すため、ソースコードの中身を大幅に変更しました。
- 出力結果の掲示
エラーメッセージが出てないといえ、表示結果がないのは情報が足りないと思い追加しました。
の2点になります。よろしくお願いします。
こんなことでなんでつまづいているか情けなくなりますが、どなたかアドバイスいただけると嬉しいです。
よろしくお願いします。
