首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【踩坑】mirai挂机运行经常自动退出怎么办?

【踩坑】mirai挂机运行经常自动退出怎么办?

作者头像
小锋学长生活大爆炸
发布2023-05-31 14:39:03
发布2023-05-31 14:39:03
58600
代码可运行
举报
运行总次数:0
代码可运行

背景介绍

        就是说,后台运行了mcl,但经常莫名其妙自动会退出,导致每次都得手动的去服务器上重新启动mcl。而对于自己运行的需要用到mirai的软件,也得重新获取bot id。非常的麻烦!       

解决思路

        1、通过一个python脚本,定时的去检查mcl的运行状态,如果发现mcl退出了,就赶紧重新运行起来。

        2、由于这里重新运行了mcl,我们应该通知其他用到了这个mirai的软件,也需要重新获取bot id。这里使用最简单粗暴的方法:每次重启了mcl,就在指定目录下生成一个文件。而其他软件可以判断是否存在这个,从而决定是否重新获取bot id。(当然,你的软件在每次使用时,都生成一个新的bot id也行,但会导致服务器的缓存占用变高。)

实现方法

        监控mcl的python脚本——listene.py:

代码语言:javascript
代码运行次数:0
运行
复制
import subprocess
import time
import os
import atexit

process = subprocess.Popen(['./mcl -u'])
stoped_flag = False

def kill_process():
    process.kill()

atexit.register(kill_process)  # 注册进程清理函数

while True:
    time.sleep(10)
    poll = process.poll()
    if poll is not None:
        print('./mcl exited unexpectedly, restarting...')
        process = subprocess.Popen(['./mcl -u'])
        stoped_flag = True
    else:
        print('./mcl is running')
        if stoped_flag:
            stoped_flag = False
            with open('mcl_restart', 'w+') as f:
                f.write('1')

        用到了mirai的软件中重新生成bot id的示例用法:

代码语言:javascript
代码运行次数:0
运行
复制
def qqTransfer():
    global bot
    with open('conf.json', 'r+', encoding="utf-8") as f:
        content = f.read()
    conf = json.loads(content)

    auth_key = conf['auth_key']
    bind_qq = conf['bind_qq']
    sleep_time = conf['sleep_time']
    debug_level = conf['debug_level']

    receive_groups = conf['receive_groups']
    send_groups = conf['send_groups']
    # receive_groups = ['537241540', '719684243']
    # send_groups = ['537241540', '719684243']

    logger.setDebugLevel(debug_level)
    
    session = bot.verifySession(auth_key)
    logger.DebugLog(">> session: "+session)
    bot.bindSession(session, bind_qq)
    while True:


        # 看这里看这里!!!!!!!!!!!!!!!!!!!
        if os.path.exists('mcl/mcl_restart'):
            print('>> 重新获取bot session')
            bot = QQBot()
            session = bot.verifySession(auth_key)
            logger.DebugLog(">> session: "+session)
            bot.bindSession(session, bind_qq)
            os.unlink('mcl/mcl_restart')



        cnt = bot.getMessageCount(session)
        if cnt:
            logger.DebugLog('>> 有消息了 => {}'.format(cnt))
            logger.DebugLog('获取消息内容')
            data = bot.getMsgFromGroup(session)
            if len(data) == 0:
                logger.DebugLog('消息为空')
                continue
            logger.DebugLog(data)

            bot.parseMsgForChatGPT(data, bind_qq, session)

            logger.DebugLog('解析消息内容')
            data = bot.parseGroupMsg(data)
            logger.DebugLog(data)
            logger.DebugLog('转发消息内容')
            bot.sendMsgToAllGroups(session, receive_groups, send_groups, data)
        sleep(sleep_time)
    bot.releaseSession(session, bind_qq)

        该代码段取自:mirai QQ机器人最详细教程 [附Q群消息转发例程]

最终效果

         目前mcl一直没有断过。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决思路
  • 实现方法
  • 最终效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档