Wie kann _forum_session und _t für einen Benutzer durch Code/API-Aufruf oder ohne Browser-Login generiert werden?

Ich habe einen Code zur Generierung von Cookies (_forum_session und _t) mit Selenium und Python geschrieben. Aber in diesem Fall müssen wir auch manuell die Telefonnummer und das OPT zum Validieren eingeben. Ich möchte die Cookies vollständig automatisch per Code generieren, ohne manuell etwas eingeben zu müssen. Wie kann ich das erreichen?

Können Sie zurückgehen und beschreiben, welches Problem das Vorhandensein dieser Cookies lösen wird?

Was versuchen Sie zu erreichen? Versuchen Sie, Discourse gegen Ihre App zu authentifizieren? Vielleicht schauen Sie sich DiscourseConnect - Offizielle Single-Sign-On-Lösung für Discourse (sso) an?

Über generate_cookies.py habe ich die cookies.pkl erhalten, die ich verwende, um mich alle 5 Minuten automatisch anzumelden.

Ich habe also eine Datei login_12.py, die alle 5 Minuten aufgerufen wird, um meine Anmeldungen zu testen.
login_12.py (nachfolgend einige Codebeispiele)

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"))

Ich möchte die Cookies automatisch generieren, ohne einen Browser zu verwenden, damit der gesamte Vorgang automatisch abläuft.

Sie beschreiben immer noch Ihre vorgeschlagene Lösung und nicht das Problem, das Sie zu lösen versuchen.

Warum brauchen Sie die Cookies, wenn Sie keinen Browser brauchen?

Versuchen Sie, dass Ihre externe Anwendung etwas mit Discourse tun kann? Vielleicht einfach einen API-Schlüssel verwenden?

1 „Gefällt mir“

Warum werden die Cookies benötigt?
Antwort: Ohne das Hinzufügen der Datei cookies.pkl können wir uns nicht über die Datei login_12.py anmelden.

Derzeit müssen wir für die Generierung von Cookies die Telefonnummer und die OTP manuell im Chrome-Treiber-Browser eingeben. Da ich nichts manuell eingeben möchte, möchte ich den Browser nicht zur Generierung von Cookies verwenden.

generate_cookies.py (Beispielcode)

    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)

Das möchte ich schließlich erreichen.

if (Ablaufdatum aus dem lokalen Speicher des Headless-Browsers >= jetzt)
{
#generate cookies ausführen (Problem mit diesem Teil, um ihn automatisch zu machen, derzeit sind einige Teile manuell)
#cookies.pkl-Datei in das entsprechende Verzeichnis hochladen
}else{
#login_12.py ausführen, um sich anzumelden
}

#auf den lokalen Speicher für den Headless-Chrome-Browser zugreifen
#Ablaufdatum in der lokalen Speicher-Variable hinzufügen/aktualisieren

Wie und warum?
Sie können die Telefonnummer (wo wird danach gefragt?) automatisch ausfüllen und OTP für diesen Benutzer deaktivieren?

1 „Gefällt mir“

@RGJ Gibt es Endpunkte oder APIs, die wir aufrufen können, um ein gültiges Login-Zugriffstoken zu erhalten?

Wenn Sie versuchen, Leuten die Anmeldung bei Discourse über Ihre andere App zu ermöglichen oder sich über Discourse bei Ihrer anderen App anzumelden, dann sollten Sie DiscourseConnect implementieren, das ich oben verlinkt habe. Auf dieser Seite finden Sie Dokumentation und Codebeispiele.

Es ist mir immer noch nicht ganz klar, was genau Sie erreichen wollen.

Wenn Sie eine andere Webseite integrieren müssen, die die Authentifizierung von Discourse als Quelle der Wahrheit verwendet, können Sie Discourse als SSO-Anbieter verwenden.

Wenn Sie server-zu-server-Aufrufe an die API von Discourse durchführen müssen, können Sie API-Schlüssel unter /admin/api/keys erstellen.

Können Sie uns mitteilen, welches funktionale Bedürfnis Sie zu adressieren versuchen?

2 „Gefällt mir“

Wir haben die Datei login_12.py, die alle 5 Minuten die Discourse-Login-Funktionalität testet.

Wir mussten Cookies (cookies.pkl) in login_12.py hinzufügen, um sich richtig anzumelden.

Wie haben wir die Cookies (cookies.pkl) erhalten?
Wir haben eine weitere Datei generate_cookies.py. In dieser Datei haben wir die E-Mail-Adresse und das Passwort des Benutzers fest codiert. Damit generieren wir Cookies für diesen bestimmten Benutzer und schreiben eine Datei cookies.pkl.

Für die Generierung von Cookies verwenden wir einen Browser, den wir vermeiden möchten, und dieser Schritt soll automatisch per Code ohne Verwendung eines Browsers erfolgen.

Inhalt von 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__":    #Nur für Windows erforderlich (Bug in undetected_chromedriver)
    driver = uc.Chrome(options=options)

    # Login
    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 geladen')


    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-Seite geladen')
    #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 eingegeben")

    time.sleep(3)

    WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
    print('Passwortseite geladen')
    #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("Passwort eingegeben")
    time.sleep(3)

    WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/body')))
    print('Login abgeschlossen')
    print(driver.title)

    #print(driver.find_element_by_xpath("/html/body").get_attribute('innerHTML'))

    if not "Discourse Forum" in driver.title:
        raise Exception('Login-Fehler')
    else:
        print("Homepage geladen")
    driver.get(driver.current_url+'/c/announcements/5')
    WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, '/html/head/title')))
    print('Versuche Ankündigungs-Seite')
    print(driver.title)
    if not "Latest Announcements topics - Discourse Forum" in driver.title:
        raise Exception('Login-Fehlerfunktion')
    print("Erfolg!")

    pickle.dump( driver.get_cookies() , open("cookies2.pkl","wb"))

Dies ist eher eine Python-Frage.

Sie können die Requests-Bibliothek in Python verwenden, um Ihre Anfragen zu stellen. Sie unterstützt Cookies auf verschiedene Arten, hier finden Sie einige Beispiele. Ich würde Ihnen empfehlen, ein Session-Objekt zu verwenden.

Wenn Sie die HTML-Ausgabe parsen möchten, können Sie BeautifulSoup verwenden.

1 „Gefällt mir“

Sie versuchen also, kontinuierlich zu testen, ob die Logins funktionieren? Sie versuchen nichts. Sie wollen nur sicherstellen, dass, wenn sich jemand auf Ihrer Website anmeldet, dies (wahrscheinlich) funktioniert?