코드/API 호출 또는 브라우저 로그인 없이 사용자의 _forum_session과 _t를 생성하는 방법?

Selenium와 Python을 사용하여 쿠키(_forum_session 및 _t)를 생성하는 코드를 작성했습니다. 하지만 이 경우에도 전화번호와 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"))
브라우저를 사용하지 않고 쿠키를 자동으로 생성하고 싶습니다. 그러면 전체 프로세스가 자동으로 처리됩니다.

여전히 문제를 해결하려는 것이 아니라 제안한 해결책을 설명하고 있습니다.

브라우저가 필요 없다면 쿠키가 왜 필요한가요?

외부 앱이 Discourse에 대해 <무언가를> 하려고 하는 건가요? 그냥 API 키를 사용하는 것은 어떨까요?

1개의 좋아요

쿠키가 필요한 이유는 무엇인가요?
답변 - cookies.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")

# login
GMAIL = 'discourse.mytest@ymail.com'
PASSWORD = 'test123'

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)

결국 다음을 달성하고 싶습니다.

if(헤드리스 브라우저의 로컬 스토리지에서 가져온 만료 날짜 >= 현재 시간)

{

쿠키 생성 실행 (이 부분을 자동화하는 데 문제가 있음, 현재 일부는 수동으로 처리됨)

cookies.pkl 파일을 적절한 디렉토리에 업로드

}else{

login_12.py를 실행하여 로그인

}

헤드리스 크롬 브라우저의 로컬 스토리지에 액세스

로컬 스토리지 변수에 만료 날짜를 추가/업데이트

어떻게 그리고 왜 그런가요?
전화번호를 자동으로 입력하고(그것이 어디에서 요구되나요?) 해당 사용자의 OTP를 비활성화할 수 있나요?

1개의 좋아요

@RGJ 유효한 로그인 액세스 토큰을 가져오기 위해 호출할 수 있는 엔드포인트나 API가 있나요?

해당하려는 작업이 다른 앱을 통해 Discourse에 로그인하거나, Discourse를 통해 다른 앱에 로그인하는 것이라면, 위에서 링크한 DiscourseConnect를 구현해야 합니다. 해당 페이지에서 문서 및 코드 예시를 확인하실 수 있습니다.

네, 정확히 무엇을 이루고 싶으신지 여전히 명확하지 않습니다.

Discourse의 인증을 단일 정보 출처(source of truth)로 사용하여 다른 웹페이지를 통합해야 한다면, Discourse를 SSO 제공자로 사용할 수 있습니다.

Discourse API에 서버 간(server-to-server) 호출을 해야 한다면 /admin/api/keys에서 API 키를 생성할 수 있습니다.

해결하려는 기능적 요구사항이 무엇인지 공유해 주시겠습니까?

2개의 좋아요

login_12.py 파일은 5분마다 Discourse 로그인 기능을 테스트합니다.

정상적인 로그인을 위해 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('홈페이지 로드됨')


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 not "Latest Announcements topics - Discourse Forum" in driver.title:
    raise Exception('로그인 오류 함수')
print("성공!")

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

이것은 더 Python에 관한 질문입니다.

Python에서 요청을 보내려면 Requests 라이브러리를 사용할 수 있습니다. 이 라이브러리는 여러 방식으로 쿠키를 지원하며, 여기에 몇 가지 예제가 있습니다. Session 객체를 사용하는 것을 권장합니다.

HTML 출력을 파싱하려면 BeautifulSoup를 사용할 수 있습니다.

1개의 좋아요

즉, 로그인 기능이 정상적으로 작동하는지 지속적으로 테스트하려는 것이죠? 특별히 다른 일을 하려는 것이 아니라, 누군가가 사이트 로그인을 시도했을 때 (대부분) 성공할 수 있는지 확인하려는 것뿐인가요?