كيف يمكن إنشاء _forum_session و _t لمستخدم عبر استدعاء الكود/API أو بدون تسجيل الدخول إلى المتصفح؟

لقد كتبت رمزًا لإنشاء ملفات تعريف الارتباط (_forum_session و _t) عبر Selenium و Python. ولكن في هذه الحالة أيضًا، يجب علينا ملء رقم الهاتف ورمز التحقق يدويًا للتحقق. أريد إنشاء ملفات تعريف الارتباط تلقائيًا بالكامل من خلال الكود، ولا أريد ملء أي شيء يدويًا. كيف يمكنني تحقيق ذلك؟

هل يمكنك التراجع ووصف المشكلة التي ستحلها ملفات تعريف الارتباط هذه؟

ما الذي تحاول تحقيقه؟ هل تحاول المصادقة على Discourse مقابل تطبيقك؟ ربما ألق نظرة على DiscourseConnect - تسجيل الدخول الأحادي الرسمي لـ Discourse (sso)؟

من خلال generate_cookies.py، تلقيت ملف cookies.pkl الذي أستخدمه للاختبار التلقائي لتسجيل الدخول كل 5 دقائق.

لذلك لدي ملف login_12.py يتم استدعاؤه كل 5 دقائق لاختبار عمليات تسجيل الدخول الخاصة بي
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"))

أريد الحصول على ملفات تعريف الارتباط التي تم إنشاؤها تلقائيًا دون استخدام المتصفح. لذلك ستكون العملية بأكملها تلقائية.

أنت لا تزال تصف الحل المقترح بدلاً من المشكلة التي تحاول حلها.

لماذا تحتاج إلى ملفات تعريف الارتباط إذا لم تكن بحاجة إلى متصفح؟

هل تحاول جعل تطبيقك الخارجي قادرًا على القيام بشيء ما لـ Discourse؟ ربما استخدم مفتاح API فقط؟

إعجاب واحد (1)

لماذا تحتاج ملفات تعريف الارتباط؟
الإجابة: لأننا بدون إضافة ملف cookies.pkl، لا يمكننا تسجيل الدخول عبر ملف login_12.py.

حتى الآن، لتوليد ملفات تعريف الارتباط، يجب علينا ملء رقم الهاتف وكلمة المرور لمرة واحدة (OTP) يدويًا في متصفح Chrome Driver. لذلك، لا أريد ملء أي شيء يدويًا، ولهذا السبب لا أريد استخدام المتصفح لتوليد ملفات تعريف الارتباط.

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)

أخيرًا، أريد تحقيق هذا.

إذا (تم الحصول على تاريخ انتهاء الصلاحية من المتصفح بدون واجهة رسومية \u003e= الآن)
{

تشغيل توليد ملفات تعريف الارتباط (مشكلة في هذا الجزء لجعله تلقائيًا، حاليًا بعض الأجزاء يدوية)

تحميل ملف cookies.pkl إلى الدليل المناسب

}
else{

تشغيل login_12.py لتسجيل الدخول

}

الوصول إلى التخزين المحلي للمتصفح بدون واجهة رسومية

إضافة/تحديث تاريخ انتهاء الصلاحية في متغير التخزين المحلي

كيف ولماذا؟
هل يمكنك ملء رقم الهاتف (أين يُطلب ذلك؟) تلقائيًا وإيقاف كلمة المرور لمرة واحدة (OTP) لهذا المستخدم؟

إعجاب واحد (1)

@RGJ هل هناك أي نقاط نهاية أو واجهة برمجة تطبيقات (API) متاحة يمكننا استدعاؤها للحصول على رمز وصول صالح لتسجيل الدخول؟

إذا كان ما تحاول القيام به هو السماح للأشخاص بتسجيل الدخول إلى Discourse باستخدام تطبيقك الآخر، أو تسجيل الدخول إلى تطبيقك الآخر باستخدام Discourse، فأنت تريد تنفيذ DiscourseConnect، الذي قمت بربطه أعلاه. يمكنك الاطلاع على تلك الصفحة للحصول على الوثائق وأمثلة التعليمات البرمجية.

لا يزال الأمر غير واضح بالنسبة لي ما الذي تحاول تحقيقه بالضبط.

إذا كنت بحاجة إلى دمج صفحة ويب أخرى باستخدام مصادقة Discourse كمصدر للحقيقة، يمكنك استخدام Discourse كمزود SSO.

إذا كنت بحاجة إلى إجراء استدعاءات من خادم إلى خادم لواجهة برمجة تطبيقات Discourse، يمكنك إنشاء مفاتيح API على /admin/api/keys.

هل يمكنك مشاركة الحاجة الوظيفية التي تحاول معالجتها؟

إعجابَين (2)

لدينا ملف login_12.py الذي يختبر وظيفة تسجيل الدخول في discourse كل 5 دقائق.

اضطررنا إلى إضافة ملف تعريف الارتباط (cookies.pkl) في login_12.py لتسجيل الدخول بشكل صحيح.

كيف حصلنا على ملفات تعريف الارتباط (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__":    #Needed for Windows only (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 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"))

هذا سؤال يتعلق بلغة بايثون أكثر.

يمكنك استخدام مكتبة Requests في بايثون لإجراء طلباتك. إنها تدعم ملفات تعريف الارتباط بطرق مختلفة، هنا بعض الأمثلة. أوصي باستخدام كائن Session.

إذا كنت ترغب في تحليل مخرجات HTML، يمكنك استخدام BeautifulSoup.

إعجاب واحد (1)

إذًا، ما تحاول تحقيقه هو اختبار أن تسجيل الدخول يعمل باستمرار؟ أنت لا تحاول فعل أي شيء. أنت فقط تريد التأكد من أنه إذا حاول شخص ما تسجيل الدخول إلى موقعك، فسيتمكن من ذلك (على الأرجح)؟