質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

607閲覧

Seleniumで特定のサイトへのログインができない

shirachin1015

総合スコア6

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2023/02/25 11:46

編集2023/02/26 16:17

問題

サイトに自動ログインするプログラムを作成していますが、うまくログインできません。

とあるアプリケーションを、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点になります。よろしくお願いします。


こんなことでなんでつまづいているか情けなくなりますが、どなたかアドバイスいただけると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PondVillege

2023/02/25 12:24

> ローカルとサーバーでSeleniumの動作に異なるもの リクエストに使われる発信元IPアドレスはローカルPCのものとサーバのもので異なるはずです
shirachin1015

2023/02/25 13:11

すみません。この文章で言いたかったことは、Seleniumのsend_keysの動きに違いがあるのかということを言いたかったです。 それとも、発信元IPの違いでログインできるかどうかに違いがあるのでしょうか?
PondVillege

2023/02/25 23:19

そういうことだったのですね,すません. 発信元が有害と判断されればアクセスを弾かれたりすることから,プロキシサーバを経由させることで発信元を別IPにしたスクレイピングをよく見かけます. IPアドレスで弾かれるケースではページ取得からままならないはずなので,ログインが出来ないというのはまだ他に原因があるかもしれませんね
guest

回答1

0

自己解決しました。

同じようなファイルを新しく作り直し、その時に

options.add_argument('--user-data-dir=' + str(user_data_dir))

を書かずに実行したらうまく動作しました。
原因は、全くもって不明ですが解決してよかったです。
失礼しました。
コメントいただいたps_aux_grepさん、有難うございました。

投稿2023/02/26 14:05

shirachin1015

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shirachin1015

2023/02/26 16:05

追記(2/27 1:00)にある通り、自己解決を撤回します。 それにともなって、今この回答の削除依頼を出しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問