zhayujie / chatgpt-on-wechat

基于大模型搭建的聊天机器人,同时支持 微信公众号、企业微信应用、飞书、钉钉 等接入,可选择GPT3.5/GPT-4o/GPT-o1/ Claude/文心一言/讯飞星火/通义千问/ Gemini/GLM-4/Claude/Kimi/LinkAI,能处理文本、语音和图片,访问操作系统和互联网,支持基于自有知识库进行定制企业智能客服。
https://docs.link-ai.tech/cow
MIT License
30.31k stars 7.97k forks source link

微信掉线 #1241

Open MrLuer opened 1 year ago

MrLuer commented 1 year ago

前置确认

⚠️ 搜索issues中是否已存在类似问题

操作系统类型?

Railway

运行的python版本是?

python 3.7

使用的chatgpt-on-wechat版本是?

Latest Release

运行的channel类型是?

wx(个人微信, itchat)

复现步骤 🕹

正常在railway上部署

问题描述 😯

railway上部署,运行一段时间微信掉线

终端日志 📒

[WARNING][2023-06-11 08:23:30][chat_channel.py:174] - [WX]any to wav error, use raw path. Expecting value: line 1 column 1 (char 0) [INFO][2023-06-11 08:23:30][bridge.py:30] - create bot openai for voice_to_text [INFO][2023-06-11 08:23:34][openai_voice.py:25] - [Openai] voiceToText text=就拍了很久 在滿洲啊 在寒氣環境啊 水線清洗 一彈1 está lá 你都会不会不要去 voice file name=tmp/230611-082106.mp3 [INFO][2023-06-11 08:23:34][chat_gpt_bot.py:49] - [CHATGPT] query=就拍了很久 在滿洲啊 在寒氣環境啊 水線清洗 一彈1 está lá 你都会不会不要去 [INFO][2023-06-11 08:23:38][wechat_channel.py:184] - [WX] sendMsg=Reply(type=TEXT, content=[bot] 抱歉,这句话非常难以理解。请问这句话的背景和意思是什么?我可以帮助您更好地理解和回答这个问题。), receiver=@230fc5855d5d507cb9b3955ab0fb4f5c2f838451766688f52deec3f4bbb582c6 /entrypoint.sh: line 49: 7 Killed $CHATGPT_ON_WECHAT_EXEC [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: group_chat_prefix=["@bot"] [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: single_chat_prefix=["bot", "@bot"] [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: single_chat_reply_prefix=[bot] [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: group_chat_in_one_session=["ChatGPT测试群"] [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: group_name_white_list=["ChatGPT测试群", "ChatGPT测试群2"] [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: group_speech_recognition=False [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: speech_recognition=True [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: character_desc=你是一个通晓天文地理全能选手。 [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: image_create_prefix=["画", "看", "找"] [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: voice_reply_voice=False [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: open_ai_api_key=sk-lq9zRSAHRGgIvHQ2ZrxXT4BlbkFJhMfGOMZzqQ0fWAypo7fH [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: expires_in_seconds=3600 [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: conversation_max_tokens=1000 [INFO][2023-06-11 08:26:49][config.py:180] - [INIT] override config by environ args: model=gpt-3.5-turbo

zyfhg commented 1 year ago

Fix for ItChat Automatic Logout Issue

问题描述

目前,使用 ItChat 库的 WechatChannel 类存在一个问题,那就是在长时间运行后会自动登出。这可能会中断持续的对话或者其他基于长期在线的活动。

修复方案

修改 chatgpt-on-wechat/channel/wechat/wechat_channel.py 文件 ,在WechatChannel 类中增加两个回调函数 login_callback 和 logout_callback。然后在 itchat.auto_login 的调用中设置这两个回调函数。当logout_callback 被调用时,会重新执行 startup 方法以重新登录。 这样,即使出现自动登出的情况,程序也会自动重新登录,从而避免了中断。 下面是修改后的代码: `@singleton class WechatChannel(ChatChannel): NOT_SUPPORT_REPLYTYPE = []

def __init__(self):
    super().__init__()
    self.receivedMsgs = ExpiredDict(60 * 60 * 24)

def **login_callback(self):**
    print('Login successful')

def logout_callback(self):
    print('Logout')
    self.startup()

def startup(self):
    itchat.instance.receivingRetryCount = 600  # 修改断线超时时间
    # login by scan QRCode
    hotReload = conf().get("hot_reload", False)
    status_path = os.path.join(get_appdata_dir(), "itchat.pkl")
    itchat.auto_login(
        enableCmdQR=2,
        hotReload=hotReload,
        statusStorageDir=status_path,
        qrCallback=qrCallback,
        loginCallback=self.login_callback,
        exitCallback=self.logout_callback
    )
    self.user_id = itchat.instance.storageClass.userName
    self.name = itchat.instance.storageClass.nickName
    logger.info("Wechat login success, user_id: {}, nickname: {}".format(self.user_id, self.name))
    # start message listener
    itchat.run()

`

验证方法

为了验证此修改是否有效,可以长时间运行此程序,并观察是否出现自动登出的情况。在自动登出后,程序应当自动重新登录,如果能成功重新登录,并没有中断任何操作,那么说明这个修改是有效的。

希望这个修复能够帮助到你,如果有任何问题,欢迎进行进一步的讨论。

tophgg commented 1 year ago

Fix for ItChat Automatic Logout Issue

问题描述

目前,使用 ItChat 库的 WechatChannel 类存在一个问题,那就是在长时间运行后会自动登出。这可能会中断持续的对话或者其他基于长期在线的活动。

修复方案

修改 chatgpt-on-wechat/channel/wechat/wechat_channel.py 文件 ,在WechatChannel 类中增加两个回调函数 login_callback 和 logout_callback。然后在 itchat.auto_login 的调用中设置这两个回调函数。当logout_callback 被调用时,会重新执行 startup 方法以重新登录。 这样,即使出现自动登出的情况,程序也会自动重新登录,从而避免了中断。 下面是修改后的代码: `@singleton class WechatChannel(ChatChannel): NOT_SUPPORT_REPLYTYPE = []

def __init__(self):
    super().__init__()
    self.receivedMsgs = ExpiredDict(60 * 60 * 24)

def **login_callback(self):**
    print('Login successful')

def logout_callback(self):
    print('Logout')
    self.startup()

def startup(self):
    itchat.instance.receivingRetryCount = 600  # 修改断线超时时间
    # login by scan QRCode
    hotReload = conf().get("hot_reload", False)
    status_path = os.path.join(get_appdata_dir(), "itchat.pkl")
    itchat.auto_login(
        enableCmdQR=2,
        hotReload=hotReload,
        statusStorageDir=status_path,
        qrCallback=qrCallback,
        loginCallback=self.login_callback,
        exitCallback=self.logout_callback
    )
    self.user_id = itchat.instance.storageClass.userName
    self.name = itchat.instance.storageClass.nickName
    logger.info("Wechat login success, user_id: {}, nickname: {}".format(self.user_id, self.name))
    # start message listener
    itchat.run()

`

验证方法

为了验证此修改是否有效,可以长时间运行此程序,并观察是否出现自动登出的情况。在自动登出后,程序应当自动重新登录,如果能成功重新登录,并没有中断任何操作,那么说明这个修改是有效的。

希望这个修复能够帮助到你,如果有任何问题,欢迎进行进一步的讨论。

昨天尝试了这个修复方案,还是自动登出了,重新登录没成功 ` Unexpected sync check result: window.synccheck={retcode:"1102",selector:"0"}

Logout `

zyfhg commented 1 year ago

能否提供复现步骤和更多日志呢?

MrLuer commented 1 year ago

Fix for ItChat Automatic Logout Issue

问题描述

目前,使用 ItChat 库的 WechatChannel 类存在一个问题,那就是在长时间运行后会自动登出。这可能会中断持续的对话或者其他基于长期在线的活动。

修复方案

修改 chatgpt-on-wechat/channel/wechat/wechat_channel.py 文件 ,在WechatChannel 类中增加两个回调函数 login_callback 和 logout_callback。然后在 itchat.auto_login 的调用中设置这两个回调函数。当logout_callback 被调用时,会重新执行 startup 方法以重新登录。 这样,即使出现自动登出的情况,程序也会自动重新登录,从而避免了中断。 下面是修改后的代码: `@singleton class WechatChannel(ChatChannel): NOT_SUPPORT_REPLYTYPE = []

def __init__(self):
    super().__init__()
    self.receivedMsgs = ExpiredDict(60 * 60 * 24)

def **login_callback(self):**
    print('Login successful')

def logout_callback(self):
    print('Logout')
    self.startup()

def startup(self):
    itchat.instance.receivingRetryCount = 600  # 修改断线超时时间
    # login by scan QRCode
    hotReload = conf().get("hot_reload", False)
    status_path = os.path.join(get_appdata_dir(), "itchat.pkl")
    itchat.auto_login(
        enableCmdQR=2,
        hotReload=hotReload,
        statusStorageDir=status_path,
        qrCallback=qrCallback,
        loginCallback=self.login_callback,
        exitCallback=self.logout_callback
    )
    self.user_id = itchat.instance.storageClass.userName
    self.name = itchat.instance.storageClass.nickName
    logger.info("Wechat login success, user_id: {}, nickname: {}".format(self.user_id, self.name))
    # start message listener
    itchat.run()

`

验证方法

为了验证此修改是否有效,可以长时间运行此程序,并观察是否出现自动登出的情况。在自动登出后,程序应当自动重新登录,如果能成功重新登录,并没有中断任何操作,那么说明这个修改是有效的。

希望这个修复能够帮助到你,如果有任何问题,欢迎进行进一步的讨论。

这个方式似乎不能修复,今天又掉线了,

MrLuer commented 1 year ago

能否提供复现步骤和更多日志呢?

能否提供复现步骤和更多日志呢?

上面的的日志应该提供了所有信息,前后的日志都是正常的。 步骤就是正常railway部署,然后微信登录一段时间就掉线

babyowen commented 1 year ago

我也是的,试验了上面的方法,仍然是继续会自动登出。我用的是腾讯云在新加坡的服务器,也碰到这样的问题,一天左右的时间自动登出,而且奇怪的是日志里没有log out的信息

我看到其它群里有的机器人,每天定时会自动说一句话,像早上的慰问啊等等,是不是他利用这样的方式来保证不会自动掉线

7tinghua commented 3 months ago

这个我解决了,方法也很简单,你就写个脚本去监听这个进程就好了,进程没了就自动重启。

qazxswaaa commented 1 month ago

这个我解决了,方法也很简单,你就写个脚本去监听这个进程就好了,进程没了就自动重启。 请问怎么解决的,这个不是需要手动扫码重新登陆吗

qazxswaaa commented 1 month ago

@7tinghua 请问怎么解决这个掉线问题?