SnapdragonLee / ChatGPT-weBot

Chat with ChatGPT (gpt-3.5 or newer),WeChat hook interface based
655 stars 117 forks source link

v1.20 代码 bug 专用 #96

Open SnapdragonLee opened 9 months ago

SnapdragonLee commented 9 months ago

所有的最新的问题请在这里直接提出,如果太长也可以单开issue

BarryAllen-Arrow commented 8 months ago

replicate画图的方法失效了哦~提示404,应该是url变了。我看网站的cookies好像也加了什么crsf认证啥的,不知道还能不能搞诶

BarryAllen-Arrow commented 8 months ago

replicate画图的方法失效了哦~提示404,应该是url变了。我看网站的cookies好像也加了什么crsf认证啥的,不知道还能不能搞诶

我问了chatgpt,他说有这种认证的话好像不太好搞,如果我能直接打开浏览器,那其实可以用selenium来模拟浏览器操作

BarryAllen-Arrow commented 8 months ago

replicate画图的方法失效了哦~提示404,应该是url变了。我看网站的cookies好像也加了什么crsf认证啥的,不知道还能不能搞诶

通过与chatgpt的深入交流探讨。我已经研究出了selenium的方法,亲测有效! 这个方法方便很多,不需要随机生成anonymus_id,也不需要提交任何json。原理就是模拟浏览器实时操作。缺点是他会在后台打开一个浏览器进行操作,会增加电脑的运算负荷,大概增加个七十多M的运存占用吧。 已经写成一个class了,大佬有兴趣可以看看:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

class LatentGenerator:
    def __init__(self):
        # 设置Chrome选项,以便在无头模式下运行(没有图形界面)
        chrome_options = Options()
        # 禁用加载网页图片的功能,加快网页加载
        prefs = {"profile.managed_default_content_settings.images": 2}
        chrome_options.add_experimental_option("prefs", prefs)
        chrome_options.add_argument('--incognito')  # 启动无痕(隐身)模式
        chrome_options.add_argument("--headless")  # 也可以不使用无头模式来直观地看到浏览器操作

        # 设置Selenium Webdriver
        self.driver = webdriver.Chrome(options=chrome_options)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.driver.quit()

    def clear_and_send_keys(self, element_id, data):
        input_element = self.driver.find_element(By.ID, element_id)
        input_element.clear()  # 先清除输入框
        input_element.send_keys(data)

    def gen_image(self, prompt, width=768, height=768, num_images=1, num_inference_steps=8, guidance_scale=8):
        try:
            # 打开网页
            self.driver.get("https://replicate.com/luosiallen/latent-consistency-model")
            # 可能需要等待页面加载完成
            WebDriverWait(self.driver, 1).until(EC.presence_of_element_located((By.ID, "prompt")))
            print("页面加载完成")

            # 使用helper函数清除并发送keys
            self.clear_and_send_keys("prompt", prompt)
            print("输入prompt成功!")
            self.clear_and_send_keys("width", width)
            self.clear_and_send_keys("height", height)
            self.clear_and_send_keys("num_images", num_images)
            self.clear_and_send_keys("num_inference_steps", num_inference_steps)
            self.clear_and_send_keys("guidance_scale", guidance_scale)

            # 点击按钮
            submitButton = self.driver.find_element(By.XPATH, "//button[@type='submit']")
            submitButton.click()
            print("提交成功!")

            # 初始化变量以跟踪重试次数
            retries = 10
            # 初始化图片链接列表
            images_url = []
            # 尝试最多retries次检查图片元素是否存在
            for attempt in range(retries):
                try:
                    # 检查图片元素是否存在
                    WebDriverWait(self.driver, 5).until(
                        EC.presence_of_all_elements_located((By.CSS_SELECTOR, "img[data-testid='value-output-image']"))
                    )
                    image_elements = self.driver.find_elements(By.CSS_SELECTOR, "img[data-testid='value-output-image']")
                    if image_elements:
                        image_urls = [element.get_attribute("src") for element in image_elements]
                        print(f"找到图片元素:{len(image_elements)}张")
                        return image_urls
                    break  # 如果找到了元素,则跳出循环
                except Exception as e:
                    time.sleep(5)  # 等待5秒后重试
                    print(f"图片元素不存在,等待5秒后进行第 {attempt + 2} 次尝试...")
                    if attempt == retries - 1:
                        raise Exception("图片未能在1分钟内生成!多半是寄了!。")
                self.driver.delete_all_cookies()
        finally:
            # 清理:关闭浏览器
            self.driver.quit()
SnapdragonLee commented 8 months ago

上述办法会进行一些测试