| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- 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()
-
|