クッキー(_forum_sessionおよび_t)をSeleniumとPythonで生成するコードを作成しましたが、この場合も電話番号とOPTを手動で入力して検証する必要があります。コードでクッキーの生成を完全に自動化したいのですが、何も手動で入力したくありません。これをどのように達成できますか?
そのクッキーを持つことで、どのような問題を解決しようとしているのか、バックアップして説明してもらえますか?
何を達成しようとしていますか? Discourseをあなたのアプリに対して認証させようとしていますか? もしかしたら、DiscourseConnect - Discourseの公式シングルサインオン(SSO) を見てみてください。
generate_cookies.py を介して cookies.pkl を取得し、5 分ごとに自動ログインをテストするために使用しています。
そのため、5 分ごとに呼び出してログインをテストする login_12.py ファイルがあります。
login_12.py (以下はコード例です)
import cookies.pkl
driver.get("https://forum.discourse.org/")
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
logger.debug(jlog.format(timestamp=datetime.now(), level="DEBUG", status="Executing", message="Homepage reloaded"))
time.sleep(3)
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
print(cookie)
driver.add_cookie(cookie)
logger.debug(jlog.format(timestamp=datetime.now(), level="DEBUG", status="Executing", message="Added cookies"))
time.sleep(2)
driver.get(driver.current_url)
logger.debug(jlog.format(timestamp=datetime.now(), level="DEBUG", status="Executing", message="Homepage reloaded"))
ブラウザを使用せずに cookies を自動生成したいです。これにより、プロセス全体が自動化されます。
解決しようとしている問題ではなく、提案している解決策をまだ説明しています。
ブラウザが必要ないのに、なぜCookieが必要なのですか?
外部アプリでDiscourseに何かを行うことができるようにしようとしていますか?APIキーを使用するだけではだめですか?
クッキーが必要なのはなぜですか?
回答 - クッキーの.pklファイルを追加しないと、login_12.pyファイルでログインできないためです。
現在、クッキーを生成するには、Chromeドライバーブラウザで電話番号とOTPを手動で入力する必要があります。ブラウザを使用してクッキーを生成したくないのは、何も手動で入力したくないからです。
generate_cookies.py(サンプルコード)
from selenium import webdriver
import undetected_chromedriver as uc
options = uc.ChromeOptions()
#options.add_argument('--headless')
options.add_argument("--disable-extensions")
options.add_argument("--disable-popup-blocking")
# ログイン
GMAIL = 'discourse.mytest@ymail.com'
PASSWORD = 'test1234'
driver.get("https://forun.discourse.org/")
print(driver.title)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('ホームページが読み込まれました')
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'login-button')))
login = driver.find_elements_by_class_name("login-button")[0]
print(login)
login.send_keys(Keys.RETURN)
print(driver.current_url)
driver.get(driver.current_url)
print("メール")
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('メールページが読み込まれました')
#print(driver.page_source)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input").send_keys(GMAIL)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input").send_keys(Keys.RETURN)
print("メールが入力されました")
time.sleep(3)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('パスワードページが読み込まれました')
#print(driver.page_source)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div[1]/div/div/div/div/div[1]/div/div[1]/input").send_keys(PASSWORD)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div[1]/div/div/div/div/div[1]/div/div[1]/input").send_keys(Keys.RETURN)
print("パスワードが入力されました")
time.sleep(3)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('ログインが完了しました')
print(driver.title)
#print(driver.find_element_by_xpath("/html/body").get_attribute('innerHTML'))
if not "Discourse Forum" in driver.title:
raise Exception('ログインエラー')
else:
print("ホームページが読み込まれました")
driver.get(driver.current_url+'/c/announcements/5')
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/head/title')))
print('お知らせページにアクセスしています')
print(driver.title)
最終的にこれを達成したい。
if(headlessブラウザのローカルストレージから取得した有効期限 >= 現在時刻)
{
#generate cookiesを実行(この部分に問題があり、現在は手動で一部行っています)
#cookies.pklファイルを適切なディレクトリにアップロード
}else{
#login_12.pyを実行してログイン
}
#headless Chromeブラウザのローカルストレージにアクセス
#ローカルストレージ変数に有効期限を追加/更新
どのように、そしてなぜですか?
電話番号(どこで尋ねられていますか?)を自動入力し、そのユーザーのOTPをオフにすることはできますか?
@RGJ 有効なログインアクセストークンを取得するために呼び出すことができるエンドポイントまたはAPIはありますか?
あなたがやろうとしていることが、他のアプリでDiscourseにログインできるようにすること、またはDiscourseで他のアプリにログインできるようにすることであれば、上記でリンクしたDiscourseConnectを実装したいはずです。ドキュメントやコード例については、そのページを参照してください。
まだ、正確に何を達成しようとしているのか分かりません。
Discourse の認証を信頼できる情報源として別のウェブページを統合する必要がある場合は、Discourse を SSO プロバイダーとして使用することができます。
Discourse の API にサーバー間呼び出しを行う必要がある場合は、/admin/api/keys で API キーを作成できます。
どのような機能的なニーズに対応しようとしているのか教えていただけますか?
5分ごとにDiscourseのログイン機能をテストするファイル login_12.py があります。
正しくログインするために、login_12.py にクッキー (cookies.pkl) を追加する必要がありました。
クッキー (cookies.pkl) をどのように取得したか?
別のファイル generate_cookies.py があり、このファイルにはユーザーのメールアドレスとパスワードがハードコーディングされています。これを使用して、特定のユーザーのクッキーを生成し、cookies.pkl ファイルに書き込みます。
クッキー生成のためにブラウザを使用していますが、これは避けたいです。この手順は、ブラウザを使用せずにコードで自動的に実行したいと考えています。
generate_cookies.py の内容
from selenium import webdriver
import undetected_chromedriver as uc
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pickle
options = uc.ChromeOptions()
#options.add_argument('--headless')
options.add_argument("--disable-extensions")
options.add_argument("--disable-popup-blocking")
options.add_argument("--profile-directory=Default")
options.add_argument("--ignore-certificate-errors")
options.add_argument("--disable-plugins-discovery")
options.add_argument("--incognito")
options.add_argument("user_agent=DN")
if __name__ == "__main__": #Windowsのみ必要 (undetected_chromedriverのバグ)
driver = uc.Chrome(options=options)
# ログイン
GMAIL = 'discourse.testing@gmail.com'
PASSWORD = 'discoursetest123'
driver.get("https://forum.discourse.org/")
print(driver.title)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('Homepage loaded')
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CLASS_NAME, 'login-button')))
login = driver.find_elements_by_class_name("login-button")[0]
print(login)
login.send_keys(Keys.RETURN)
print(driver.current_url)
driver.get(driver.current_url)
print("email")
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('Email page loaded')
#print(driver.page_source)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input").send_keys(GMAIL)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input").send_keys(Keys.RETURN)
print("Email entered")
time.sleep(3)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('Password page loaded')
#print(driver.page_source)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div[1]/div/div/div/div/div[1]/div/div[1]/input").send_keys(PASSWORD)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div[1]/div/div/div/div/div[1]/div/div[1]/input").send_keys(Keys.RETURN)
print("Password entered")
time.sleep(3)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('Login completed')
print(driver.title)
#print(driver.find_element_by_xpath("/html/body").get_attribute('innerHTML'))
if not "Discourse Forum" in driver.title:
raise Exception('login Error')
else:
print("Homepage loaded")
driver.get(driver.current_url+'/c/announcements/5')
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/head/title')))
print('Trying announcements page')
print(driver.title)
if not "Latest Announcements topics - Discourse Forum" in driver.title:
raise Exception('login Error function')
print("Success!")
pickle.dump( driver.get_cookies() , open("cookies2.pkl","wb"))
これはPythonに関する質問です。
PythonではRequestsライブラリを使用してリクエストを行うことができます。このライブラリは様々な方法でCookieをサポートしており、こちらに例が記載されています。Sessionオブジェクトの使用をお勧めします。
HTML出力を解析したい場合は、BeautifulSoupを使用できます。
つまり、ログインが機能し続けることをテストしようとしているのですね?何かをしようとしているのではなく、誰かがあなたのサイトにログインしようとした場合に(おそらく)機能することを確認したいだけですか?