trazyn / weweChat

💬 Unofficial WeChat client built with React, MobX and Electron.
MIT License
5.75k stars 733 forks source link

synccheck 返回 7 时会一直在 synccheck 死循环,再也收不到新消息的问题 #195

Open gclsoft opened 5 years ago

gclsoft commented 5 years ago

遇到过几次, 要怎么修复呢? https://github.com/moontide/WeChatBotEngine/commit/4993c3becc424d8c1bd4e039a025767c6ec1e87e

        var loop = async() => {
            // Start detect timeout
            self.checkTimeout();
          //console.log("session loop after checkTimeout; before synccheck")
            var response = await axios.get(`${host}cgi-bin/mmwebwx-bin/synccheck`, {
                cancelToken: new CancelToken(exe => {
                    // An executor function receives a cancel function as a parameter
                    this.cancelCheck = exe;
                }),
                params: {
                    r: +new Date(),
                    sid: auth.wxsid,
                    uin: auth.wxuin,
                    skey: auth.skey,
                    synckey: self.syncKey,
                }
            }).catch(ex => {
                if (axios.isCancel(ex)) {
                    //console.log("session loop after catch axios.isCancel; after synccheck",ex);
                    loop();
                } else {
                    self.logout('退出 cgi-bin/mmwebwx-bin/synccheck ',ex);
                }
            });

            if (!response) {
                //console.log("session loop response=null; after synccheck");
                // Request has been canceled
                return;
            }

            eval(response.data);

            if (+window.synccheck.retcode === 0) {
                // 2, Has new message
                // 6, New friend
                // 4, Conversation refresh ?
                // 7, Exit or enter
                let selector = +window.synccheck.selector;

                if( selector === 7){
                    console.error("进入/离开聊天页面?修复了死循环检测,如还有问题请联系信息管理员反馈 synccheck selector=",synccheck)
                    return loop();
                }

                if (selector !== 0) {
                    console.log("synccheck selector=",synccheck);
                    await self.getNewMessage();
                }

                // Do next sync keep your wechat alive
                return loop();
            } else {
                console.error("可能是因为您的电脑太卡了,登陆超时正常退出window.synccheck.retcode!=0");
                self.logout('window.synccheck.retcode!=0',null,true);
            }
        };

不知道我这样改可以吗? 因为找不到重现的方法, 会不会这样改一样会死循环调用synccheck 又马上返回7?

gclsoft commented 5 years ago
                let selector = +window.synccheck.selector;
                if( selector === 7){
                    console.error("!!!###尝试修复了死循环检测,请务必联系信息管理员反馈:进入/离开聊天页面 synccheck selector=",synccheck)
                    setTimeout(()=> {
                        return loop();
                    }, 3*1000);
                    return;
                }

                if (selector !== 0) {
                    console.log("synccheck selector=",synccheck);
                    await self.getNewMessage();
                }