- Created .gitignore to exclude unnecessary files. - Added config.ini for account configuration. - Implemented cursor_auth_manager.py for managing authentication. - Developed cursor_pro_keep_alive.py for automated account management. - Included CursorKeepAlive.spec for packaging. - Added gpt-accesstoken.py for obtaining ChatGPT access tokens. - Created README.md with usage instructions. - Updated requirements.txt with necessary dependencies. - Added run_cursor.bat for script execution. - Implemented update_cursor_auth.py for updating authentication details. - Included turnstilePatch for handling CAPTCHA challenges. - Added logging functionality in log.txt for tracking script execution. - Created dist folder with packaged executable and necessary files.
167 lines
5.3 KiB
Python
167 lines
5.3 KiB
Python
from DrissionPage import ChromiumOptions, Chromium
|
|
import random
|
|
import time
|
|
|
|
def handle_turnstile(tab):
|
|
"""处理 Turnstile 验证"""
|
|
print("准备处理验证")
|
|
try:
|
|
while True:
|
|
if tab.ele('@id=email-input', timeout=2):
|
|
print("无需验证 - 邮箱输入框已加载")
|
|
return True
|
|
|
|
if tab.ele('@id=password', timeout=2):
|
|
print("无需验证 - 密码输入框已加载")
|
|
return True
|
|
|
|
try:
|
|
challenge_element = (tab.ele("@name=cf-turnstile-response", timeout=2)
|
|
.parent()
|
|
.shadow_root
|
|
.ele("tag:iframe")
|
|
.ele("tag:body")
|
|
.sr("tag:input"))
|
|
|
|
if challenge_element:
|
|
print("验证框加载完成")
|
|
time.sleep(random.uniform(1, 3))
|
|
challenge_element.click()
|
|
print("验证按钮已点击,等待验证完成...")
|
|
time.sleep(2)
|
|
return True
|
|
except:
|
|
pass
|
|
|
|
time.sleep(2)
|
|
|
|
except Exception as e:
|
|
print(f"验证处理出错: {str(e)}")
|
|
print('跳过验证')
|
|
return False
|
|
|
|
account = 'your_chatgpt_account'
|
|
password = 'your_chatgpt_password'
|
|
|
|
co = ChromiumOptions()
|
|
co.add_extension("turnstilePatch")
|
|
# co.headless()
|
|
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.92 Safari/537.36')
|
|
co.set_pref('credentials_enable_service', False)
|
|
co.set_argument('--hide-crash-restore-bubble')
|
|
co.auto_port()
|
|
|
|
browser = Chromium(co)
|
|
tab = browser.latest_tab
|
|
tab.run_js("try { turnstile.reset() } catch(e) { }")
|
|
|
|
print("\n步骤1: 开始访问网站...")
|
|
|
|
tab.get('https://chatgpt.com')
|
|
print('等待页面加载...')
|
|
|
|
print("\n步骤2: 开始登录...")
|
|
for _ in range(5):
|
|
try:
|
|
if tab.ele('xpath:/html/body/div[1]/div[1]/main/div[1]/div[1]/div/div[1]/div/div[3]/div/button[1]'):
|
|
signin_btn = tab.ele('xpath:/html/body/div[1]/div[1]/main/div[1]/div[1]/div/div[1]/div/div[3]/div/button[1]')
|
|
print("找到黑色登录按钮:", signin_btn.text)
|
|
break
|
|
if tab.ele('@data-testid=login-button'):
|
|
signin_btn = tab.ele('@data-testid=login-button')
|
|
print("找到蓝色登录按钮:", signin_btn.text)
|
|
break
|
|
if tab.ele("@name=cf-turnstile-response"):
|
|
print('加载页面时出现CF验证, IP 质量太差, 请更换 IP 重新尝试!')
|
|
browser.quit()
|
|
exit()
|
|
time.sleep(3)
|
|
except Exception as e:
|
|
print(f"处理登录按钮时出错: {str(e)}")
|
|
|
|
for _ in range(5):
|
|
try:
|
|
if signin_btn:
|
|
signin_btn.click()
|
|
print("点击登录按钮")
|
|
break
|
|
except Exception as e:
|
|
print(f"处理登录按钮时出错: {str(e)}")
|
|
time.sleep(3)
|
|
else:
|
|
print("尝试点击登录按钮失败,程序退出")
|
|
exit()
|
|
|
|
handle_turnstile(tab)
|
|
|
|
print("\n步骤3: 输入邮箱...")
|
|
for _ in range(5):
|
|
try:
|
|
if tab.ele('@id=email-input'):
|
|
tab.actions.click('@id=email-input').type(account)
|
|
time.sleep(0.5)
|
|
tab.ele('@class=continue-btn').click()
|
|
print("输入邮箱并点击继续")
|
|
break
|
|
except Exception as e:
|
|
print(f"加载邮箱输入框时出错: {str(e)}")
|
|
time.sleep(3)
|
|
else:
|
|
print("尝试加载邮箱输入框失败,程序退出")
|
|
browser.quit()
|
|
exit()
|
|
|
|
handle_turnstile(tab)
|
|
|
|
print("\n步骤4: 输入密码...")
|
|
for _ in range(5):
|
|
try:
|
|
if tab.ele('@id=password'):
|
|
print("密码输入框加载完成")
|
|
tab.actions.click('@id=password').input(password)
|
|
time.sleep(2)
|
|
tab.ele('@type=submit').click('js')
|
|
# tab.actions.click('@type=submit')
|
|
print("输入密码并JS点击登录")
|
|
break
|
|
except Exception as e:
|
|
print(f"输入密码时出错: {str(e)}")
|
|
time.sleep(3)
|
|
else:
|
|
print("尝试加载密码输入框失败,程序退出")
|
|
browser.quit()
|
|
exit()
|
|
|
|
for _ in range(5):
|
|
try:
|
|
if tab.ele('有什么可以帮忙的?'):
|
|
print('登录成功!')
|
|
break
|
|
if tab.ele('重新发送电子邮件'):
|
|
print('提示需要邮箱验证码,脚本终止,请手动获取')
|
|
exit()
|
|
except Exception as e:
|
|
print(f"登录可能遇到问题: {str(e)}")
|
|
time.sleep(3)
|
|
else:
|
|
print("登录失败,程序退出")
|
|
browser.quit()
|
|
exit()
|
|
|
|
time.sleep(random.uniform(1,2))
|
|
print('\n',"步骤5: 获取access_token...")
|
|
browser.new_tab('https://chatgpt.com/api/auth/session')
|
|
tab = browser.latest_tab
|
|
time.sleep(1)
|
|
response_json = tab.json
|
|
if response_json and 'accessToken' in response_json:
|
|
access_token = response_json['accessToken']
|
|
print('\n',"请复制保存你的access_token:",'\n')
|
|
print(access_token)
|
|
else:
|
|
print("错误:未找到access token")
|
|
|
|
# input("\n按Enter键关闭浏览器...")
|
|
browser.quit()
|
|
|