Exemplo n.º 1
0
async def animal_on_7_00_to_23_00():
    try:
        Bot_me = nonebot.get_bots()[Config.me]
        logger.success(f"{Config.me}:scheduler-animal")
        choice = ['猫猫', '狗狗']
        choice = random.choice(choice)
        if choice == '猫猫':
            img_url = await get_cat_url()
        elif choice == '狗狗':
            img_url = await get_dog_url()
        else:
            img_url = None
        msg = f'已经{datetime.datetime.now().hour}点了,来看{choice}图叭' + Message(
            f'[CQ:image,file={img_url}]')
        await Bot_me.call_api(
            'send_group_msg', **{
                'message': msg,
                'group_id': Config.test_group
            })
    except:
        logger.error("定时任务animal失败")
Exemplo n.º 2
0
async def member_vocations_monitor():
    logger.debug(f"member_vocations_monitor: vocation checking started")

    from nonebot import get_bots

    over_vocation_user = set()

    for bot_id, bot in get_bots().items():
        group_list = await bot.call_api('get_group_list')
        for group in group_list:
            group_id = group.get('group_id')
            group = DBGroup(group_id=group_id)

            # 跳过不具备权限的组
            if group.permission_command(
            ).result != 1 or group.permission_level().result < 80:
                continue

            # 调用api获取群成员信息
            group_member_list = await bot.call_api(api='get_group_member_list',
                                                   group_id=group_id)

            for user_info in group_member_list:
                user_nickname = user_info['card']
                if not user_nickname:
                    user_nickname = user_info['nickname']
                user_qq = user_info['user_id']
                user = DBUser(user_id=user_qq)
                status, stop_time = user.vocation_status().result
                if status == 1 and datetime.now() >= stop_time:
                    msg = f'【{user_nickname}】的假期已经结束啦~\n快给他/她安排工作吧!'
                    await bot.call_api(api='send_group_msg',
                                       group_id=group_id,
                                       message=msg)
                    over_vocation_user.add(user)
    for user in over_vocation_user:
        _res = user.status_set(status=0)
        if not _res.success():
            logger.error(f"reset user status failed: {_res.info}")
    logger.debug('member_vocations_monitor: vocation checking completed')
Exemplo n.º 3
0
async def pr_on_11_50():
    try:
        Bot_me = nonebot.get_bots()[Config.me]
        logger.success(f"{Config.me}:scheduler-pr")
        for rank in range(3):
            data = await p_rank(rank)
            msg = f'''rank:{rank + 1}
id:{data['id']}
title:{data['title']}
user_id:{data['user_id']}
user_name:{data['user_name']}''' + Message(f'[CQ:image,file={data["url"]}]')
            # await bot.call_api('send_private_msg', **{
            #     'message': msg,
            #     'user_id': Config.superuser
            # })
            await Bot_me.call_api(
                'send_group_msg', **{
                    'message': msg,
                    'group_id': Config.test_group
                })
    except:
        logger.error("定时任务pr失败")
Exemplo n.º 4
0
async def live_dd_each_1_minute():
    dd_list = [77386, 34027]
    try:
        Bot_me = nonebot.get_bots()[Config.me]
        datas = await get_dd_list_status(dd_list=dd_list)
        for data in datas:
            if data['live_status']:
                if data['room_id'] not in live_dd_status or data[
                        'live_time'] != live_dd_status[data['room_id']]:
                    live_dd_status[data['room_id']] = data['live_time']
                    msg = f'''{data["name"]}开播啦!
房间号:{data["room_id"]}
标题:{data["title"]}''' + Message(f'[CQ:image,file={data["img"]}]')
                    await Bot_me.call_api(
                        'send_group_msg', **{
                            'message': msg,
                            'group_id': Config.test_group
                        })
                    logger.success(
                        f'{Config.me}:scheduler-live_dd:{data["name"]}开播啦!')
    except:
        logger.error("定时任务live_dd失败")
Exemplo n.º 5
0
async def test_get(monkeypatch: pytest.MonkeyPatch, nonebug_clear):
    import nonebot
    from nonebot.drivers import ForwardDriver, ReverseDriver
    from nonebot import get_app, get_bot, get_asgi, get_bots, get_driver

    try:
        get_driver()
        assert False, "Driver can only be got after initialization"
    except ValueError:
        assert True

    nonebot.init(driver="nonebot.drivers.fastapi")

    driver = get_driver()
    assert isinstance(driver, ReverseDriver)
    assert get_asgi() == driver.asgi
    assert get_app() == driver.server_app

    runned = False

    def mock_run(*args, **kwargs):
        nonlocal runned
        runned = True
        assert args == ("arg", ) and kwargs == {"kwarg": "kwarg"}

    monkeypatch.setattr(driver, "run", mock_run)
    nonebot.run("arg", kwarg="kwarg")
    assert runned

    try:
        get_bot()
        assert False
    except ValueError:
        assert True

    monkeypatch.setattr(driver, "_clients", {"test": "test"})
    assert get_bot() == "test"
    assert get_bot("test") == "test"
    assert get_bots() == {"test": "test"}
Exemplo n.º 6
0
async def blackjack_statistics_daliy():
    record_dict = get_record_map()
    print(record_dict)
    loser = ''
    loser_score = 0
    for user in record_dict:
        if record_dict[user] < loser_score:
            loser = user
            loser_score = record_dict[user]
    if len(score_dict) == 0:
        return
    elif loser == '':
        msg = {"type": "text", "data": {"text": "忙碌的一天又结束了呢~ 今天的21点最倒霉玩家是……好像是菜菜自己???不可能不可能!菜菜可是出了……不!不是你们想的那个意思哇!你……你们……别过来QAQ!"}}
    else:
        msg = [
            {"type": "text", "data": {"text": "忙碌的一天又结束了呢~ 今天的21点最倒霉玩家是"}},
            {"type": "at", "data": {"qq": loser}},
            {"type": "text", "data": {"text": f" 共计输了{-loser_score}局哦(规则: Blackjack胜利记胜1.5局,普通胜利记胜1局,输掉/爆牌记-1局)"}}
        ]
        from random import randint
        x = randint(1, 5)
        if x == 1:
            msg.append({"type": "text", "data": {"text": "看在这么惨的份上大家请他/她喝杯奶茶吧qwq~"}})
        elif x == 2:
            msg.append({"type": "text", "data": {"text": "看在这么惨的份上大家让他/她日日吧qwq~"}})
        elif x == 3:
            msg.append({"type": "text", "data": {"text": "看在这么惨的份上大家日日他/她吧₍₍ (ง ˙ω˙)ว ⁾⁾"}})
        elif x == 4:
            msg.append({"type": "text", "data": {"text": "看在这么惨的份大家让他/她情喝奶茶吧qwq~"}})
        elif x == 5:
            msg.append({"type": "text", "data": {"text": "弱诶!拜托,你很弱诶!你现在知道谁是老大了哦(ФωФ)"}})

    from nonebot import get_bots
    bot_dict = get_bots()
    if not bot_dict.__contains__('2485909839'):
        return
    bot = bot_dict['2485909839']
    await bot.send_group_msg(group_id=864515208, message=msg)
Exemplo n.º 7
0
async def restart(bot: Bot):
    cqhttp_dir = (await bot.get_version_info())['coolq_directory']
    pids = psutil.process_iter()
    for pid in pids:
        try:
            if 'go-cqhttp' in pid.name() and \
                pid.exe() == path.join(cqhttp_dir, pid.name()):
                subprocess.Popen(
                    pid.exe(),
                    cwd=pid.cwd(),
                    # stdout=subprocess.PIPE,
                    stderr=None
                    if platform.system() == 'Windows' else subprocess.DEVNULL,
                    creationflags=subprocess.CREATE_NEW_CONSOLE
                    if platform.system() == 'Windows' else 0)
                pid.terminate()
                while True:
                    await asyncio.sleep(1)
                    bots = nonebot.get_bots()
                    if bot.self_id in bots:
                        return bots[bot.self_id]
        except psutil.ZombieProcess:
            continue
Exemplo n.º 8
0
async def safe_send(bot_id, send_type, type_id, message, at=False):
    """发送出现错误时, 尝试重新发送, 并捕获异常且不会中断运行"""
    
    try:
        bot = nonebot.get_bots()[str(bot_id)]
    except KeyError:
        logger.error(f"推送失败,Bot({bot_id})未连接")
        return
    
    if at and (await bot.get_group_at_all_remain(group_id=type_id)
               )['can_at_all']:
        message = MessageSegment.at('all') + message

    try:
        return await bot.call_api('send_'+send_type+'_msg', **{
        'message': message,
        'user_id' if send_type == 'private' else 'group_id': type_id
        })
    except ActionFailed as e:
        url = "https://haruka-bot.sk415.icu/usage/faq.html#机器人不发消息也没反应"
        logger.error(f"推送失败,账号可能被风控({url}),错误信息:{e.info}")
    except NetworkError as e:
        logger.error(f"推送失败,请检查网络连接,错误信息:{e.msg}")
Exemplo n.º 9
0
async def remind():
    data_file1 = "/root/testbot/testbot/plugins/config.json"
    with open(data_file1, encoding='utf-8') as f:
        userid_data = json.load(f)
    for userid in userid_data:
        data_file2 = "/root/testbot/testbot/plugins/jjconfig/" + userid + '/update.json'
        with open(data_file2, 'r', encoding='utf-8') as f:
            update_data = json.load(f)
        if 'remind' not in update_data:
            update_data['remind'] = 0
        if update_data['remind'] == 1:
            continue
        if update_data['flag'] == 1:
            update_data['remind'] = 1
            with open(data_file2, 'w', encoding='utf-8') as f:
                json.dump(update_data, f)
            bot = nonebot.get_bots()['80303142']
            message = '[CQ:at,qq=' + userid + ']' + '今日净值全部已更新'
            await bot.call_api('send_group_msg', **{
                'group_id': '235498647',
                'message': message
            })
    return 0
Exemplo n.º 10
0
async def check_auth():
    bot = get_bots()[config.bot_id]
    global GROUP_LIST
    gl = await bot.get_group_list()
    for g in gl:
        if not g["group_id"] in black_list:
            GROUP_LIST[str(g["group_id"])] = g["group_name"]
    try:
        for item in GROUP_LIST.keys():
            msg = ""
            if group_auth.data.get(item):
                group_id = item
                auth_info = group_auth.get_auth_info(item)
                rest_day = cal_day(timeStamp2time(int(auth_info["auth_time"])),
                                   timeStamp2time(time.time())).days
                if rest_day <= 5:
                    if rest_day < 0:
                        msg += "Nia~ 还有人记得猫猫吗?猫猫不要和コッコロちゃん一样!"
                    elif rest_day <= 5:
                        msg += leave_msg[str(rest_day)]
                    msg += f"\n猫猫还会陪伴大家{cal_day(timeStamp2time(int(auth_info['auth_time'])),timeStamp2time(time.time())).days}天"
                    print(group_id, msg)
                    await bot.send_group_msg(group_id=group_id, message=msg)
            else:
                print(f"add new group_info: {item}")
                new_group_info = {
                    item: {
                        "name": GROUP_LIST[item],
                        "join_time": str(int(time.time())),
                        "auth_time": str(int(time.time()) + 7 * 24 * 3600),
                    }
                }
                print(new_group_info)
                group_auth.add_new_group(item, new_group_info)
    except Exception as e:
        await bot.send_group_msg(group_id="426770092",
                                 message=f"zfjbot-auth:{e}")
Exemplo n.º 11
0
async def fetch_and_send(target_type: str):
    config = Config()
    target = config.get_next_target(target_type)
    if not target:
        return
    logger.debug(
        "try to fecth new posts from {}, target: {}".format(target_type, target)
    )
    send_user_list = config.target_user_cache[target_type][target]
    send_userinfo_list = list(
        map(
            lambda user: UserSubInfo(
                user,
                lambda target: config.get_sub_category(
                    target_type, target, user.user_type, user.user
                ),
                lambda target: config.get_sub_tags(
                    target_type, target, user.user_type, user.user
                ),
            ),
            send_user_list,
        )
    )
    bot_list = list(nonebot.get_bots().values())
    bot = bot_list[0] if bot_list else None
    to_send = await platform_manager[target_type].fetch_new_post(
        target, send_userinfo_list
    )
    for user, send_list in to_send:
        for send_post in send_list:
            logger.info("send to {}: {}".format(user, send_post))
            if not bot:
                logger.warning("no bot connected")
            else:
                await send_msgs(
                    bot, user.user, user.user_type, await send_post.generate_messages()
                )
Exemplo n.º 12
0
async def dy_sched():
    """直播推送"""

    with Config() as config:
        uid = config.next_uid('dynamic')
        if not uid:
            return
        push_list = config.get_push_list(uid, 'dynamic')
    
    name = push_list[0]['name']
    logger.debug(f'爬取动态 {name}({uid})')
    api = BiliAPI()
    dynamics = (await api.get_dynamic(uid)).get('cards', []) # 获取最近十二条动态
    # config['uid'][uid]['name'] = dynamics[0]['desc']['user_profile']['info']['uname']
    # await update_config(config)

    if len(dynamics) == 0: # 没有发过动态或者动态全删的直接结束
        return

    if uid not in last_time: # 没有爬取过这位主播就把最新一条动态时间为 last_time
        dynamic = Dynamic(dynamics[0])
        last_time[uid] = dynamic.time
        return
    
    for dynamic in dynamics[4::-1]: # 从旧到新取最近5条动态
        dynamic = Dynamic(dynamic)
        if dynamic.time > last_time[uid] and dynamic.time > datetime.now().timestamp() - timedelta(minutes=10).seconds:
            await dynamic.get_screenshot()
            await dynamic.encode()
            os.remove(dynamic.img_path)
            await dynamic.format()

            for sets in push_list:
                bot = nonebot.get_bots()[sets['bot_id']]
                await safe_send(bot, sets['type'], sets['type_id'], dynamic.message)
            last_time[uid] = dynamic.time
Exemplo n.º 13
0
async def ofl_rmd(bot: Bot):
    dc_time = datetime.now().time().strftime("%H:%M:%S")
    logger.critical(f'Bot {bot.self_id} disconnected')

    ol_bots = [bt for strid, bt in get_bots().items()]
    if ol_bots:
        while ol_bots:
            notifier: Bot = choice(ol_bots)
            try:
                for su in SUPERUSERS:
                    await notifier.send_private_msg(
                        user_id=su,
                        message=f' {bot.self_id}disconnected at {dc_time}')
                break
            except BaseException as err:
                logger.error(
                    f'Bot {notifier.self_id} failed to send offline notification: {err}'
                )
                ol_bots.remove(notifier)
        else:
            logger.error(f'All bots failed to send notification!')

    else:
        logger.critical('There is no bot can send notification!')
Exemplo n.º 14
0
async def living():
    for bot in get_bots().values():
    
        for bid in liveroom:

            lm = liveroom[bid]
            info = live.get_info_(lm['mid'])
            k = info['liveStatus']       
            if k == 1 and lm['status'] == 0:
                
                live.change_status(bid)

                title = info['title']
                cover = info['cover']
                url = info['url']
                
                msg = f'你关注的{lm["nickname"]}开播啦!\n#{title}\n{url}[CQ:image,file={cover}]'
                #print(msg)
                await bot.send_group_msg(group_id=648868273, message=msg) 
            elif k == 0 and lm['status'] == 1:
                live.change_status(bid)
                msg = f'{lm["nickname"]}下播了。。'
                await bot.send_group_msg(group_id=648868273, message=msg)
            await asyncio.sleep(0.5)
Exemplo n.º 15
0
    GroupDecreaseNoticeEvent,
    GroupAdminNoticeEvent,
    GroupBanNoticeEvent,
    GroupRecallNoticeEvent,
    FriendRecallNoticeEvent,
)

import ATRI
from ATRI.service import Service
from ATRI.log import logger as log
from ATRI.rule import is_in_service
from ATRI.config import BotSelfConfig
from ATRI.utils import CoolqCodeChecker

driver = ATRI.driver()
bots = nonebot.get_bots()

ESSENTIAL_DIR = Path(".") / "ATRI" / "data" / "database" / "essential"
MANEGE_DIR = Path(".") / "ATRI" / "data" / "database" / "manege"
os.makedirs(ESSENTIAL_DIR, exist_ok=True)
os.makedirs(MANEGE_DIR, exist_ok=True)


@driver.on_startup
async def startup():
    log.info("アトリは、高性能ですから!")


@driver.on_shutdown
async def shutdown():
    log.info("Thanks for using.")
Exemplo n.º 16
0
def getBot() -> Bot:
    return list(nonebot.get_bots().values())[0]
Exemplo n.º 17
0
def get_first_bot() -> Bot:
    """ 获得连接的第一个 bot """
    if get_bots():
        return list(get_bots().values())[0]
Exemplo n.º 18
0
async def yincha():
    (bot, ) = nonebot.get_bots().values()
    for id in group_id_list:
        await bot.send_msg(message_type="group",
                           group_id=int(id),
                           message='三点几嚟,做碌鸠啊做!做这么多,老板不会心疼你的,饮茶先啦!')
Exemplo n.º 19
0
async def bilibili_dynamic_monitor():

    logger.debug(f"bilibili_dynamic_monitor: checking started")

    # 获取当前bot列表
    bots = []
    for bot_id, bot in get_bots().items():
        bots.append(bot)

    # 获取所有有通知权限的群组
    all_noitce_groups = []
    t = DBTable(table_name='Group')
    for item in t.list_col_with_condition('group_id', 'notice_permissions', 1).result:
        all_noitce_groups.append(int(item[0]))

    # 获取订阅表中的所有动态订阅
    check_sub = []
    t = DBTable(table_name='Subscription')
    for item in t.list_col_with_condition('sub_id', 'sub_type', 2).result:
        check_sub.append(int(item[0]))

    # 注册一个异步函数用于检查动态
    async def check_dynamic(dy_uid):
        # 获取动态并返回动态类型及内容
        try:
            _res = await get_user_dynamic_history(dy_uid=dy_uid)
            if not _res.success():
                logger.error(f'bilibili_dynamic_monitor: 获取动态失败, uid: {dy_uid}, error: {_res.info}')
                return
        except Exception as _e:
            logger.error(f'bilibili_dynamic_monitor: 获取动态失败, uid: {dy_uid}, error: {repr(_e)}')
            return

        dynamic_info = dict(_res.result)

        # 用户所有的动态id
        _res = get_user_dynamic(user_id=dy_uid)
        if not _res.success():
            logger.error(f'bilibili_dynamic_monitor: 获取用户已有动态失败, uid: {dy_uid}, error: {_res.info}')
            return
        user_dy_id_list = list(_res.result)

        sub = DBSubscription(sub_type=2, sub_id=dy_uid)

        # 获取订阅了该直播间的所有群
        sub_group = sub.sub_group_list().result
        # 需通知的群
        notice_group = list(set(all_noitce_groups) & set(sub_group))

        for num in range(len(dynamic_info)):
            try:
                # 如果有新的动态
                if dynamic_info[num]['id'] not in user_dy_id_list:
                    logger.info(f"用户: {dy_uid}/{dynamic_info[num]['name']} 新动态: {dynamic_info[num]['id']}")
                    # 转发的动态
                    if dynamic_info[num]['type'] == 1:
                        # 获取原动态信息
                        origin_dynamic_id = dynamic_info[num]['origin']
                        _dy_res = await get_dynamic_info(dynamic_id=origin_dynamic_id)
                        if not _dy_res.success():
                            msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}'.format(
                                dynamic_info[num]['name'], 'Unknown',
                                dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
                                'Unknown', '获取原动态失败'
                            )
                        else:
                            origin_dynamic_info = _dy_res.result
                            # 原动态type=2, 带图片
                            if origin_dynamic_info['type'] == 2:
                                # 处理图片序列
                                pic_segs = ''
                                for pic_url in origin_dynamic_info['origin_pics']:
                                    _res = await pic_2_base64(pic_url)
                                    pic_b64 = _res.result
                                    pic_segs += f'{MessageSegment.image(pic_b64)}\n'
                                msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}\n{}'.format(
                                    dynamic_info[num]['name'], origin_dynamic_info['name'],
                                    dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
                                    origin_dynamic_info['name'], origin_dynamic_info['content'],
                                    pic_segs
                                )
                            # 原动态为其他类型, 无图
                            else:
                                msg = '{}转发了{}的动态!\n\n“{}”\n{}\n{}\n@{}: {}'.format(
                                    dynamic_info[num]['name'], origin_dynamic_info['name'],
                                    dynamic_info[num]['content'], dynamic_info[num]['url'], '=' * 16,
                                    origin_dynamic_info['name'], origin_dynamic_info['content']
                                )
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 原创的动态(有图片)
                    elif dynamic_info[num]['type'] == 2:
                        # 处理图片序列
                        pic_segs = ''
                        for pic_url in dynamic_info[num]['pic_urls']:
                            _res = await pic_2_base64(pic_url)
                            pic_b64 = _res.result
                            pic_segs += f'{MessageSegment.image(pic_b64)}\n'
                        msg = '{}发布了新动态!\n\n“{}”\n{}\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['content'],
                            dynamic_info[num]['url'], pic_segs)
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 原创的动态(无图片)
                    elif dynamic_info[num]['type'] == 4:
                        msg = '{}发布了新动态!\n\n“{}”\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['content'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 视频
                    elif dynamic_info[num]['type'] == 8:
                        msg = '{}发布了新的视频!\n\n《{}》\n“{}”\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['origin'],
                            dynamic_info[num]['content'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 小视频
                    elif dynamic_info[num]['type'] == 16:
                        msg = '{}发布了新的小视频动态!\n\n“{}”\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['content'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 番剧
                    elif dynamic_info[num]['type'] in [32, 512]:
                        msg = '{}发布了新的番剧!\n\n《{}》\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['origin'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 文章
                    elif dynamic_info[num]['type'] == 64:
                        msg = '{}发布了新的文章!\n\n《{}》\n“{}”\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['origin'],
                            dynamic_info[num]['content'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # 音频
                    elif dynamic_info[num]['type'] == 256:
                        msg = '{}发布了新的音乐!\n\n《{}》\n“{}”\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['origin'],
                            dynamic_info[num]['content'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    # B站活动相关
                    elif dynamic_info[num]['type'] == 2048:
                        msg = '{}发布了一条活动相关动态!\n\n【{}】\n“{}”\n{}'.format(
                            dynamic_info[num]['name'], dynamic_info[num]['origin'],
                            dynamic_info[num]['content'], dynamic_info[num]['url'])
                        for group_id in notice_group:
                            for _bot in bots:
                                try:
                                    await _bot.call_api(api='send_group_msg', group_id=group_id, message=msg)
                                    logger.info(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']}")
                                except Exception as _e:
                                    logger.warning(f"向群组: {group_id} 发送新动态通知: {dynamic_info[num]['id']} 失败, "
                                                   f"error: {repr(_e)}")
                                    continue
                    elif dynamic_info[num]['type'] == -1:
                        logger.warning(f"未知的动态类型: {dynamic_info[num]['id']}")
                    # 更新动态内容到数据库
                    dy_id = dynamic_info[num]['id']
                    dy_type = dynamic_info[num]['type']
                    content = dynamic_info[num]['content']
                    # 向数据库中写入动态信息
                    dynamic = DBDynamic(uid=dy_uid, dynamic_id=dy_id)
                    _res = dynamic.add(dynamic_type=dy_type, content=content)
                    if _res.success():
                        logger.info(f"向数据库写入动态信息: {dynamic_info[num]['id']} 成功")
                    else:
                        logger.error(f"向数据库写入动态信息: {dynamic_info[num]['id']} 失败")
            except Exception as _e:
                logger.error(f'bilibili_dynamic_monitor: 解析新动态: {dy_uid} 的时发生了错误, error info: {repr(_e)}')

    # 检查所有在订阅表里面的直播间(异步)
    tasks = []
    for uid in check_sub:
        tasks.append(check_dynamic(uid))
    try:
        await asyncio.gather(*tasks)
        logger.debug('bilibili_dynamic_monitor: checking completed')
    except Exception as e:
        logger.error(f'bilibili_dynamic_monitor: error occurred in checking  {repr(e)}')
Exemplo n.º 20
0
async def report_status(bot: Bot):
    bots_dict = get_bots()
    msg = f'{len(bots_dict)} connection(s):\n' + '\n'.join(
        [q for q in bots_dict])
    await connection_report.send(msg)
Exemplo n.º 21
0
def daily_setu():
    logger.success('daily setu进程开启!')
    time.sleep(5)
    daily_setu_time = nonebot.get_driver().config.daily_setu_time

    while True:
        try:
            now_time = get_beijing_time()
            send_time = datetime.datetime.strptime(
                str(now_time.date()) + daily_setu_time, '%Y-%m-%d%H:%M')
            prepare_time = send_time - datetime.timedelta(minutes=10)
            logger.info('daily setu | 北京时间|{beijing_time}'.format(
                beijing_time=str(now_time)))
            # 达到时间,开始准备涩图
            if (prepare_time < now_time < send_time):
                try:
                    logger.info('达到时间,开始准备涩图')
                    bots = get_bots()
                    bot = None
                    for id in bots.keys():
                        bot = bots[id]

                    setu_list = get_daily_setu()
                    if (len(setu_list) == 0):
                        # 出现任何异常则跳过准备时间的十分钟
                        time.sleep(660)
                        raise Exception('今日排行版没有符合条件的涩图')
                        # 访问涩图排行版正确,但是没有符合条件的涩图
                    logger.info('成功获取每日涩图列表!')
                    for setu in setu_list:
                        setu.pic_file = save_setu(setu.url)
                    logger.info('成功缓存每日涩图!')

                    # 获得开启日常涩图功能的群号
                    daily_setu_group = nonebot.get_driver().config.daily_setu
                    while True:
                        try:
                            now_time = get_beijing_time()
                            logger.info('每日涩图等待发送...')
                            # 达到发送时间,发送
                            if (now_time > send_time):
                                for group in daily_setu_group.keys():
                                    asyncio.run(
                                        send_daily_setu(
                                            daily_setu_group[group], bot,
                                            setu_list))
                                logger.info('每日涩图发送完成!')
                                break
                            time.sleep(30)
                        except Exception as e:
                            pass

                except Exception as e:
                    for group in daily_setu_group.keys():
                        asyncio.run(
                            bot.send_group_msg(
                                group_id=daily_setu_group[group],
                                message=str(e.args[0])))
                    logger.error(e.args[0])
                finally:
                    for setu in setu_list:
                        try:
                            os.remove(setu.pic_file)
                        except Exception:
                            pass
                    logger.info('删除每日涩图成功!')
                # delete pic
        except Exception as e:
            logger.error(e.args[0])

        time.sleep(60)
Exemplo n.º 22
0
async def bilibili_live_monitor():

    logger.debug(f"bilibili_live_monitor: checking started")
    global live_title
    global live_status
    global live_up_name

    # 获取当前bot列表
    bots = []
    for bot_id, bot in get_bots().items():
        bots.append(bot)

    # 获取所有有通知权限的群组
    all_noitce_groups = []
    t = DBTable(table_name='Group')
    for item in t.list_col_with_condition('group_id', 'notice_permissions',
                                          1).result:
        all_noitce_groups.append(int(item[0]))

    # 获取订阅表中的所有直播间订阅
    check_sub = []
    t = DBTable(table_name='Subscription')
    for item in t.list_col_with_condition('sub_id', 'sub_type', 1).result:
        check_sub.append(int(item[0]))

    # 注册一个异步函数用于检查直播间状态
    async def check_live(room_id: int):
        # 获取直播间信息
        _res = await get_live_info(room_id=room_id)
        if not _res.success():
            logger.error(
                f'bilibili_live_monitor: 获取直播间信息失败, room_id: {room_id}, error: {_res.info}'
            )
            return
        live_info = _res.result

        sub = DBSubscription(sub_type=1, sub_id=room_id)

        # 获取订阅了该直播间的所有群
        sub_group = sub.sub_group_list().result
        # 需通知的群
        notice_group = list(set(all_noitce_groups) & set(sub_group))

        up_name = live_up_name[room_id]

        # 检查是否是已开播状态, 若已开播则监测直播间标题变动
        # 为避免开播时同时出现标题变更通知和开播通知, 在检测到直播状态变化时更新标题, 且仅在直播状态为直播中时发送标题变更通知
        if live_info['status'] != live_status[room_id]\
                and live_info['status'] == 1\
                and live_info['title'] != live_title[room_id]:
            # 更新标题
            live_title[room_id] = live_info['title']
            logger.info(
                f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}")
        elif live_info[
                'status'] == 1 and live_info['title'] != live_title[room_id]:
            # 通知有通知权限且订阅了该直播间的群
            cover_pic = await pic_2_base64(url=live_info.get('cover_img'))
            if cover_pic.success():
                msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{MessageSegment.image(cover_pic.result)}"
            else:
                # msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】\n{live_info['url']}"
                msg = f"{up_name}的直播间换标题啦!\n\n【{live_info['title']}】"
            for group_id in notice_group:
                for _bot in bots:
                    try:
                        await _bot.call_api(api='send_group_msg',
                                            group_id=group_id,
                                            message=msg)
                        logger.info(f"向群组: {group_id} 发送直播间: {room_id} 标题变更通知")
                    except Exception as _e:
                        logger.warning(
                            f"向群组: {group_id} 发送直播间: {room_id} 标题变更通知失败, error: {repr(_e)}"
                        )
                        continue
            live_title[room_id] = live_info['title']
            logger.info(
                f"直播间: {room_id}/{up_name} 标题变更为: {live_info['title']}")

        # 检测开播/下播
        # 检查直播间状态与原状态是否一致
        if live_info['status'] != live_status[room_id]:
            try:
                # 现在状态为未开播
                if live_info['status'] == 0:
                    live_start_info = f"LiveEnd! Room: {room_id}/{up_name}"
                    new_event = DBHistory(time=int(time.time()),
                                          self_id=-1,
                                          post_type='bilibili',
                                          detail_type='live')
                    new_event.add(sub_type='live_end',
                                  user_id=room_id,
                                  user_name=up_name,
                                  raw_data=repr(live_info),
                                  msg_data=live_start_info)

                    msg = f'{up_name}下播了'
                    # 通知有通知权限且订阅了该直播间的群
                    for group_id in notice_group:
                        for _bot in bots:
                            try:
                                await _bot.call_api(api='send_group_msg',
                                                    group_id=group_id,
                                                    message=msg)
                                logger.info(
                                    f"向群组: {group_id} 发送直播间: {room_id} 下播通知")
                            except Exception as _e:
                                logger.warning(
                                    f"向群组: {group_id} 发送直播间: {room_id} 下播通知失败, error: {repr(_e)}"
                                )
                                continue
                    # 更新直播间状态
                    live_status[room_id] = live_info['status']
                    logger.info(f"直播间: {room_id}/{up_name} 下播了")
                # 现在状态为直播中
                elif live_info['status'] == 1:
                    # 记录准确开播信息
                    live_start_info = f"LiveStart! Room: {room_id}/{up_name}, Title: {live_info['title']}, " \
                                      f"TrueTime: {live_info['time']}"
                    new_event = DBHistory(time=int(time.time()),
                                          self_id=-1,
                                          post_type='bilibili',
                                          detail_type='live')
                    new_event.add(sub_type='live_start',
                                  user_id=room_id,
                                  user_name=up_name,
                                  raw_data=repr(live_info),
                                  msg_data=live_start_info)

                    cover_pic = await pic_2_base64(
                        url=live_info.get('cover_img'))
                    if cover_pic.success():
                        msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】" \
                              f"\n{MessageSegment.image(cover_pic.result)}"
                    else:
                        # msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】\n{live_info['url']}"
                        msg = f"{live_info['time']}\n{up_name}开播啦!\n\n【{live_info['title']}】"
                    for group_id in notice_group:
                        for _bot in bots:
                            try:
                                await _bot.call_api(api='send_group_msg',
                                                    group_id=group_id,
                                                    message=msg)
                                logger.info(
                                    f"向群组: {group_id} 发送直播间: {room_id} 开播通知")
                            except Exception as _e:
                                logger.warning(
                                    f"向群组: {group_id} 发送直播间: {room_id} 开播通知失败, error: {repr(_e)}"
                                )
                                continue
                    live_status[room_id] = live_info['status']
                    logger.info(f"直播间: {room_id}/{up_name} 开播了")
                # 现在状态为未开播(轮播中)
                elif live_info['status'] == 2:
                    live_start_info = f"LiveEnd! Room: {room_id}/{up_name}"
                    new_event = DBHistory(time=int(time.time()),
                                          self_id=-1,
                                          post_type='bilibili',
                                          detail_type='live')
                    new_event.add(sub_type='live_end_with_playlist',
                                  user_id=room_id,
                                  user_name=up_name,
                                  raw_data=repr(live_info),
                                  msg_data=live_start_info)

                    msg = f'{up_name}下播了(轮播中)'
                    for group_id in notice_group:
                        for _bot in bots:
                            try:
                                await _bot.call_api(api='send_group_msg',
                                                    group_id=group_id,
                                                    message=msg)
                                logger.info(
                                    f"向群组: {group_id} 发送直播间: {room_id} 下播通知")
                            except Exception as _e:
                                logger.warning(
                                    f"向群组: {group_id} 发送直播间: {room_id} 下播通知失败, error: {repr(_e)}"
                                )
                                continue
                    live_status[room_id] = live_info['status']
                    logger.info(f"直播间: {room_id}/{up_name} 下播了(轮播中)")
            except Exception as _e:
                logger.warning(
                    f'试图向群组发送直播间: {room_id}/{up_name} 的直播通知时发生了错误: {repr(_e)}')

    # 检查所有在订阅表里面的直播间(异步)
    tasks = []
    for rid in check_sub:
        tasks.append(check_live(rid))
    try:
        await asyncio.gather(*tasks)
        logger.debug('bilibili_live_monitor: checking completed')
    except Exception as e:
        logger.error(
            f'bilibili_live_monitor: error occurred in checking  {repr(e)}')
Exemplo n.º 23
0
async def invite_auto(ev: Event = {}):
    bot = get_bots()[config.bot_id]
    msg = ""
    with open(os.path.join(plugin_path, "account.json")) as fp:
        config_json = json.load(fp)
    white_list = config_json["white_list"]
    while client.shouldLogin:
        await client.login()
    if os.path.exists(plugin_path + "/data.json"):
        with open(plugin_path + "/data.json", "rb") as f:
            data_save = json.loads(f.read())
    else:
        data_save = ""
    # 获取游戏内信息
    clan_info_data = {
        "clan_id": 0,
        "get_user_equip": 1,
        "viewer_id": client.viewer_id,
    }
    clan_info = await client.callapi("/clan/info", clan_info_data)
    member_list = {}
    if clan_info.get("clan"):
        for item in clan_info["clan"]["members"]:
            member_list[item["viewer_id"]] = item["name"]
    clan_join_request_list_data = {
        "clan_id": clan_info["clan"]["detail"]["clan_id"],
        "page": 0,
        "oldest_time": 0,
        "viewer_id": client.viewer_id,
    }
    join_request_list = await client.callapi("/clan/join_request_list", clan_join_request_list_data)
    # print("join_request_list", join_request_list)
    reruest_list = [item["viewer_id"] for item in join_request_list["list"]]
    # print(reruest_list)
    for item in join_request_list["list"]:
        # 自动同意,想要启用自动同意取消注释即可,懒得写开关了
        # if item["viewer_id"] in white_list:
        #     clan_join_request_accept_data = {
        #         "request_viewer_id": item["viewer_id"],
        #         "clan_id": clan_info["clan"]["detail"]["clan_id"],
        #         "viewer_id": client.viewer_id,
        #     }
        #     clan_join_request_accept = await client.callapi("/clan/join_request_accept", clan_join_request_accept_data)
        #     print(f"同意{item['name']}加入公会")
        #     msg+=f"哦,是猫猫的好朋友{item['name']}来了,已自动同意加入公会{clan_info['clan']['detail']['clan_name']}"
        #     request_count-=1
        #     print("clan_join_request_accept", clan_join_request_accept)
        # else:
        # if data_save.get('invite_list'):
        if data_save["invite_list"].get(str(item["viewer_id"])):
            # 有效申请
            print(time.time() - int(data_save["invite_list"][str(item["viewer_id"])]["create_time"]))
            print("is_old", data_save["invite_list"][str(item["viewer_id"])]["old"])
            if (
                time.time() - int(data_save["invite_list"][str(item["viewer_id"])]["create_time"]) < 10 * 60
                or data_save["invite_list"][str(item["viewer_id"])]["old"]
            ):
                data_save["invite_list"][str(item["viewer_id"])]["old"] = False
                msg += f"嗯? {item['name']} 申请加入公会,猫猫要怎么做呢?\nuid:{item['viewer_id']}"
                print("msg:", msg)
        else:
            # 新的申请
            data_save["invite_list"][str(item["viewer_id"])]["old"] = False
            msg += f"嗯? {item['name']} 申请加入公会,猫猫要怎么做呢?\nuid:{item['viewer_id']}"
            data_save["invite_list"][str(item["viewer_id"])] = {"create_time": int(time.time())}
        with open(plugin_path + "/data.json", "w", encoding="utf8") as f:
            json.dump(data_save, f, ensure_ascii=False)
    # 过期申请
    for item in data_save["invite_list"]:
        if item not in reruest_list:
            data_save["invite_list"][item]["old"] = True
    if msg != "":
        msg += f"\n================\ninvite <uid>: 有申请则通过,无申请则邀请"
    if ev:
        await bot.send(ev, message=Message(f"{msg}"), at_sender=True)
    elif msg:
        await bot.send_group_msg(
            group_id=account_json["group_id"], message=Message(f"[CQ:at,qq={account_json['admin']}]\n{msg}")
        )
        # await bot.send_group_msg(group_id=618773789, message=f"[CQ:at,qq={account_json['admin']}]\n{msg}")
    # 自动邀请,鸽了
    return
Exemplo n.º 24
0
async def pixivision_monitor():
    logger.debug(f"pixivision_monitor: checking started")

    # 获取当前bot列表
    bots = []
    for bot_id, bot in get_bots().items():
        bots.append(bot)

    # 获取所有有通知权限的群组
    all_noitce_groups = []
    t = DBTable(table_name='Group')
    for item in t.list_col_with_condition('group_id', 'notice_permissions',
                                          1).result:
        all_noitce_groups.append(int(item[0]))

    # 初始化tag黑名单
    block_tag_id = []
    block_tag_name = []
    for block_tag in TAG_BLOCK_LIST:
        block_tag_id.append(block_tag.get('id'))
        block_tag_name.append(block_tag.get('name'))

    # 提取数据库中已有article的id列表
    exist_article = []
    t = DBTable(table_name='Pixivision')
    for item in t.list_col('aid').result:
        exist_article.append(int(item[0]))

    # 获取最新一页pixivision的article
    new_article = []
    _res = await get_pixivsion_article()
    if _res.success() and not _res.result.get('error'):
        try:
            pixivsion_article = dict(_res.result)
            for article in pixivsion_article['body']['illustration']:
                article_tags_id = []
                article_tags_name = []
                for tag in article['tags']:
                    article_tags_id.append(int(tag['tag_id']))
                    article_tags_name.append(str(tag['tag_name']))
                # 跳过黑名单tag的article
                if list(set(article_tags_id) & set(block_tag_id)) or list(
                        set(article_tags_name) & set(block_tag_name)):
                    continue
                # 获取新的article内容
                if int(article['id']) not in exist_article:
                    logger.info(
                        f"pixivision_monitor: 检查到新的Pixivision article: {article['id']}"
                    )
                    new_article.append({
                        'aid': int(article['id']),
                        'tags': article_tags_name
                    })
        except Exception as e:
            logger.error(
                f'pixivision_monitor: an error occured in checking pixivision: {repr(e)}'
            )
            return
    else:
        logger.error(
            f'pixivision_monitor: checking pixivision timeout or other error: {_res.info}'
        )
        return

    if not new_article:
        logger.info(f'pixivision_monitor: checking completed, 没有新的article')
        return

    sub = DBSubscription(sub_type=8, sub_id=-1)
    # 获取订阅了该直播间的所有群
    sub_group = sub.sub_group_list().result
    # 需通知的群
    notice_group = list(set(all_noitce_groups) & set(sub_group))

    # 处理新的aritcle
    for article in new_article:
        aid = int(article['aid'])
        tags = list(article['tags'])
        a_res = await pixivsion_article_parse(aid=aid, tags=tags)
        if a_res.success():
            if not notice_group:
                continue
            article_data = a_res.result
            msg = f"新的Pixivision特辑!\n\n" \
                  f"《{article_data['title']}》\n\n{article_data['description']}\n{article_data['url']}"
            for group_id in notice_group:
                for _bot in bots:
                    try:
                        await _bot.call_api(api='send_group_msg',
                                            group_id=group_id,
                                            message=msg)
                    except Exception as e:
                        logger.warning(
                            f"向群组: {group_id} 发送article简介信息失败, error: {repr(e)}"
                        )
                        continue
            # 处理article中图片内容
            tasks = []
            for pid in article_data['illusts_list']:
                tasks.append(fetch_image_b64(pid=pid))
            p_res = await asyncio.gather(*tasks)
            image_error = 0
            for image_res in p_res:
                if not image_res.success():
                    image_error += 1
                    continue
                else:
                    img_seg = MessageSegment.image(image_res.result)
                # 发送图片
                for group_id in notice_group:
                    for _bot in bots:
                        try:
                            await _bot.call_api(api='send_group_msg',
                                                group_id=group_id,
                                                message=img_seg)
                        except Exception as e:
                            logger.warning(
                                f"向群组: {group_id} 发送图片内容失败, error: {repr(e)}")
                            continue
            logger.info(f"article: {aid} 图片已发送完成, 失败: {image_error}")
        else:
            logger.error(f"article: {aid} 信息解析失败, info: {a_res.info}")
    logger.info(
        f'pixivision_monitor: checking completed, 已处理新的article: {repr(new_article)}'
    )
Exemplo n.º 25
0
async def errlogger(msg):
    bot = get_bots()[config.bot_id]
    await bot.send_private_msg(user_id=acinfo["admin"], Message=f"猫猫登录错误:{msg}")
Exemplo n.º 26
0
async def update_rss(rss: Rss, mode='init'):
    try:
        connect = sqlite3.connect('./db/rss.db')
        cursor = connect.cursor()
        if (mode == 'init'):
            results = cursor.execute(
                'SELECT * FROM rss WHERE rss_url="{rss_url}"'.format(
                    rss_url=rss.url))
            results = [result for result in results]
            rss.id = results[0][0]

        r = requests.get(rss.url)
        r = feedparser.parse(r.text)
        new_items = [
            Item(rss_id=rss.id, title=item['title'], link=item['link'])
            for item in r['entries']
        ]

        # 与存储在数据库中的item进行比较,查看是否有更新
        sql = 'SELECT * FROM items WHERE rss_id={rss_id}'.format(rss_id=rss.id)
        results = cursor.execute(sql)
        old_items = [
            Item(rss_id=item[0], id=item[1], title=item[2], link=item[3])
            for item in results
        ]

        update_items = []
        for new_item in new_items:
            is_update = True
            for old_item in old_items:
                if (old_item.title == new_item.title
                        and old_item.link == new_item.link):
                    is_update = False
                    break
            if (is_update):
                update_items.append(new_item)

        if (len(update_items) >= 1):
            for item in update_items:
                sql = 'INSERT INTO items (rss_id,title,link) VALUES({rss_id},"{title}","{link}");'.format(
                    rss_id=item.rss_id,
                    title=item.title.replace('"', '""'),
                    link=item.link)
                cursor.execute(sql)
            connect.commit()
            if (mode == 'update'):
                bots = get_bots()
                bot = None
                for id in bots.keys():
                    bot = bots[id]
                subscribres = cursor.execute(
                    'SELECT * FROM subscribe WHERE rss_id={rss_id}'.format(
                        rss_id=rss.id))
                for update in update_items:
                    for subscribre in subscribres:
                        reply = msg.at(user_id=subscribre[1])
                        reply = reply + '您所订阅的{rss_name}更新了\r\ntitle:{title}\r\nurl:{url}'.format(
                            rss_name=subscribre[5],
                            title=update.title,
                            url=update.link)
                        try:
                            await bot.send_group_msg(group_id=subscribre[2],
                                                     message=reply)
                        except Exception:
                            raise Exception('发送rss更新失败!')
    except Exception as e:
        logger.error('rss {name}更新失败!'.format(name=rss.name))
        raise Exception(e.args[0])
    finally:
        cursor.close()
        connect.close()
Exemplo n.º 27
0
def get_first_bot() -> Optional[Bot]:
    """ 获得连接的第一个 bot """
    if get_bots():
        return list(get_bots().values())[0]
Exemplo n.º 28
0
async def sleep():
    for bot in get_bots().values():
        for group in groups:
            await bot.send_group_msg(group_id=group, message=sleep_img)
Exemplo n.º 29
0
def get_bot():
    if nonebot.get_bots():
        return list(nonebot.get_bots().values())[0]
Exemplo n.º 30
0
async def check(bot: Bot = get_bots(), event: Event = {}):
    print("ev", event)
    bot = get_bots()[config.bot_id]
    while client.shouldLogin:
        await client.login()

    if os.path.exists(plugin_path + "/data.json"):
        with open(plugin_path + "/data.json", "rb") as f:
            data_save = json.loads(f.read())
    else:
        data_save = ""
    result = []
    # /clan/info
    data1 = {
        "clan_id": 0,
        "get_user_equip": 1,
        "viewer_id": client.viewer_id,
    }
    res1 = await client.callapi("/clan/info", data1)
    # print("res1:", res1)
    # /clan/chat_info_list
    data2 = {
        "clan_id": res1["clan"]["detail"]["clan_id"],
        "start_message_id": 0,
        "search_date": "2099-12-31",
        "direction": 1,
        "count": 10,
        "wait_interval": 3,
        "update_message_ids": [],
        "viewer_id": client.viewer_id,
    }
    res2 = await client.callapi("/clan/chat_info_list", data2)
    # print("res2:", res2)
    clan_chat_message = res2["clan_chat_message"]
    equip_requests = res2["equip_requests"]
    users = res2["users"]
    # 只统计8小时内的
    for equip_request in equip_requests:
        for chat_message in clan_chat_message:
            if (
                chat_message["message_id"] == equip_request["message_id"]
                and int(time.time()) - int(chat_message["create_time"]) <= 8 * 3600
            ):
                # print(equip_request)
                # print(chat_message["create_time"])
                for user in users:
                    if user["viewer_id"] == chat_message["viewer_id"]:
                        # print(chat_message["viewer_id"], user["name"])
                        result.append(
                            {
                                "viewer_id": equip_request["viewer_id"],
                                "name": user["name"],
                                "equip_id": equip_request["equip_id"],
                                "request_num": equip_request["request_num"],
                                "donation_num": equip_request["donation_num"],
                                "create_time": chat_message["create_time"],
                            }
                        )
    # print(result)
    remind_list = []
    if not event:
        if data_save != {}:
            for item in result:
                if data_save["users"].get(str(item["viewer_id"])):
                    # 新请求提醒
                    if data_save["users"][str(item["viewer_id"])]["create_time"] != item["create_time"]:
                        remind_list.append(item)
                    # 请求将要结束提醒
                    elif (
                        0 <= item["create_time"] + 8 * 3600 - int(time.time()) <= 15 * 60 and item["donation_num"] < 10
                    ):
                        remind_list.append(item)
                else:
                    remind_list.append(item)
        else:
            for item in result:
                remind_list.append(item)
    else:
        for item in result:
            remind_list.append(item)
    for item in result:
        data_save["users"][str(item["viewer_id"])] = item
    print("remind_list:", remind_list)
    reply = ""
    for i in range(len(remind_list)):
        reply += f"{remind_list[i]['name']}请求装备:{equip_data_dict[remind_list[i]['equip_id']]}\n目前捐助:{remind_list[i]['donation_num']}/{remind_list[i]['request_num']}\n结束时间:{time.strftime('%H:%M:%S',time.localtime(int(remind_list[i]['create_time'])+8*3600))}\n=============="
        if i != len(remind_list) - 1:
            reply += "\n"
    # 写入文件
    with open(plugin_path + "/data.json", "w", encoding="utf8") as f:
        json.dump(data_save, f, ensure_ascii=False)
    # print("reply:", reply)
    print(event)
    if event:
        await bot.send(event, message=Message(f"[CQ:at,qq={account_json['admin']}]\n{reply}"))
    elif reply:
        await bot.send_group_msg(
            group_id=account_json["group_id"], message=Message(f"[CQ:at,qq={account_json['admin']}]\n{reply}")
        )
        # await bot.send_group_msg(group_id=618773789, message=f"[CQ:at,qq={account_json['admin']}]\n{reply}")
    await invite_auto()
    return remind_list