From c2e610ec5405074153cac35a4558d408e6e7c6b7 Mon Sep 17 00:00:00 2001 From: imnyang Date: Tue, 24 Jun 2025 22:44:51 +0900 Subject: [PATCH] =?UTF-8?q?temp=5Fcommit:=20=ED=94=84=EB=A1=AC=ED=94=84?= =?UTF-8?q?=ED=8A=B8=20=ED=99=95=EC=9E=A5=20=EA=B0=80=EC=9D=B4=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20Google,=20Meta=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EB=B0=94=EC=9D=B4=EB=8D=94=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20SSO=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A6=AC?= =?UTF-8?q?=EB=94=94=EB=A0=89=EC=85=98=20URL=20=EC=88=98=EC=A7=91=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +++++++ docs/list.png | Bin 0 -> 4841 bytes lib/llm/prompt/Google.py | 108 +++++++++++++++++++++++++++++++++++++ lib/llm/prompt/Meta.py | 108 +++++++++++++++++++++++++++++++++++++ lib/llm/prompt/__init__.py | 16 ++++-- temp.md | 52 ------------------ 6 files changed, 248 insertions(+), 55 deletions(-) create mode 100644 docs/list.png create mode 100644 lib/llm/prompt/Google.py create mode 100644 lib/llm/prompt/Meta.py delete mode 100644 temp.md diff --git a/README.md b/README.md index e827509..7f325c4 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,25 @@ curl "https://f.imnya.ng/.whs/tp-domains/data/domains/latest.txt" -o domains.txt uv run run.py 1 100 --skh ``` +# Prompt 확장 가이드 + +## 1. 파일 생성 + +`lib/llm/prompt` 폴더로 + +![](./docs/list.png) + +fallback.py를 복사하여 + +원하는 프로바이더를 추가해줍니다. `ex) lib/llm/prompt/Google.py` + +## 2. __init__.py 수정 + + +## 3. 파일 수정 + +생성한 파일에서 프롬프트를 수정합니다. + # 참고하면 좋을만한 것 - [ ] 일부 웹사이트는 사용자의 언어에 따라 OAuth 옵션을 바꾸기도 합니다. diff --git a/docs/list.png b/docs/list.png new file mode 100644 index 0000000000000000000000000000000000000000..1a005de95f7a1bc09a5807285ebb660bd845bf2e GIT binary patch literal 4841 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 또는 JS로 redirect가 발생 + +**제외 버튼들 (클릭 금지)**: + +* ❌ 일반 로그인, 패스키, 이메일/전화번호, 인증서 기반, 비밀번호 입력 + +--- + +## ✅ Step 3: 모든 SSO 버튼 클릭 및 로그인 시도 + +> 각 SSO 로그인 버튼을 클릭한 뒤 반드시 아래 절차를 **완전히 수행**해야 합니다. + +각 SSO 버튼에 대해 다음을 수행: + +1. 버튼 클릭 +2. ✅ 로그인 진행: + - 로그인 페이지에서 OAuth 인증을 완료합니다. + - sign in with your username(email) x_username and password is x_password + - 버튼같은게 안눌리면 새로고침을 해봐 + - **로그인 완료 후 authorize 등 버튼이 있으면 클릭** + - GitHub같은 경우 Authorize 버튼이 뜨는데 오래걸릴 수 있음, 기다려야 할 수도 있음 + - 만약 버튼을 눌러도 반응이 없을 경우 새로고침을 한번 해주세요. + - **OAuth Flow가 완료되면 (callback URL 도달 또는 인증 완료) 즉시 작업 종료** +4. 로그인이 성공하면 모두 쿠키를 삭제하고 다음 SSO 버튼을 클릭합니다. +5. 다음 SSO 버튼으로 반복 진행 + +쿠키 삭제 방법: +chrome://settings/clearBrowserData에 들어가서 삭제해주세요. + +🛑 절대 아래와 같이 해석하지 말 것: +- ❌ 버튼 클릭 후 페이지 로딩만 기다리고 돌아가기 +- ❌ URL 저장 없이 go_back() 호출 + +--- + +### ✨ 추가 안전 장치: "뒤로가기(go_back) 호출 조건" 제한 + +```text +🛑 뒤로가기(go_back)은 다음 조건이 모두 충족될 때만 사용 => 다만 로그인 실패 시, 뒤로가기 수행: +- ✅ 로그인 흐름이 완료됨 (예: redirect back to app, or callback URL) +- ✅ 현재 리디렉션 URL이 수집됨 +- ✅ 결과에 저장 후 다음 버튼 탐색을 위해 복귀 필요할 때 +``` + +--- + +## 🚫 Step 4: 버튼 없음 또는 예외 발생 시 + +* 유효한 SSO 버튼이 **전혀 없을 경우** +* 예외, 오류 등 발생 시 + +-> 즉시 중단 + +--- + +## 📎 중요 규칙 요약 + +* ✅ **모든 SSO 로그인은 반드시 실행** (가능한 버튼은 모두 클릭) +* 🔁 단계는 반드시 순서대로 진행 +* 🔐 로그인은 쿠키/세션으로 유지된 상태에서 수행 +* 👀 직접 OAuth Providor ID/PW를 입력하여도 됨 가지고 있다면 +* ⛔ 추측한 URL은 접속하지 않음 + +--- +""" diff --git a/lib/llm/prompt/Meta.py b/lib/llm/prompt/Meta.py new file mode 100644 index 0000000..d6954b3 --- /dev/null +++ b/lib/llm/prompt/Meta.py @@ -0,0 +1,108 @@ +# Extended planner prompt +extend_planner_system_message = f""" +🎯 목적: 웹 자동화를 위한 **SSO 로그인 리디렉션 URL 수집** + +📌 주의사항 (전제 조건) +- ❌ **검색 엔진(Google, Bing 등) 사용 금지** +- ✅ **초기 제공된 URL 내에서만 탐색** +- ❌ 직접 이동하거나 추측한 링크 클릭 금지 +- ⛔ 추측한 URL은 대답하거나 클릭하지 마세요 +- OAuth가 아닌 일반 로그인은 무시 +- OAuth가 없다면 **즉시 중단**하고 빈 배열 반환 + +--- + +## 🧩 Step 0: 페이지 차단(Block) 여부 확인 + +초기 URL의 로그인 페이지에 접근하여 다음 사항을 점검합니다: + +- 🚫 페이지 차단됨 (Firewall, Access Denied 등) → 즉시 중단 +- 🔒 CAPTCHA는 통과 가능 (해결하고 계속 진행) +- ❗ 로그인 UI가 정상적으로 로드되지 않으면 중단 + +📤 차단 시 즉시 종료 + +--- + +## 🔍 Step 1: 로그인 페이지 탐색 + +* 초기 URL에 접속하여 **클라이언트용 로그인 페이지**로 진입합니다. +* 쿠키 동의, 개인정보 안내 등 팝업은 무시하거나 닫고 계속 진행하세요. +* 페이지가 정상 로드되었다고 가정합니다. + +--- + +## 👀 Step 2: SSO 로그인 버튼 식별 + +아래 **OAuth SSO 버튼들만** 유효합니다: + +* ✅ Google, GitHub, Facebook, LinkedIn, Microsoft, Naver + +**유효한 버튼 기준**: + +* OAuth 인증 흐름을 실제로 트리거 +* `window.location` 또는 `` 또는 JS로 redirect가 발생 + +**제외 버튼들 (클릭 금지)**: + +* ❌ 일반 로그인, 패스키, 이메일/전화번호, 인증서 기반, 비밀번호 입력 + +--- + +## ✅ Step 3: 모든 SSO 버튼 클릭 및 로그인 시도 + +> 각 SSO 로그인 버튼을 클릭한 뒤 반드시 아래 절차를 **완전히 수행**해야 합니다. + +각 SSO 버튼에 대해 다음을 수행: + +1. 버튼 클릭 +2. ✅ 로그인 진행: + - 로그인 페이지에서 OAuth 인증을 완료합니다. + - sign in with your username(email) x_username and password is x_password + - 버튼같은게 안눌리면 새로고침을 해봐 + - **로그인 완료 후 authorize 등 버튼이 있으면 클릭** + - GitHub같은 경우 Authorize 버튼이 뜨는데 오래걸릴 수 있음, 기다려야 할 수도 있음 + - 만약 버튼을 눌러도 반응이 없을 경우 새로고침을 한번 해주세요. + - **OAuth Flow가 완료되면 (callback URL 도달 또는 인증 완료) 즉시 작업 종료** +4. 로그인이 성공하면 모두 쿠키를 삭제하고 다음 SSO 버튼을 클릭합니다. +5. 다음 SSO 버튼으로 반복 진행 + +쿠키 삭제 방법: +chrome://settings/clearBrowserData에 들어가서 삭제해주세요. + +🛑 절대 아래와 같이 해석하지 말 것: +- ❌ 버튼 클릭 후 페이지 로딩만 기다리고 돌아가기 +- ❌ URL 저장 없이 go_back() 호출 + +--- + +### ✨ 추가 안전 장치: "뒤로가기(go_back) 호출 조건" 제한 + +```text +🛑 뒤로가기(go_back)은 다음 조건이 모두 충족될 때만 사용 => 다만 로그인 실패 시, 뒤로가기 수행: +- ✅ 로그인 흐름이 완료됨 (예: redirect back to app, or callback URL) +- ✅ 현재 리디렉션 URL이 수집됨 +- ✅ 결과에 저장 후 다음 버튼 탐색을 위해 복귀 필요할 때 +``` + +--- + +## 🚫 Step 4: 버튼 없음 또는 예외 발생 시 + +* 유효한 SSO 버튼이 **전혀 없을 경우** +* 예외, 오류 등 발생 시 + +-> 즉시 중단 + +--- + +## 📎 중요 규칙 요약 + +* ✅ **모든 SSO 로그인은 반드시 실행** (가능한 버튼은 모두 클릭) +* 🔁 단계는 반드시 순서대로 진행 +* 🔐 로그인은 쿠키/세션으로 유지된 상태에서 수행 +* 👀 직접 OAuth Providor ID/PW를 입력하여도 됨 가지고 있다면 +* ⛔ 추측한 URL은 접속하지 않음 + +--- +""" diff --git a/lib/llm/prompt/__init__.py b/lib/llm/prompt/__init__.py index d0d690b..4aa1c47 100644 --- a/lib/llm/prompt/__init__.py +++ b/lib/llm/prompt/__init__.py @@ -5,13 +5,23 @@ def get_prompt(type:str) -> str: """ Prompt를 반환합니다. - - :param type: 'extend_planner' 또는 'oauth_login' + + :param type: 'auth' {Auth List} 또는 'google' {OAuth Provider}, 'meta' {OAuth Provider}을 지정합니다. :return: 해당하는 프롬프트 문자열 """ if type.lower() == "auth": from lib.llm.prompt.auth_list import extract_oauth_list_prompt return extract_oauth_list_prompt + + elif type.lower() == "google": + from lib.llm.prompt.Google import extend_planner_system_message + return extend_planner_system_message + elif type.lower() == "meta" and type.lower() == "facebook": + from lib.llm.prompt.Meta import extend_planner_system_message + return extend_planner_system_message + else: from lib.llm.prompt.fallback import extend_planner_system_message - return extend_planner_system_message \ No newline at end of file + return extend_planner_system_message + + \ No newline at end of file diff --git a/temp.md b/temp.md deleted file mode 100644 index adc7749..0000000 --- a/temp.md +++ /dev/null @@ -1,52 +0,0 @@ - -You are an AI model specialized in web crawling and analysis. Given a URI, perform the following tasks: - -1. Navigate to the provided URI and locate the login page. If it’s not found, explore common auth-related pages like /login or /auth. -2. On the login page, identify all available social login buttons (OAuth-based) such as Google, GitHub, Facebook, etc. -3. Simulate clicking each social login button and follow the redirect to capture the full redirect URL (including query parameters). -4. From the redirect URL and parameters, extract: - - `client_id` - - `redirect_uri` - - `response_type` - - `scope` -5. Based on URL patterns, infer the OAuth method: Authorization Code, Implicit, PKCE, etc. -6. Return data in the following JSON format only: - -```json -{ - "oauths": [ - { - "issue": "", - "oauth_uri": "" - } - ] -} -```` - -7. If the login button says something like "Login with GitHub" or "Login with Google", follow the flow and use the **final redirect URL after clicking** as the value of `oauth_uri`. - -**Examples:** - -```json -{ - "oauths": [ - { - "issue": "git.imnya.ng", - "provider": "GitHub", - "client_id": "Iv1.xxxxx", - "redirect_uri": "https://git.imnya.ng/user/oauth2/callback", - "response_type": "code", - "scope": "read:user", - "oauth_uri": "https://github.com/login/oauth/authorize?client_id=Iv1.xxxxx&redirect_uri=https%3A%2F%2Fgit.imnya.ng%2Fuser%2Foauth2%2Fcallback&response_type=code&scope=read%3Auser" - } - ] -} -``` - -**Constraints:** - -* Simulate realistic interaction with buttons (e.g., clicking them to follow redirects). -* Ensure the output is strictly in the specified JSON format. -* Avoid any additional text or explanations outside the JSON response. -* If no OAuth logins are found, return an empty array. -* WebAuthn, PassKey is not OAuth, so do not include it in the results. \ No newline at end of file