130 lines
4.0 KiB
Python
130 lines
4.0 KiB
Python
import random
|
||
|
||
import undetected_chromedriver as uc
|
||
import time
|
||
import json
|
||
|
||
|
||
def get_cookies(browser, log_url="https://chatgpt.com/"):
|
||
"""
|
||
获取cookies保存至本地
|
||
"""
|
||
browser.get(log_url)
|
||
input("回车以继续")
|
||
# adkinsjoanna26@gmail.com
|
||
# c1lO2NKEa2Hsl5
|
||
|
||
dictCookies = browser.get_cookies() # 获取list的cookies
|
||
jsonCookies = json.dumps(dictCookies) # 转换成字符串保存
|
||
with open('damai_cookies.txt', 'w') as f:
|
||
f.write(jsonCookies)
|
||
print('cookies保存成功!')
|
||
|
||
|
||
def load_cookies(browser):
|
||
"""
|
||
从本地读取cookies并刷新页面,成为已登录状态
|
||
"""
|
||
with open('t.json', 'r', encoding='utf8') as f:
|
||
listCookies = json.loads(f.read())
|
||
|
||
# 往browser里添加cookies
|
||
for cookie in listCookies:
|
||
cookie_dict = {
|
||
'domain': cookie.get('domain'),
|
||
'name': cookie.get('name'),
|
||
'value': cookie.get('value'),
|
||
"expires": '',
|
||
'path': '/',
|
||
'httpOnly': False,
|
||
'HostOnly': False,
|
||
'Secure': False
|
||
}
|
||
try:
|
||
browser.add_cookie(cookie_dict)
|
||
except Exception as e:
|
||
print("wrong_cookie: ", cookie_dict)
|
||
browser.refresh() # 刷新网页,cookies才成功
|
||
|
||
|
||
def get_presentation_are():
|
||
# //div[@role="presentation"]//div[contains(@class, "text-sm") ] # text-token-text-primary
|
||
# //div[@role="presentation"]//div[contains(@class, "text-sm")]/div[contains(@class, "text-token-text-primary")]
|
||
pass
|
||
# //div[@role="presentation"]//p # 响应的内容都放在了p里
|
||
|
||
|
||
def get_input_area(driver):
|
||
input_area = driver.find_element(by="xpath", value="//textarea")
|
||
return input_area
|
||
|
||
|
||
def get_input_button(driver):
|
||
input_button = driver.find_element(by="xpath", value="//textarea/../../button")
|
||
return input_button
|
||
|
||
|
||
def get_last_response(driver):
|
||
# t = (driver.find_elements(by="xpath", value='//div[@role="presentation"]//p')[-1]).text
|
||
t = (driver.find_elements(by="xpath",
|
||
value='//div[@role="presentation"]//div[contains(@class, "text-sm")]/div[contains(@class, "text-token-text-primary")]//div[contains(@class, "markdown")]')[
|
||
-1]).text
|
||
return t
|
||
|
||
|
||
def wait_for_complete(driver):
|
||
time.sleep(3 + 3 * random.random())
|
||
|
||
complete_flag = False
|
||
while not complete_flag:
|
||
try:
|
||
last_bar = driver.find_elements(by='xpath', value="//div[contains(@class, 'mt-1 flex gap-3 empty:hidden juice:-ml-3')]")[-1]
|
||
element_size = last_bar.size
|
||
element_height = element_size['height']
|
||
# element_width = element_size['width']
|
||
if element_height < 10:
|
||
time.sleep(5)
|
||
print("sleep")
|
||
else:
|
||
complete_flag = True
|
||
except Exception as e:
|
||
time.sleep(5 + 5 * random.random()) # 第1次可能出现异常,可能因为第一次没有这个元素
|
||
print('Exception')
|
||
|
||
|
||
def sent_prompt(prompt, browser=None):
|
||
input_area = get_input_area(browser)
|
||
input_area.send_keys(prompt)
|
||
time.sleep(1 + random.random())
|
||
input_button = get_input_button(browser)
|
||
input_button.click()
|
||
wait_for_complete(driver)
|
||
response_ = get_last_response(driver)
|
||
return response_
|
||
|
||
|
||
def new_chat(driver):
|
||
new_button = driver.find_element(by="xpath", value='//nav/div[1]/span[last()]/button')
|
||
new_button.click()
|
||
time.sleep(2 + random.random())
|
||
|
||
|
||
if __name__ == '__main__':
|
||
driver = uc.Chrome()
|
||
# get_cookies(driver)
|
||
driver.get("https://chatgpt.com/")
|
||
input("回车以登录")
|
||
load_cookies(driver)
|
||
input("回车以开始使用")
|
||
while True:
|
||
prompt = input("输入prompt:")
|
||
# prompt = "描写今天的天气很好,800字"
|
||
response = sent_prompt(prompt, browser=driver)
|
||
print(response)
|
||
|
||
# # prompt = "描写今天的天气很好,800字"
|
||
# response = sent_prompt(prompt, browser=driver)
|
||
# print(response)
|
||
driver.quit()
|
||
|