J’ai écrit un code pour générer des cookies (_forum_session et _t) via Selenium et Python. Mais dans ce cas, nous devons également remplir manuellement le numéro de téléphone et l’OPT pour valider. Je veux que la génération de cookies soit entièrement automatique via le code, je ne veux rien remplir manuellement. Comment puis-je y parvenir ?
Pouvez-vous revenir en arrière et décrire quel problème la possession de ces cookies va résoudre ?
Qu’essayez-vous d’accomplir ? Essayez-vous d’authentifier Discourse par rapport à votre application ? Peut-être jetez un œil à DiscourseConnect - Authentification unique officielle pour Discourse (sso) ?
Via generate_cookies.py, j’ai reçu le fichier cookies.pkl que j’utilise pour tester automatiquement la connexion toutes les 5 minutes.
J’ai donc un fichier login_12.py que j’appelle toutes les 5 minutes pour tester mes connexions
login_12.py (ci-dessous un exemple de code)
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"))
Je veux générer les cookies automatiquement sans utiliser de navigateur. L’ensemble du processus sera donc automatique.
Vous décrivez toujours votre solution proposée au lieu du problème que vous essayez de résoudre.
Pourquoi avez-vous besoin des cookies si vous n’avez pas besoin d’un navigateur ?
Essayez-vous de permettre à votre application externe de <faire quelque chose> à Discourse ? Peut-être utiliser simplement une clé API ?
Pourquoi avez-vous besoin des cookies ?
R - Parce que sans ajouter le fichier cookies.pkl, nous ne pouvons pas nous connecter via le fichier login_12.py.
Pour l’instant, pour générer des cookies, nous devons remplir manuellement le numéro de téléphone et l’OTP dans le navigateur Chrome Driver. Je ne veux donc rien remplir manuellement, c’est pourquoi je ne veux pas utiliser le navigateur pour générer des cookies.
generate_cookies.py (exemple de code)
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")
# login
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('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)
Enfin, je veux réaliser ceci.
if (obtenir l’expiration du stockage local du navigateur headless >= maintenant)
{
#exécuter generate cookies (problème avec cette partie pour la rendre automatique, actuellement certaines parties sont manuelles)
#télécharger le fichier cookies.pkl dans le répertoire approprié
}else{
#exécuter lopinion_12.py pour se connecter
}
#accéder au stockage local pour le navigateur chrome headless
#ajouter/mettre à jour la date d’expiration dans la variable de stockage local
Comment et pourquoi ?
Pouvez-vous remplir le numéro de téléphone (où est-il demandé ?) automatiquement et désactiver l’OTP pour cet utilisateur ?
@RGJ Existe-t-il des points de terminaison ou une API disponibles que nous pouvons appeler pour obtenir un jeton d’accès de connexion valide ?
Si ce que vous essayez de faire est de permettre aux gens de se connecter à Discourse en utilisant votre autre application, ou de vous connecter à votre autre application en utilisant Discourse, alors vous voulez implémenter DiscourseConnect, que j’ai lié ci-dessus. Vous pouvez consulter cette page pour la documentation et des exemples de code.
Oui, il ne m’est toujours pas clair ce que vous essayez d’accomplir exactement.
Si vous avez besoin d’intégrer une autre page web en utilisant l’authentification de Discourse comme source de vérité, vous pouvez utiliser Discourse comme fournisseur SSO.
Si vous avez besoin d’effectuer des appels serveur à serveur à l’API de Discourse, vous pouvez créer des clés API sur /admin/api/keys.
Pouvez-vous partager le besoin fonctionnel auquel vous essayez de répondre ?
nous avons un fichier login_12.py qui teste la fonctionnalité de connexion de Discourse toutes les 5 minutes.
nous avons dû ajouter des cookies (cookies.pkl) dans login_12.py pour nous connecter correctement.
Comment avons-nous obtenu les cookies (cookies.pkl) ?
nous avons un autre fichier generate_cookies.py, dans ce fichier nous avons codé en dur l’e-mail et le mot de passe de l’utilisateur, en utilisant cela nous générons des cookies pour cet utilisateur particulier et écrivons un fichier cookies.pkl.
Pour générer les cookies, nous utilisons un navigateur, ce que nous voulons éviter et cette étape doit être effectuée automatiquement par le code sans utiliser de navigateur.
contenu de 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__": # Nécessaire uniquement pour Windows (Bug dans undetected_chromedriver)
driver = uc.Chrome(options=options)
# connexion
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('Page d\'accueil chargée')
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('Page d\'e-mail chargée')
#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("E-mail saisi")
time.sleep(3)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('Page de mot de passe chargée')
#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("Mot de passe saisi")
time.sleep(3)
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
print('Connexion terminée')
print(driver.title)
#print(driver.find_element_by_xpath("/html/body").get_attribute('innerHTML'))
if not "Discourse Forum" in driver.title:
raise Exception('Erreur de connexion')
else:
print("Page d'accueil chargée")
driver.get(driver.current_url+'/c/announcements/5')
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/head/title')))
print('Tentative de la page des annonces')
print(driver.title)
if not "Latest Announcements topics - Discourse Forum" in driver.title:
raise Exception('Fonction erreur de connexion')
print("Succès !")
pickle.dump( driver.get_cookies() , open("cookies2.pkl","wb"))
Ceci est davantage une question Python.
Vous pouvez utiliser la bibliothèque Requests en Python pour effectuer vos requêtes. Elle prend en charge les cookies de diverses manières, voici quelques exemples. Je vous recommande d’utiliser un objet Session.
Si vous souhaitez analyser la sortie HTML, vous pouvez utiliser BeautifulSoup.
Donc, ce que vous essayez d’accomplir, c’est de tester continuellement que les connexions fonctionnent ? Vous n’essayez pas de faire quoi que ce soit. Vous voulez juste vous assurer que si quelqu’un essaie de se connecter à votre site, cela fonctionnera (probablement) ?