fix: 兼容新的 Codex OAuth 同意页结构
- 扩展同意页文案匹配,覆盖新的 Sign in to Codex 提示 - 优先从 OAuth consent form 内定位 Continue 提交按钮 - 用 form action 和按钮状态辅助识别真正的同意页
This commit is contained in:
+51
-6
@@ -396,7 +396,9 @@ async function step3_fillEmailPassword(payload) {
|
|||||||
|
|
||||||
const INVALID_VERIFICATION_CODE_PATTERN = /代码不正确|验证码不正确|验证码错误|code\s+(?:is\s+)?incorrect|invalid\s+code|incorrect\s+code|try\s+again/i;
|
const INVALID_VERIFICATION_CODE_PATTERN = /代码不正确|验证码不正确|验证码错误|code\s+(?:is\s+)?incorrect|invalid\s+code|incorrect\s+code|try\s+again/i;
|
||||||
const VERIFICATION_PAGE_PATTERN = /检查您的收件箱|输入我们刚刚向|重新发送电子邮件|重新发送验证码|验证码|代码不正确|email\s+verification/i;
|
const VERIFICATION_PAGE_PATTERN = /检查您的收件箱|输入我们刚刚向|重新发送电子邮件|重新发送验证码|验证码|代码不正确|email\s+verification/i;
|
||||||
const OAUTH_CONSENT_PAGE_PATTERN = /使用\s*ChatGPT\s*登录到\s*Codex|login\s+to\s+codex|log\s+in\s+to\s+codex|authorize|授权/i;
|
const OAUTH_CONSENT_PAGE_PATTERN = /使用\s*ChatGPT\s*登录到\s*Codex|sign\s+in\s+to\s+codex(?:\s+with\s+chatgpt)?|login\s+to\s+codex|log\s+in\s+to\s+codex|authorize|授权/i;
|
||||||
|
const OAUTH_CONSENT_FORM_SELECTOR = 'form[action*="/sign-in-with-chatgpt/" i][action*="/consent" i]';
|
||||||
|
const CONTINUE_ACTION_PATTERN = /继续|continue/i;
|
||||||
const ADD_PHONE_PAGE_PATTERN = /add[\s-]*phone|添加手机号|手机号码|手机号|phone\s+number|telephone/i;
|
const ADD_PHONE_PAGE_PATTERN = /add[\s-]*phone|添加手机号|手机号码|手机号|phone\s+number|telephone/i;
|
||||||
const STEP5_SUBMIT_ERROR_PATTERN = /无法根据该信息创建帐户|请重试|unable\s+to\s+create\s+(?:your\s+)?account|couldn'?t\s+create\s+(?:your\s+)?account|something\s+went\s+wrong|invalid\s+(?:birthday|birth|date)|生日|出生日期/i;
|
const STEP5_SUBMIT_ERROR_PATTERN = /无法根据该信息创建帐户|请重试|unable\s+to\s+create\s+(?:your\s+)?account|couldn'?t\s+create\s+(?:your\s+)?account|something\s+went\s+wrong|invalid\s+(?:birthday|birth|date)|生日|出生日期/i;
|
||||||
const AUTH_TIMEOUT_ERROR_TITLE_PATTERN = /糟糕,出错了|something\s+went\s+wrong|oops/i;
|
const AUTH_TIMEOUT_ERROR_TITLE_PATTERN = /糟糕,出错了|something\s+went\s+wrong|oops/i;
|
||||||
@@ -449,16 +451,60 @@ function getPageTextSnapshot() {
|
|||||||
.trim();
|
.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getOAuthConsentForm() {
|
||||||
|
return document.querySelector(OAUTH_CONSENT_FORM_SELECTOR);
|
||||||
|
}
|
||||||
|
|
||||||
function getPrimaryContinueButton() {
|
function getPrimaryContinueButton() {
|
||||||
|
const consentForm = getOAuthConsentForm();
|
||||||
|
if (consentForm) {
|
||||||
|
const formButtons = Array.from(
|
||||||
|
consentForm.querySelectorAll('button[type="submit"], input[type="submit"], [role="button"]')
|
||||||
|
);
|
||||||
|
|
||||||
|
const formContinueButton = formButtons.find((el) => {
|
||||||
|
if (!isVisibleElement(el)) return false;
|
||||||
|
|
||||||
|
const ddActionName = el.getAttribute?.('data-dd-action-name') || '';
|
||||||
|
return ddActionName === 'Continue' || CONTINUE_ACTION_PATTERN.test(getActionText(el));
|
||||||
|
});
|
||||||
|
if (formContinueButton) {
|
||||||
|
return formContinueButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstVisibleSubmit = formButtons.find(isVisibleElement);
|
||||||
|
if (firstVisibleSubmit) {
|
||||||
|
return firstVisibleSubmit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const continueBtn = document.querySelector(
|
const continueBtn = document.querySelector(
|
||||||
'button[type="submit"][data-dd-action-name="Continue"], button[type="submit"]._primary_3rdp0_107'
|
`${OAUTH_CONSENT_FORM_SELECTOR} button[type="submit"], button[type="submit"][data-dd-action-name="Continue"], button[type="submit"]._primary_3rdp0_107`
|
||||||
);
|
);
|
||||||
if (continueBtn && isVisibleElement(continueBtn)) {
|
if (continueBtn && isVisibleElement(continueBtn)) {
|
||||||
return continueBtn;
|
return continueBtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
const buttons = document.querySelectorAll('button, [role="button"]');
|
const buttons = document.querySelectorAll('button, [role="button"]');
|
||||||
return Array.from(buttons).find((el) => isVisibleElement(el) && /继续|Continue/i.test(el.textContent || '')) || null;
|
return Array.from(buttons).find((el) => {
|
||||||
|
if (!isVisibleElement(el)) return false;
|
||||||
|
|
||||||
|
const ddActionName = el.getAttribute?.('data-dd-action-name') || '';
|
||||||
|
return ddActionName === 'Continue' || CONTINUE_ACTION_PATTERN.test(getActionText(el));
|
||||||
|
}) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isOAuthConsentPage() {
|
||||||
|
const pageText = getPageTextSnapshot();
|
||||||
|
if (OAUTH_CONSENT_PAGE_PATTERN.test(pageText)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getOAuthConsentForm()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return /\bcodex\b/i.test(pageText) && /\bchatgpt\b/i.test(pageText) && Boolean(getPrimaryContinueButton());
|
||||||
}
|
}
|
||||||
|
|
||||||
function isVerificationPageStillVisible() {
|
function isVerificationPageStillVisible() {
|
||||||
@@ -493,7 +539,7 @@ function isStep8Ready() {
|
|||||||
if (isVerificationPageStillVisible()) return false;
|
if (isVerificationPageStillVisible()) return false;
|
||||||
if (isAddPhonePageReady()) return false;
|
if (isAddPhonePageReady()) return false;
|
||||||
|
|
||||||
return OAUTH_CONSENT_PAGE_PATTERN.test(getPageTextSnapshot());
|
return isOAuthConsentPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
function normalizeInlineText(text) {
|
function normalizeInlineText(text) {
|
||||||
@@ -991,11 +1037,10 @@ async function step8_findAndClick() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getStep8State() {
|
function getStep8State() {
|
||||||
const pageText = getPageTextSnapshot();
|
|
||||||
const continueBtn = getPrimaryContinueButton();
|
const continueBtn = getPrimaryContinueButton();
|
||||||
const state = {
|
const state = {
|
||||||
url: location.href,
|
url: location.href,
|
||||||
consentPage: OAUTH_CONSENT_PAGE_PATTERN.test(pageText),
|
consentPage: isOAuthConsentPage(),
|
||||||
consentReady: isStep8Ready(),
|
consentReady: isStep8Ready(),
|
||||||
verificationPage: isVerificationPageStillVisible(),
|
verificationPage: isVerificationPageStillVisible(),
|
||||||
addPhonePage: isAddPhonePageReady(),
|
addPhonePage: isAddPhonePageReady(),
|
||||||
|
|||||||
Reference in New Issue
Block a user