Example #1
0
async def group_message_listener(app: GraiaMiraiApplication, group: Group,
                                 message: MessageChain, member: Member):
    # print(group)
    # id=1130879466 name='测试群' accountPerm=<MemberPerm.Member: 'MEMBER'>
    # print(type(group))
    if group.id in config.GROUPS:
        # print(message.asDisplay())
        # print(message.__root__)
        # print(message.__root__[2].target)
        # print(type(message.__root__[2].target))
        if config.STATE == 0 and message.asDisplay() == "开启bot":
            await app.sendGroupMessage(group,
                                       MessageChain.create([Plain("加载群成员数据")]))
            group_info = await app.memberList(group)
            for i in group_info:
                Player.member_list[i.id] = i.name
            print(Player.member_list)
            await app.sendGroupMessage(
                group, MessageChain.create([Plain("加载成功\n bot已开启")]))
            # bot start
            config.STATE = 1
        elif config.STATE == 1 and message.asDisplay() == "关闭bot":
            config.STATE = 0
            await app.sendGroupMessage(group,
                                       MessageChain.create([Plain("关闭bot")]))
        elif (config.STATE == 0 and message.asDisplay() == "关闭bot") or \
            (config.STATE == 1 and message.asDisplay() == "开启bot"):
            await app.sendGroupMessage(group,
                                       MessageChain.create([Plain("异常操作")]))
        elif config.STATE == 1:
            message_return = ""
            # 申请出刀,解除出刀,完成,击杀,代打,撤回出刀,挂树,查树,强行下树
            if message.asDisplay() == "申请出刀":
                if member.name not in Player.player_list and member.name not in Player.player_on_tree_list:
                    # 正常
                    Player.player_list.append(member.name)
                    message_return = "%s开始出刀" % member.name
                elif member.name in Player.player_list:
                    message_return = "您已在出刀序列中"
                elif member.name in Player.player_on_tree_list:
                    message_return = "您已挂树"
            elif message.asDisplay() == "解除出刀":
                if member.name in Player.player_list:
                    Player.player_list.remove(member.name)
                    message_return = "成功解除出刀"
                elif member.name not in Player.player_list:
                    message_return = "您不在出刀序列中"
                elif member.name in Player.player_on_tree_list:
                    message_return = "您已挂树"
            elif message.asDisplay().startswith("完成"):
                hurtNum = Boss.split_message(Boss, message.asDisplay())
                hurtNum = int(hurtNum)
                if member.name in Player.player_list:
                    message_return = Boss.hurtNum(Boss, member.name, hurtNum)
                    Player.player_list.remove(member.name)
                elif member.name not in Player.player_list:
                    message_return = "您还没有出刀"
            elif message.asDisplay().startswith("代打"):
                print(message.__root__[2].target)
                print(type(message.__root__[2].target))
                name = Player.member_list.get(message.__root__[2].target)
                print("name", name)
                hurtNum = int(Boss.split_message(Boss, message.asDisplay()))
                message_return = Boss.hurtNum(Boss, name, hurtNum)
            elif message.asDisplay() == "撤回出刀":
                message_return = Boss.recall_last_hurtNum(Boss, member.name)
            elif message.asDisplay() == "挂树":
                if member.name in Player.player_list:
                    Player.player_list.remove(member.name)
                    Player.player_on_tree_list.append(member.name)
                    message_return = "%s挂树" % (member.name)
                elif member.name not in Player.player_list:
                    message_return = "您还没有出刀"
                elif member.name in Player.player_on_tree_list:
                    message_return = "您已经挂树"
            elif message.asDisplay() == "查树":
                message_return = Player.read_tree(Player)
            elif message.asDisplay().startswith("强行下树"):
                if member.name in Player.player_on_tree_list:
                    hurtNum = Boss.split_message(Boss, message.asDisplay())
                    hurtNum = int(hurtNum)
                    message_return = Boss.hurtNum(Boss, member.name, hurtNum)
                elif member.name in Player.player_list:
                    message_return = "您没有挂树,请正常报刀"
                elif member.name not in Player.player_list and member.name not in Player.player_on_tree_list:
                    message_return = "请申请出刀"

            # boss数据操作
            elif message.asDisplay() == "查看":
                message_return = Boss.get_boss_info(Boss)
            elif message.asDisplay().startswith("修正"):
                round, i, boss_remain = Boss.split_message(
                    Boss, message.asDisplay())
                round = int(round)
                i = int(i)
                boss_remain = int(boss_remain)
                message_return = Boss.set_boss_info(Boss, round, i,
                                                    boss_remain)

            # 会战数据操作
            elif message.asDisplay() == "出刀数据":
                message_return = Player.read(Player, Player.fight_data)
            elif message.asDisplay() == "读取":
                message_return = Player.readf(Player)
            elif message.asDisplay() == "保存":
                message_return = Player.savef(Player)
            else:
                message_return = ""
            await app.sendGroupMessage(
                group, MessageChain.create([Plain(message_return)]))
Example #2
0
    async def handle(self, app: GraiaMiraiApplication, message: MessageChain,
                     group: Group, member: Member):
        if message.asDisplay() == "搜番":
            await update_user_call_count_plus1(group, member,
                                               UserCalledCount.search,
                                               "search")
            if not await get_setting(group.id, Setting.bangumi_search):
                set_result(
                    message,
                    MessageItem(
                        MessageChain.create([Plain(text="搜番功能未开启呐~请联系管理员哦~")]),
                        Normal(GroupStrategy())))
            try:
                await app.sendGroupMessage(
                    group,
                    MessageChain.create(
                        [At(member.id),
                         Plain("请在30秒内发送要搜索的图片呐~")]))
            except AccountMuted:
                logger.error(f"Bot 在群 <{group.name}> 被禁言,无法发送!")
                return None

            image_get = None
            message_received = None

            @Waiter.create_using_function([GroupMessage])
            def waiter(event: GroupMessage, waiter_group: Group,
                       waiter_member: Member, waiter_message: MessageChain):
                nonlocal image_get
                nonlocal message_received
                if time.time() - start_time < 30:
                    if all([
                            waiter_group.id == group.id,
                            waiter_member.id == member.id,
                            len(waiter_message[Image]) == len(
                                waiter_message.__root__) - 1
                    ]):
                        image_get = True
                        message_received = waiter_message
                        return event
                else:
                    logger.warning("等待用户超时!BangumiSearchHandler进程推出!")
                    return event

            bcc = AppCore.get_core_instance().get_bcc()
            inc = InterruptControl(bcc)
            start_time = time.time()
            await inc.wait(waiter)
            if image_get:
                logger.success("收到用户图片,启动搜索进程!")
                try:
                    await app.sendGroupMessage(
                        group,
                        await self.search_bangumi(message_received[Image][0]),
                        quote=message_received[Source][0])
                    raise AsyncioTasksGetResult
                except AccountMuted:
                    logger.error(f"Bot 在群 <{group.name}> 被禁言,无法发送!")
                    pass
            return None
        else:
            return None
Example #3
0
async def pixiv_Group_listener(message: MessageChain,
                               app: GraiaMiraiApplication, group: Group,
                               member: Member):
    pinyinStr = ""
    for i in range(len(lazy_pinyin(message.asDisplay()))):
        pinyinStr += lazy_pinyin(message.asDisplay())[i]
    if not pinyinStr.startswith("/"):
        if pinyinStr.find("setu") >= 0:
            if member.id in BlackId:
                await app.sendGroupMessage(
                    group,
                    MessageChain.create(
                        [At(member.id), Plain("哼(╯▔皿▔)╯,不理你了!")]))
            else:
                if SearchSetting(group.id)["function"]["setu"]:
                    try:
                        url = "https://api.lolicon.app/setu/?apikey=" + LoliconKey[
                            0]  # 1号api
                        data = json.loads(await aioRequest(url))
                        if data['code'] == 0:
                            messageId = await app.sendGroupMessage(
                                group,
                                MessageChain.create([
                                    At(member.id),
                                    Image.fromNetworkAddress(
                                        data['data'][0]['url'])
                                ]))
                            await asyncio.sleep(60)
                            await app.revokeMessage(messageId)
                        elif data['code'] == 429:
                            url = "https://api.lolicon.app/setu/?apikey=" + LoliconKey[
                                1]  # 2号api
                            data = json.loads(await aioRequest(url))
                            if data['code'] == 0:
                                messageId = await app.sendGroupMessage(
                                    group,
                                    MessageChain.create([
                                        At(member.id),
                                        Image.fromNetworkAddress(
                                            data['data'][0]['url'])
                                    ]))
                                await asyncio.sleep(60)
                                await app.revokeMessage(messageId)
                            else:
                                await app.sendGroupMessage(
                                    group,
                                    MessageChain.create([
                                        At(member.id),
                                        Plain("今天发的已经够多了,明天再来吧~")
                                    ]))
                        else:
                            await app.sendGroupMessage(
                                group,
                                MessageChain.create(
                                    [At(member.id),
                                     Plain("今天发的已经够多了,明天再来吧~")]))
                    except:
                        await app.sendGroupMessage(
                            group,
                            MessageChain.create([
                                At(member.id),
                                Plain("诶呀,发生一个未知的错误(ˉ▽ˉ;)...")
                            ]))
                else:
                    await app.sendGroupMessage(
                        group,
                        MessageChain.create(
                            [At(member.id),
                             Plain("本群因管理要求已禁止使用色图功能╮(╯▽╰)╭")]))
Example #4
0
async def friend_message_listener(app: GraiaMiraiApplication, friend: Friend,
                                  message: MessageChain):
    await app.sendFriendMessage(
        friend,
        MessageChain.create([Plain(reply(message[Plain][0].text) + ' ')]))
Example #5
0
async def search_image(group_id: int, sender: int, img: Image) -> list:
    """
    Return search result

    Args:
        group_id: Group id
        sender: Sender
        img: Image to search

    Examples:
        message = await search_image(group_id, sender, image)

    Return:
        [
            str: Auxiliary treatment to be done(Such as add statement),
            MessageChain: Message to be send(MessageChain)
        ]
    """
    await set_get_img_ready(group_id, sender, False, "searchReady")

    print(await get_image_ready(group_id, sender, "searchReady"))

    search_total_count = await get_total_calls("search") + 1
    await update_total_calls(search_total_count, "search")
    path = "%s%s.png" % (await get_config("searchPath"), search_total_count)
    async with aiohttp.ClientSession() as session:
        async with session.get(url=img.url) as resp:
            img_content = await resp.read()
    image = IMG.open(BytesIO(img_content))
    image.save(path)

    # url for headers
    url = "https://saucenao.com/search.php"

    # picture url
    pic_url = img.url

    # json requesting url
    url2 = f"https://saucenao.com/search.php?db=999&output_type=2&testmode=1&numres=1&url={pic_url}"

    # data for posting.
    payload = {
        "url": pic_url,
        "numres": 1,
        "testmode": 1,
        "db": 999,
        "output_type": 2,
    }

    # header to fool the website.
    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "none",
        "Sec-Fetch-User": "******",
        "Referer": url,
        "Origin": "https://saucenao.com",
        "Host": "saucenao.com",
        "cookie": await get_config("saucenaoCookie")
    }

    # async with aiohttp.ClientSession() as session:
    #     async with session.post(url=url, headers=headers, data=payload) as resp:
    #         json_data = await resp.json()

    # print thumbnail URL.
    # print(json_data)
    # print(json_data["results"][0]["header"]["thumbnail"])

    path = "M:\\pixiv\\Thumbnail\\%s.png" % search_total_count
    async with aiohttp.ClientSession() as session:
        async with session.post(url=url, headers=headers,
                                data=payload) as resp:
            json_data = await resp.json()

    print(json_data)

    async with aiohttp.ClientSession() as session:
        async with session.get(
                url=json_data["results"][0]["header"]["thumbnail"]) as resp:
            img_content = await resp.read()

    image = IMG.open(BytesIO(img_content))
    image.save(path)
    similarity = json_data["results"][0]["header"]["similarity"]
    try:
        pic_url = "\n" + "\n".join(json_data["results"][0]["data"]["ext_urls"])
    except KeyError:
        pic_url = "None"
    if "pixiv_id" not in json_data["results"][0]["data"]:
        if "source" not in json_data["results"][0]["data"]:
            return [
                "quoteSource",
                MessageChain.create([Plain(text="8好意思~没有找到相似的图诶~")])
            ]
        else:
            try:
                creator = json_data["results"][0]["data"]["creator"][0]
            except Exception:
                creator = "Unknown!"
            return [
                "quoteSource",
                MessageChain.create([
                    Image.fromLocalFile(path),
                    Plain(text="\n相似度:%s%%\n" % similarity),
                    Plain(text="原图地址:%s\n" % pic_url),
                    Plain(text="作者:%s\n" % creator),
                    Plain(text="如果不是你想找的图的话可能因为这张图是最近才画出来的哦,网站还未收录呢~过段日子再来吧~")
                ])
            ]
    else:
        pixiv_id = json_data["results"][0]["data"]["pixiv_id"]
        user_name = json_data["results"][0]["data"]["member_name"]
        user_id = json_data["results"][0]["data"]["member_id"]
        # record("search",dist,sender,groupId,True,"img")
        return [
            "quoteSource",
            MessageChain.create([
                Image.fromLocalFile(path),
                Plain(text="\n相似度:%s%%\n" % similarity),
                Plain(text="原图地址:%s\n" % pic_url),
                Plain(text="作品id:%s\n" % pixiv_id),
                Plain(text="作者名字:%s\n" % user_name),
                Plain(text="作者id:%s\n" % user_id)
            ])
        ]
Example #6
0
async def group_recall_event(event: GroupRecallEvent):
    rmsg = str(event.authorId)
    rmsg += ' 撤回消息啦!\n'
    rmsg += group_msg_database[str(event.group.id) + str(event.authorId)]
    await app.sendGroupMessage(event.group,
                               MessageChain(__root__=[Plain(rmsg)]))
Example #7
0
async def search_bangumi(group_id: int, sender: int, img_url: str) -> list:

    await set_get_img_ready(group_id, sender, False, "searchBangumiReady")

    async with aiohttp.ClientSession() as session:
        async with session.get(url=img_url) as resp:
            img_content = await resp.read()

    url = "https://trace.moe/search"
    headers = {
        "X-Requested-With": "XMLHttpRequest",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    }

    image_b64 = base64.b64encode(img_content)

    params = f"data={quote(f'data:image/jpeg;base64,{image_b64.decode()}')}&filter={''}&trial={'0'}"

    async with aiohttp.ClientSession() as session:
        async with session.post(url=url, headers=headers, data=params) as resp:
            result = await resp.json()

    docs = result["docs"]
    if docs:
        try:
            print(docs[0])
            title_chinese = docs[0]["title_chinese"]
            title_origin = docs[0]["title_chinese"]
            file_name = docs[0]["file"]
            anilist_id = docs[0]["anilist_id"]
            time_from = docs[0]["from"]
            time_to = docs[0]["to"]

            t = docs[0]["t"]
            tokenthumb = docs[0]["tokenthumb"]
            thumbnail_url = f"https://trace.moe/thumbnail.php?anilist_id={anilist_id}&file={quote(file_name)}&t={t}&token={tokenthumb}"
            print(thumbnail_url)
            # 下载缩略图
            path = "./statics/temp/tempSearchBangumi.jpg"
            async with aiohttp.ClientSession() as session:
                async with session.get(url=thumbnail_url) as resp:
                    thumbnail_content = await resp.read()
            image = IMG.open(BytesIO(thumbnail_content))
            image.save(path)

            url = f"https://trace.moe/info?anilist_id={anilist_id}"
            async with aiohttp.ClientSession() as session:
                async with session.get(url=url) as resp:
                    result = await resp.json()
            result = result[0]
            start_date = f"{result['startDate']['year']}-{result['startDate']['month']}-{result['startDate']['day']}"
            end_date = f"{result['endDate']['year']}-{result['endDate']['month']}-{result['endDate']['day']}"
            score = result["averageScore"]
            message = MessageChain.create([
                Plain(text="搜索到结果:\n"),
                Image.fromLocalFile(path),
                Plain(text=f"name: {title_origin}\n"),
                Plain(text=f"Chinese name: {title_chinese}\n"),
                Plain(text=f"file name: {file_name}\n"),
                Plain(
                    text=
                    f"time: {await sec_to_str(time_from)} ~ {await sec_to_str(time_to)}\n"
                ),
                Plain(text=f"score: {score}\n"),
                Plain(text=f"Broadcast date: {start_date} ~ {end_date}\n")
            ])
            return [
                "quoteSource", await messagechain_to_img(message=message,
                                                         max_width=1080,
                                                         img_fixed=True)
            ]
        except Exception as e:
            return [
                "quoteSource",
                MessageChain.create(
                    [Plain(text="出错了呢~\n"),
                     Plain(text=str(e))])
            ]
    else:
        return ["quoteSource", MessageChain.create([Plain(text="没有搜索到结果呐~")])]
Example #8
0
async def group_message_process(message: MessageChain,
                                message_info: GroupMessage,
                                app: GraiaMiraiApplication) -> list:
    """
    Process the received message and return the corresponding message

    Args:
        message: Received message(MessageChain)
        message_info: Received message(GroupMessage)
        app: APP

    Examples:
        message_list = await message_process(message, message_info)

    Return:
        [
            str: Auxiliary treatment to be done(Such as add statement),
            MessageChain: Message to be send(MessageChain)
        ]
    """
    message_text = message.asDisplay()
    message_serialization = message.asSerializationString()
    sender = message_info.sender.id
    group_id = message_info.sender.group.id

    # 黑名单检测
    if sender in await get_blacklist():
        print("Blacklist!No reply!")
        return ["None"]

    # print("message_serialization:", message_serialization)

    if message.has(At) and message.get(At)[0].target == await get_config(
            "BotQQ"):
        await update_user_called_data(group_id, sender, "at", 1)

    if message.has(At) and message.get(At)[0].target == await get_config(
            "BotQQ") and re.search("@.* setting.*", message_text):
        try:
            _, config, new_value = message_text.split(".")
            return await setting_process(group_id, sender, config, new_value)
        except ValueError:
            return [
                "None",
                MessageChain.create([Plain(text="Command Error!")])
            ]
    """
    图片功能:
        setu
        real
        bizhi
        time
        search
        yellow predict
        lsp rank
    """
    if message_text in response_set["setu"]:
        if await get_setting(group_id, "setu"):
            if sender == 80000000:
                return [
                    "None",
                    MessageChain.create([Plain(text="要涩图就光明正大!匿名算什么好汉!")])
                ]
            await update_dragon_data(group_id, sender, "normal")
            await update_user_called_data(group_id, sender, "setu", 1)
            if await get_setting(group_id, "r18"):
                return await get_pic("setu18", group_id, sender)
            else:
                return await get_pic("setu", group_id, sender)
        else:
            return [
                "None",
                MessageChain.create([Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")])
            ]

    elif re.search("来点.*[色涩]图", message_text):
        if await get_setting(group_id, "setu"):
            if sender == 80000000:
                return [
                    "None",
                    MessageChain.create([Plain(text="要涩图就光明正大!匿名算什么好汉!")])
                ]
            keyword = re.findall("来点(.*?)[涩色]图", message_text, re.S)[0]
            print(keyword)
            if keyword in ["r18", "R18", "r-18", "R-18"]:
                return [
                    "quoteSource",
                    MessageChain.create(
                        [Plain(text="此功能暂时还不支持搜索R18涩图呐~忍忍吧LSP!")])
                ]
            # await app.sendGroupMessage(

            await update_dragon_data(group_id, sender, "normal")
            await update_user_called_data(group_id, sender, "setu", 1)
            return await get_setu_keyword(keyword=keyword)
        else:
            return [
                "None",
                MessageChain.create([Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")])
            ]

    elif message_text in response_set["real"]:
        if await get_setting(group_id, "real"):
            if sender == 80000000:
                return [
                    "None",
                    MessageChain.create([Plain(text="要涩图就光明正大!匿名算什么好汉!")])
                ]
            await update_dragon_data(group_id, sender, "normal")
            await update_user_called_data(group_id, sender, "real", 1)
            return await get_pic("real", group_id, sender)
        else:
            return [
                "None",
                MessageChain.create([Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")])
            ]

    elif message_text in response_set["realHighq"]:
        if await get_setting(group_id, "real"):
            if sender == 80000000:
                return [
                    "None",
                    MessageChain.create([Plain(text="要涩图就光明正大!匿名算什么好汉!")])
                ]
            await update_dragon_data(group_id, sender, "normal")
            await update_user_called_data(group_id, sender, "real", 1)
            return await get_pic("realHighq", group_id, sender)
        else:
            return [
                "None",
                MessageChain.create([Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")])
            ]

    elif message_text in response_set["bizhi"]:
        if await get_setting(group_id, "bizhi"):
            if sender == 80000000:
                return [
                    "None",
                    MessageChain.create([Plain(text="要涩图就光明正大!匿名算什么好汉!")])
                ]
            await update_user_called_data(group_id, sender, "bizhi", 1)
            return await get_pic("bizhi", group_id, sender)
        else:
            return [
                "None",
                MessageChain.create([Plain(text="壁纸功能关闭了呐~想要打开的话就联系管理员吧~")])
            ]

    elif message_text.startswith("setu*") or message_text.startswith(
            "real*") or message_text.startswith("bizhi*"):
        if message_text.startswith("bizhi*"):
            command = "bizhi"
            num = message_text[6:]
        else:
            command = message_text[:4]
            num = message_text[5:]
        if num.isdigit():
            num = int(num)
            if sender not in await get_admin(group_id):
                if 0 <= num <= 5:
                    return [
                        "None",
                        MessageChain.create([
                            Plain(text="只有主人和管理员可以使用%s*num命令哦~你没有权限的呐~" %
                                  command)
                        ])
                    ]
                elif num < 0:
                    return [
                        "None",
                        MessageChain.create(
                            [Plain(text="%d?你有问题?不如给爷吐出%d张来" % (num, -num))])
                    ]
                else:
                    return [
                        "None",
                        MessageChain.create(
                            [Plain(text="不是管理员你要你🐎呢?老色批!还要那么多?给你🐎一拳,给爷爬!")])
                    ]
            if num < 0:
                return [
                    "None",
                    MessageChain.create(
                        [Plain(text="%d?你有问题?不如给爷吐出%d张来" % (num, -num))])
                ]
            elif num > 5:
                if sender == await get_config("HostQQ"):
                    return ["%s*" % command, num]
                else:
                    return [
                        "None",
                        MessageChain.create(
                            [Plain(text="管理最多也只能要5张呐~我可不会被轻易玩儿坏呢!!!!")])
                    ]
            else:
                if sender != await get_config("HostQQ"):
                    await update_user_called_data(group_id, sender, command,
                                                  num)
                return ["%s*" % command, int(num)]
        else:
            return ["None", MessageChain.create([Plain(text="必须为数字!")])]

    elif message_text == "几点了":
        return await get_wallpaper_time(group_id, sender)

    elif message_text.startswith("选择表盘"):
        if message_text == "选择表盘":
            return await show_clock_wallpaper(sender)

    elif message_text == "搜图":
        if await get_setting(group_id, "search"):
            await set_get_img_ready(group_id, sender, True, "searchReady")
            return [
                "None",
                MessageChain.create(
                    [At(sender),
                     Plain(text="请发送要搜索的图片呐~(仅支持pixiv图片搜索呐!)")])
            ]
        else:
            return [
                "None",
                MessageChain.create(
                    [At(sender),
                     Plain(text="搜图功能关闭了呐~想要打开就联系管理员吧~")])
            ]
    elif message.has(Image) and await get_setting(
            group_id, "search") and await get_image_ready(
                group_id, sender, "searchReady"):
        # print("status:", await get_image_ready(group_id, sender, "searchReady"))
        image = message.get(Image)[0]
        await update_user_called_data(group_id, sender, "search", 1)
        return await search_image(group_id, sender, image)

    elif message_text == "这张图涩吗":
        if await get_setting(group_id, "yellowPredict"):
            await set_get_img_ready(group_id, sender, True,
                                    "yellowPredictReady")
            return [
                "None",
                MessageChain.create(
                    [At(target=sender),
                     Plain(text="请发送要预测的图片呐~")])
            ]
        else:
            return [
                "None",
                MessageChain.create([
                    At(target=sender),
                    Plain(text="图片涩度评价功能关闭了呐~想要打开就联系机器人管理员吧~")
                ])
            ]
    elif message.has(Image) and await get_setting(
            group_id, "yellowPredict") and await get_image_ready(
                group_id, sender, "yellowPredictReady"):
        image = message.get(Image)[0]
        await update_user_called_data(group_id, sender, "yellowPredict", 1)
        return await image_yellow_judge(group_id, sender, image,
                                        "yellowPredict")

    elif message_text == "搜番":
        if await get_setting(group_id, "searchBangumi"):
            await set_get_img_ready(group_id, sender, True,
                                    "searchBangumiReady")
            return [
                "None",
                MessageChain.create(
                    [At(sender),
                     Plain(text="请发送要搜索的图片呐~(仅支持番剧图片搜索呐!)")])
            ]
        else:
            return [
                "None",
                MessageChain.create(
                    [At(sender),
                     Plain(text="搜番功能关闭了呐~想要打开就联系管理员吧~")])
            ]
    elif message.has(Image) and await get_setting(
            group_id, "searchBangumi") and await get_image_ready(
                group_id, sender, "searchBangumiReady"):
        # print("status:", await get_image_ready(group_id, sender, "searchReady"))
        image = message.get(Image)[0]
        await update_user_called_data(group_id, sender, "search", 1)
        return await search_bangumi(group_id, sender, image.url)

    elif message_text == "rank":
        return await get_rank(group_id, app)

    # 爬虫相关功能
    """
    SAGIRI API相关功能:
        历史上的今天
    """
    if message_text == "历史上的今天":
        return await get_history_today()
    """
    微博相关功能:
        微博热搜
    """
    if message_text == "weibo" or message_text == "微博":
        # return [
        #     "None",
        #     MessageChain.create([
        #         Plain(text="本功能已停用,短时间内不再开放!请勿多次申请")
        #     ])
        # ]
        return await get_weibo_hot(group_id)
    """
    B站相关功能:
        B站新番时间表
        B站直播间查询
    """
    if message_text[-4:] == "日内新番":
        num = message_text[:-4]
        if not num.isdigit() or int(num) <= 0 or int(num) > 7:
            return [At(target=sender), Plain(text="参数错误!必须为数字1-7!")]
        else:
            return await formatted_output_bangumi(int(num), group_id)
    """
    力扣相关功能:
        用户信息查询
        每日一题查询
        具体题目查询
    """
    if message_text.startswith("leetcode "):
        return await get_leetcode_statics(message_text.replace(
            "leetcode ", ""))
    """
    steam相关功能:
        steam游戏查询
    """
    if message_text.startswith("steam "):
        return await get_steam_game_search(message_text.replace("steam ", ""))
    """
    bangumi相关功能:
        番剧查询
    """
    if message_text.startswith("番剧 "):
        keyword = message_text[3:]
        return await get_bangumi_info(sender, keyword)
    """
    其他功能:
        文本翻译
        点歌
        机器人帮助
        自动回复
        笑话
        群语录
        平安经(群人数过多时慎用)
        pornhub风格图片生成
        缩写
        获取磁力链
        摸~
    """
    if message.has(At) and message.get(At)[0].target == await get_config(
            "BotQQ") and re.search(".*用.*怎么说", message_text):
        return await get_translate(message_text, sender)

    elif message_text.startswith("点歌 ") and len(message_text) >= 4:
        print("search song:", message_text[3:])
        return await get_song_ordered(message_text[3:])

    if message_text == "help" or message_text == "!help" or message_text == "/help" or message_text == "!help":
        return [
            "None",
            MessageChain.create([
                Plain(
                    text=
                    "点击链接查看帮助:http://doc.sagiri-web.com/web/#/p/c79d523043f6ec05c1ac1416885477c7\n"
                ),
                Plain(text="文档尚未完善,功能说明还在陆续增加中!")
            ])
        ]

    if message_text == "教务通知":
        return await get_jlu_csw_notice(group_id)

    if re.search("来点.*笑话", message_text):
        joke_dict = {
            "苏联": "soviet",
            "法国": "french",
            "法兰西": "french",
            "美国": "america",
            "美利坚": "america"
        }
        name = re.findall(r'来点(.*?)笑话', message_text, re.S)
        if name == ['']:
            return [
                "None",
                MessageChain.create(
                    [At(target=sender),
                     Plain(text="来点儿啥笑话啊,你又不告诉人家!哼!")])
            ]
        elif name[0] in joke_dict.keys():
            msg = await get_key_joke(joke_dict[name[0]])
            await write_log("joke", "none", sender, group_id, True, "function")
            return msg
        else:
            msg = await get_joke(name[0])
            await write_log("joke", "none", sender, group_id, True, "function")
            return msg

    if message_text == "群语录":
        return await get_group_quotes(group_id, app, "None", "random", "None")
    elif re.search("来点.*语录", message_text):
        name = re.findall(r'来点(.*?)语录', message_text, re.S)[0]
        at_obj = message.get(At)
        if name == [] and at_obj == []:
            return ["None"]
        elif at_obj:
            at_str = at_obj[0].asSerializationString()
            member_id = re.findall(r'\[mirai:at:(.*?),@.*?\]', at_str, re.S)[0]
            await write_log("quotes", "None", sender, group_id, True,
                            "function")
            if message_text[-4:] == ".all":
                return await get_group_quotes(group_id, app, member_id, "all",
                                              "memberId")
            else:
                return await get_group_quotes(group_id, app, member_id,
                                              "select", "memberId")
        elif name:
            await write_log("quotes", "None", sender, group_id, True,
                            "function")
            if message_text[-4:] == ".all":
                return await get_group_quotes(group_id, app, name, "all",
                                              "nickname")
            else:
                return await get_group_quotes(group_id, app, name, "select",
                                              "nickname")

    if message_text == "平安":
        member_list = await app.memberList(group_id)
        msg = list()
        msg.append(Plain(text=f"群{message_info.sender.group.name}平安经\n"))
        for i in member_list:
            msg.append(Plain(text=f"{i.name}平安\n"))
        return ["None", MessageChain.create(msg)]

    if message_text.startswith("ph ") and len(message_text.split(" ")) == 3:
        if "\\" in message_text or "/" in message_text:
            return [
                "None",
                MessageChain.create([Plain(text="不支持 '/' 与 '\\' !")])
            ]
        args = message_text.split(" ")
        left_text = args[1]
        right_text = args[2]
        path = f'./statics/temp/ph_{left_text}_{right_text}.png'
        if not os.path.exists(path):
            try:
                await make_ph_style_logo(left_text, right_text)
            except OSError as e:
                if "[Errno 22] Invalid argument:" in str(e):
                    return [
                        "quoteSource",
                        MessageChain.create([Plain(text="非法字符!")])
                    ]
        return ["None", MessageChain.create([Image.fromLocalFile(path)])]

    # if message_text.startswith("缩 "):
    #     abbreviation = message_text[2:]
    #     print(abbreviation)
    #     if abbreviation.isalnum():
    #         return await get_abbreviation_explain(abbreviation, group_id)
    #     else:
    #         return [
    #             "quoteSource",
    #             MessageChain.create([
    #                 Plain(text="只能包含数字及字母!")
    #             ])
    #         ]

    if message_text.startswith("magnet "):
        target = message_text[7:]
        return await search_magnet(target, group_id)

    if message.has(At) and message_text.startswith(
            "摸") or message_text.startswith("摸 "):
        target_id = message.get(At)[0].target
        await petpet(target_id)
        return [
            "None",
            MessageChain.create([
                Image.fromLocalFile(
                    f'./statics/temp/tempPetPet-{target_id}.gif')
            ])
        ]

    if message.has(At) and message.get(At)[0].target == await get_config(
            "BotQQ"):
        return await reply_process(group_id, sender, message_text)
    return ["None"]
async def search_image(img: Image) -> MessageChain:
    path = "./modules/PixivImageSearcher/tempSavedImage.png"
    thumbnail_path = "./modules/PixivImageSearcher/tempThumbnail.png"
    async with aiohttp.ClientSession() as session:
        async with session.get(url=img.url) as resp:
            img_content = await resp.read()
    image = IMG.open(BytesIO(img_content))
    image.save(path)

    # url for headers
    url = "https://saucenao.com/search.php"

    # picture url
    pic_url = img.url

    # json requesting url
    url2 = f"https://saucenao.com/search.php?db=999&output_type=2&testmode=1&numres=1&url={pic_url}"

    # data for posting.
    payload = {
        "url": pic_url,
        "numres": 1,
        "testmode": 1,
        "db": 999,
        "output_type": 2,
    }

    # header to fool the website.
    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "none",
        "Sec-Fetch-User": "******",
        "Referer": url,
        "Origin": "https://saucenao.com",
        "Host": "saucenao.com",
        "cookie": saucenao_cookie
    }

    async with aiohttp.ClientSession() as session:
        async with session.post(url=url, headers=headers,
                                data=payload) as resp:
            json_data = await resp.json()

    if json_data["header"]["status"] == -1:
        return MessageChain.create(
            [Plain(text=f"错误:{json_data['header']['message']}")])
    print(json_data)

    if not json_data["results"]:
        return MessageChain.create([Plain(text="没有搜索到结果呐~")])

    result = json_data["results"][0]
    header = result["header"]
    data = result["data"]

    async with aiohttp.ClientSession() as session:
        async with session.get(url=header["thumbnail"]) as resp:
            img_content = await resp.read()

    image = IMG.open(BytesIO(img_content))
    image.save(thumbnail_path)
    similarity = header["similarity"]
    data_str = f"搜索到如下结果:\n\n相似度:{similarity}%\n"
    for key in data.keys():
        if isinstance(data[key], list):
            data_str += (f"\n{key}:\n    " + "\n".join(data[key]) + "\n")
        else:
            data_str += f"\n{key}:\n    {data[key]}\n"
    return MessageChain.create(
        [Image.fromLocalFile(thumbnail_path),
         Plain(text=f"\n{data_str}")])
Example #10
0
async def printDM(app, data, room_id):
    '''解析并输出数据包的数据'''
    # 获取数据包的长度,版本和操作类型
    packetLen = int(data[:4].hex(), 16)
    ver = int(data[6:8].hex(), 16)
    op = int(data[8:12].hex(), 16)

    # 有的时候可能会两个数据包连在一起发过来,所以利用前面的数据包长度判断,

    if(len(data) > packetLen):
        await printDM(app, data[packetLen:], room_id)
        data = data[:packetLen]

    # 有时会发送过来 zlib 压缩的数据包,这个时候要去解压。
    if(ver == 2):
        data = zlib.decompress(data[16:])
        await printDM(app, data, room_id)
        return

    # ver 为1的时候为进入房间后或心跳包服务器的回应。op 为3的时候为房间的人气值。
    if(ver == 1):
        if(op == 3):
            t = datetime.datetime.now().strftime("[%Y-%m-%d %H:%M:%S,%f")
            t = t[:len(t) - 3] + ']'
            print('%s[POPULARITY]: %s: %d' %
                  (t, room_id, int(data[16:].hex(), 16)))
        return

    # ver 不为2也不为1目前就只能是0了,也就是普通的 json 数据。
    # op 为5意味着这是通知消息,cmd 基本就那几个了。
    if(op == 5):
        try:
            jd = json.loads(data[16:].decode('utf-8', errors='ignore'))
            sstr = ''
            '''
            if(jd['cmd'] == 'DANMU_MSG'):
                sstr = '[DANMU] ' + jd['info'][2][1] + ': ' + jd['info'][1]
            elif(jd['cmd'] == 'LIVE'):
                sstr = '[Notice] LIVE Start!'
            elif(jd['cmd'] == 'PREPARING'):
                sstr = '[Notice] LIVE Ended!'
            elif(jd['cmd'] == 'SEND_GIFT'):
                sstr = '[GIFT]' + jd['data']['uname'] + ' ' + jd['data']['action'] + 
                    ' ' + str(jd['data']['num']) + 'x' + jd['data']['giftName']
            elif(jd['cmd'] == "INTERACT_WORD"):
                if jd['data']['msg_type'] == 1:
                    sstr = '[ENTRY] ' + jd['data']['uname'] + ' 进入直播间'
                elif jd['data']['msg_type'] == 2:
                    sstr = '[FOLLOW] ' + jd['data']['uname'] + ' 关注了直播间'
            elif(jd['cmd'] == "未知"):
                print(jd)
                sstr = '[SHARE] ' + jd['data']['uname'] + ' 分享了直播间'
            else:
                sstr = '[OTHER] ' + jd['cmd']
            if sstr != '':
                await app.sendGroupMessage(group, MessageChain.create([Plain(sstr)]))
            '''

            if(jd['cmd'] == 'LIVE'):
                Localpath = './data/live.json'
                data = {}
                fr = open(Localpath, encoding='utf-8')
                data = json.load(fr)
                fr.close()
                info = get_info(room_id)
                for i in data["data"]:
                    if (room_id != str(i['room_id'])):
                        continue
                    for j in i['group']:
                        sstr = '%s的直播开始啦!\n直播关键帧:' % info['user']
                        await app.sendGroupMessage(j, MessageChain.create([
                            Plain(sstr),
                            Image.fromNetworkAddress(info['keyframe']),
                            Plain('\n直播间地址:https://live.bilibili.com/%d' %
                                  info['room_id'])
                        ]))
                    break
        except Exception as e:
            pass
Example #11
0
    async def process(messagePlain: str, group, member):
        """
        处理游戏进度
        :param messagePlain
        :param group
        :param member
        """
        global a, q
        if messagePlain == "exit":
            akinatorGame.hold = False
            akinatorGame.end = False

        if akinatorGame.end:  # 评价结果
            if messagePlain.lower() == "yes" or messagePlain.lower() == "y":
                await atri.app.sendGroupMessage(group, MessageChain.create(
                    [
                        Plain("Yay")
                    ]
                ))
            else:
                await atri.app.sendGroupMessage(group, MessageChain.create(
                    [
                        Plain("Oof")
                    ]
                ))
            akinatorGame.end = False
        if akinatorGame.hold and messagePlain in [
            'yes', 'y', '0',
            'no', 'n', '1',
            'i', 'idk', 'i dont know', "i don't know", '2',
            'probably', 'p', '3',
            'probably not', 'pn', '4'
        ]:  # 分支过程中
            a = messagePlain
            if a == "b":
                try:
                    q = akinatorGame.aki.back()
                    await atri.app.sendGroupMessage(group, MessageChain.create(
                        [
                            Plain(q)
                        ]
                    ))
                except akinator.CantGoBackAnyFurther:
                    pass
            else:
                q = akinatorGame.aki.answer(a)
                await atri.app.sendGroupMessage(group, MessageChain.create(
                    [
                        Plain(q + "\n\t"),
                        Plain(f"{akinatorGame.aki.progression}%")
                    ]
                ))

            if akinatorGame.aki.progression > 99:  # 给出结果
                akinatorGame.hold = False
                akinatorGame.aki.win()
                await atri.app.sendGroupMessage(group, MessageChain.create(
                    [
                        Plain(
                            f"It's {akinatorGame.aki.first_guess['name']} ({akinatorGame.aki.first_guess['description']})! Was I correct?\n"),
                        Image.fromNetworkAddress(akinatorGame.aki.first_guess['absolute_picture_path'])
                    ]
                ))
                akinatorGame.end = True

        if messagePlain in akinatorGame.AkinatorCmd and not akinatorGame.hold:  # start
            akinatorGame.end = False
            akinatorGame.hold = True
            await atri.app.sendGroupMessage(group, MessageChain.create(
                [
                    Plain("Please wait...\n"
                          '''yes or y or 0 for YES
no or n or 1 for NO
i or idk or i dont know or i don't know or 2 for I DON’T KNOW
probably or p or 3 for PROBABLY
probably not or pn or 4 for PROBABLY NOT'''
                          ),
                ]
            ))
            q = akinatorGame.aki.start_game("cn")
            await atri.app.sendGroupMessage(group, MessageChain.create(
                [
                    Plain(q + "\n\t"),
                    Plain(f"{akinatorGame.aki.progression}%")
                ]
            ))
Example #12
0
async def GoodNight(app: GraiaMiraiApplication, group: Group, mesg: MessageChain):
    msg = getAt(mesg)[1]
    if msg == '晚安':
        await app.sendGroupMessage(group, MessageChain.create([
            Plain(text='晚安')]))
        pass
Example #13
0
async def IndeedNext(app: GraiaMiraiApplication, group: Group, mesg: MessageChain):
    msg = getAt(mesg)[1]
    if '下次一定' in msg:
        await app.sendGroupMessage(group, MessageChain.create([
            Plain(text='下次一定')]))
        pass
Example #14
0
async def GetHelp(app: GraiaMiraiApplication, group: Group, mesg: MessageChain):
    msg = getAt(mesg)[1]
    if msg == '帮助':
        await app.sendGroupMessage(group, MessageChain.create([
            Plain(text='帮助参见:https://github.com/CoTecho/Cobot/blob/master/README.md')]))
        pass
Example #15
0
async def get_abbreviation_explain(abbreviation: str, group_id: int) -> list:
    url = "https://lab.magiconch.com/api/nbnhhsh/guess"
    headers = {
        "referer": "https://lab.magiconch.com/nbnhhsh/"
    }
    data = {
        "text": abbreviation
    }

    async with aiohttp.ClientSession() as session:
        async with session.post(url=url, headers=headers, data=data) as resp:
            res = await resp.json()
    # print(res)
    result = "可能的结果:\n\n"
    has_result = False
    for i in res:
        if "trans" in i:
            if i["trans"]:
                has_result = True
                result += f"{i['name']} => {','.join(i['trans'])}\n\n"
            else:
                result += f"{i['name']} => 没找到结果!\n\n"
        else:
            if i["inputting"]:
                has_result = True
                result += f"{i['name']} => {','.join(i['inputting'])}\n\n"
            else:
                result += f"{i['name']} => 没找到结果!\n\n"

    long_text_setting = await get_setting(group_id, "longTextType")
    if has_result:
        if long_text_setting == "img":
            img = text2piiic(string=result, poster="", length=max(len(x) for x in result.split("\n")))
            img.save("./statics/temp/tempAbbreviation.png")
            return [
                "quoteSource",
                MessageChain.create([
                    Image.fromLocalFile("./statics/temp/tempAbbreviation.png")
                ])
            ]
        elif long_text_setting == "text":
            return [
                "quoteSource",
                MessageChain.create([
                    Plain(text=result)
                ])
            ]
        else:
            return [
                "None",
                MessageChain.create([
                    Plain(text="数据库 longTextType 项出错!请检查!")
                ])
            ]
    else:
        return [
            "quoteSource",
            MessageChain.create([
                Plain(text="没有找到结果哦~")
            ])
        ]
Example #16
0
 async def sync_send_group_message(self, qq, msg):
     message = MessageChain.create([Plain(msg)]).asSendable()
     await self.app.sendGroupMessage(qq, message)
Example #17
0
async def friend_message_listener(message: MessageChain, friend: Friend,
                                  app: GraiaMiraiApplication):
    print(str(friend.id) + " " + friend.nickname + " " + friend.remark)
    msg = message.asDisplay()
    rmsg = r0se_main(msg, friend=friend)
    await app.sendFriendMessage(friend, MessageChain(__root__=[Plain(rmsg)]))
Example #18
0
 async def sync_send_temp_message(self, group, qq, msg):
     message = MessageChain.create([Plain(msg)]).asSendable()
     await self.app.sendTempMessage(group, qq, message)
Example #19
0
async def group_push_msg_scheduler():
    group_list = [
        729054809,  # pwnsky
    ]
    rmsg = ''
    # 每日先知文章群推送
    if (time.localtime().tm_hour == 8 and time.localtime().tm_min == 0):
        for group_n in group_list:
            group = await app.getGroup(group_n)
            rmsg = get_xz_article()
            await app.sendGroupMessage(group,
                                       MessageChain(__root__=[Plain(rmsg)]))

    # 每日看雪文二进制章群推送
    if (time.localtime().tm_hour == 9 and time.localtime().tm_min == 0):
        rmsg = get_kx_binary_article()
        for group_n in group_list:
            group = await app.getGroup(group_n)
            await app.sendGroupMessage(group,
                                       MessageChain(__root__=[Plain(rmsg)]))

    # 每日看雪密码学文章群推送
    if (time.localtime().tm_hour == 12 and time.localtime().tm_min == 0):
        rmsg = get_kx_crypto_article()
        for group_n in group_list:
            group = await app.getGroup(group_n)
            await app.sendGroupMessage(group,
                                       MessageChain(__root__=[Plain(rmsg)]))

    # 每日看雪逆向文章群推送
    if (time.localtime().tm_hour == 22 and time.localtime().tm_min == 0):
        rmsg = get_kx_reverse_article()
        for group_n in group_list:
            group = await app.getGroup(group_n)
            await app.sendGroupMessage(group,
                                       MessageChain(__root__=[Plain(rmsg)]))
    '''
    # 每日看雪区块链文章群推送
    if(time.localtime().tm_hour == 12 and time.localtime().tm_min == 0):
        rmsg = get_kx_blockchain_article()
        for group_n in group_list:
            group = await app.getGroup(group_n)
            await app.sendGroupMessage(group, MessageChain(__root__=[Plain( rmsg )]))
    '''
    # 每日看ctf赛事群推送
    if (time.localtime().tm_hour == 20 and time.localtime().tm_min == 0):
        rmsg = get_ctf_comming_match()
        for group_n in group_list:
            group = await app.getGroup(group_n)
            await app.sendGroupMessage(group,
                                       MessageChain(__root__=[Plain(rmsg)]))

    # 每日好友推送
    if (time.localtime().tm_hour == 7 and time.localtime().tm_min == 0):
        rmsg = '早安! 宝贝 \n'
        rmsg += daily_words[random.randint(0, len(daily_words) - 1)]
        friend_list = await app.friendList()
        for friend in friend_list:

            await app.sendFriendMessage(friend,
                                        MessageChain(__root__=[Plain(rmsg)]))

    # 每日好友推送
    if (time.localtime().tm_hour == 23 and time.localtime().tm_min == 30):
        rmsg = '晚安!宝贝 \n'
        rmsg += daily_words[random.randint(0, len(daily_words) - 1)]
        friend_list = await app.friendList()
        for friend in friend_list:
            await app.sendFriendMessage(friend,
                                        MessageChain(__root__=[Plain(rmsg)]))
Example #20
0
                    msg = [
                        Plain(cmd[pos - 1] if random.
                              randint(0, 1) else f'不{cmd[pos - 1]}')
                    ]
                    await app.sendGroupMessage(message.sender.group,
                                               MeCh.create(msg))
        if cmd == '吃什么':
            rate = random.randint(0, 100)
            if rate < 2:
                eat = '吃屎吧'
            else:
                what_we_eat = ttkConfig.getConfig('setting').get('what_we_eat')
                index = random.randint(0, len(what_we_eat) - 1)
                eat = f'吃{what_we_eat[index]}'
            await app.sendGroupMessage(message.sender.group,
                                       MeCh.create([Plain(eat)]))

    async def atOrQuoteHandler(self, app, message: GroupMessage):
        logger.debug('TalkToMe at handler act')
        cmd: str = message.messageChain.asDisplay().split(' ')[0]
        if cmd == '骂他':
            if self.Economy:
                if not await self.Economy.Economy.pay(
                        message.sender.id, self.Economy.capitalist, 500):
                    info: dict = await self.Economy.Economy.money(
                        message.sender.id)
                    plain: Plain = Plain(
                        f"你的{self.Economy.unit}不足,你还剩{info['balance']}只{self.Economy.unit},单价500只{self.Economy.unit}"
                    )
                    await app.sendGroupMessage(message.sender.group,
                                               MeCh.create([plain]))
Example #21
0
async def addddl(app, s, group, member, msg: str):
    event_title = ''
    event_start = ''
    event_end = ''
    event_local = ''
    _method = 'POST'

    text = msg.split(' ')

    if len(text) == 1:
        await app.sendGroupMessage(group,
                                   MessageChain.create([Plain('请输入标题!')]))
    elif len(text) == 2:
        event_end = event_start = (
            datetime.now() - timedelta(hours=8) +
            timedelta(days=7)).strftime('%Y-%m-%dT%H:%M:%SZ')
    event_title = text[1]
    if event_start == '':
        text[2] = text[2].replace('-', '.')
        y = datetime.now().year
        m = 0
        d = 0
        subtext = text[2].split('.')
        if len(subtext) == 3:
            y = subtext[0]
            m = subtext[1]
            d = subtext[2]
        elif len(subtext) == 2:
            m = subtext[0]
            d = subtext[1]
        else:
            return
        event_end = event_start = (
            datetime(int(y), int(m), int(d)) -
            timedelta(hours=8)).strftime('%Y-%m-%dT%H:%M:%SZ')

    url = 'http://canvas.tongji.edu.cn/api/v1/calendar_events'

    data = {
        'calendar_event[title]':
        event_title,
        'calendar_event[start_at]':
        event_start,
        'calendar_event[end_at]':
        event_end,
        'calendar_event[location_name]':
        event_local,
        'calendar_event[context_code]':
        'user_' + str(get_id(member.id)),
        '_method':
        _method,
        'authenticity_token':
        parse.unquote(
            requests.utils.dict_from_cookiejar(s.cookies)['_csrf_token'])
    }

    r = s.post(url, data=data)

    if not is_json(r.text) or 'errors' in r.json():
        await app.sendGroupMessage(group,
                                   MessageChain.create([Plain('添加失败!')]))
    else:
        await app.sendGroupMessage(group,
                                   MessageChain.create([Plain('添加成功!')]))
Example #22
0
 if args['key'] == 's':
     ripper.search().tags(args['tags'])
 if args['key'] == 'r':
     ripper.random().tags(args['tags'])
 if args['key'] == 'd':
     ripper.detail().specific([args['tags'], self.db])
 if args['key'] == 'j':
     ja: JASearcher = JASearcher()
     ja.useProxy().setID(args['id'])
     result: dict = await ja.get(args['offset'], args['limit'])
     msg = []
     for re in result:
         if 'image' in re.keys():
             msg.append(Image.fromUnsafeBytes(re['image']))
         if 'text' in re.keys():
             msg.append(Plain(re['text']))
     if not msg:
         await app.sendGroupMessage(message.sender.group, MeCh.create([Plain('未搜索到')]))
         return
     await app.sendGroupMessage(message.sender.group, MeCh.create(msg))
     return
 tasks: List[asyncio.Task] = []
 try:
     result = await ripper.offset(args['offset']).count(args['count']).rating(self.ratings[gid]).get()
 except ClientConnectorError:
     msg = [At(message.sender.id), Plain('不给发,爬')]
     await app.sendGroupMessage(message.sender.group, MeCh.create(msg))
     return
 number = len(result)
 if not number:
     msg = [At(message.sender.id), Plain('未搜索到')]
Example #23
0
async def get_song_ordered(keyword: str, app: GraiaMiraiApplication) -> list:
    """
    Search song from CloudMusic

    Args:
        keyword: Keyword to search

    Examples:
        message = await get_song_ordered("lemon")

    Return:
        [
            str: Auxiliary treatment to be done(Such as add statement),
            MessageChain: Message to be send(MessageChain)
        ]
    """
    song_search_url = "http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={" \
                      "%s}&type=1&offset=0&total=true&limit=1" % keyword
    # print(song_search_url)
    async with aiohttp.ClientSession() as session:
        async with session.get(url=song_search_url) as resp:
            data_json = await resp.read()
    data_json = json.loads(data_json)

    if data_json["code"] != 200:
        return [
            "quoteSource",
            MessageChain.create(
                [Plain(text=f"服务器返回错误:{data_json['message']}")])
        ]

    if data_json["result"]["songCount"] == 0:
        return [
            "quoteSource",
            MessageChain.create([Plain(text="没有搜索到呐~换一首歌试试吧!")])
        ]

    song_id = data_json["result"]["songs"][0]["id"]
    detail_url = f"http://musicapi.leanapp.cn/song/detail?ids={song_id}"

    async with aiohttp.ClientSession() as session:
        async with session.get(url=detail_url) as resp:
            data_json = await resp.json()

    song_name = data_json["songs"][0]["name"]
    pic_url = data_json["songs"][0]["al"]["picUrl"]
    desc = data_json["songs"][0]["ar"][0]["name"]
    json_code = {
        "app": "com.tencent.structmsg",
        "desc": "音乐",
        "meta": {
            "music": {
                "action": "",
                "android_pkh_name": "",
                "app_type": 1,
                "appid": 100495085,
                "desc": desc,
                "jumpUrl": f"https://y.music.163.com/m/song/{song_id}",
                "musicUrl":
                f"http://music.163.com/song/media/outer/url?id={song_id}",
                "preview": pic_url,
                "sourceMsgId": 0,
                "source_icon": "",
                "source_url": "",
                "tag": "假装自己是网易云音乐的屑机器人",
                "title": song_name
            }
        },
        "prompt": f"[分享]{song_name}",
        "ver": "0.0.0.1",
        "view": "music"
    }

    music_url = f"http://music.163.com/song/media/outer/url?id={song_id}"

    async with aiohttp.ClientSession() as session:
        async with session.get(url=music_url) as resp:
            music_bytes = await resp.read()

    music_bytes = await silk(music_bytes, 'b', '-ss 0 -t 120')

    upload_resp = await app.uploadVoice(music_bytes)

    return [
        "None",
        MessageChain.create([
            # App(content=json.dumps(json_code))
            upload_resp
        ])
    ]
Example #24
0
def on_info(server: ServerInterface, info: Info, group: Group):
    if info.is_player:
        if info.content.startswith('!!qq'):
            await app.sendGroupMessage(group, MessageChain.create([Plain('[{}]{}'.format(info.player, info.content[5:]))]))
Example #25
0
            print(thumbnail_url)

            async with aiohttp.ClientSession() as session:
                async with session.get(url=thumbnail_url) as resp:
                    thumbnail_content = await resp.read()

            # url = f"https://anilist.co/anime/{anilist_id}"
            # async with aiohttp.ClientSession() as session:
            #     async with session.get(url=url) as resp:
            #         result = await resp.json()
            # result = result[0]
            # start_date = f"{result['startDate']['year']}-{result['startDate']['month']}-{result['startDate']['day']}"
            # end_date = f"{result['endDate']['year']}-{result['endDate']['month']}-{result['endDate']['day']}"
            # score = result["averageScore"]
            message = MessageChain.create([
                Plain(text="搜索到结果:\n"),
                Image.fromUnsafeBytes(thumbnail_content),
                Plain(text=f"name: {title_origin}\n"),
                Plain(text=f"Chinese name: {title_chinese}\n"),
                Plain(text=f"file name: {file_name}\n"),
                Plain(
                    text=
                    f"time: {sec_to_str(time_from)} ~ {sec_to_str(time_to)}\n"
                ),
                # Plain(text=f"score: {score}\n"),
                # Plain(text=f"Broadcast date: {start_date} ~ {end_date}\n")
            ])
            return message
        else:
            return MessageChain.create([Plain(text="没有查到结果呐~")])
Example #26
0
 def __make_msg(self, rank: int, illust: dict) -> MessageChain:
     return Template(self.item_pattern).render(
         rank=Plain(str(rank)),
         title=Plain(illust["title"]),
         id=Plain(str(illust["id"]))
     )
Example #27
0
async def battlefield(message: MessageChain, app: GraiaMiraiApplication,
                      group: Group, member: Member):
    if SearchSetting(group.id)["function"]["battlefield"]:
        MessageStr = message.asDisplay()
        if any([MessageStr.startswith("/最近"), MessageStr.startswith("/战绩"), MessageStr.startswith("/服务器"), MessageStr.startswith("/武器"), MessageStr.startswith("/载具"),
                MessageStr.startswith("/帮助"), MessageStr.startswith("/绑定")]) or \
                any([MessageStr.startswith("/手榴弹"), MessageStr.startswith("/步枪"), MessageStr.startswith("/轻机枪"), MessageStr.startswith("/手枪"),
                     MessageStr.startswith("/半自动"), MessageStr.startswith("/霰弹枪"), MessageStr.startswith("/精英兵"), MessageStr.startswith("/近战"),
                     MessageStr.startswith("/冲锋枪"), MessageStr.startswith("/装备")]):
            if member.id in BlackId:
                await app.sendGroupMessage(group,
                                           MessageChain.create([
                                               At(member.id),
                                               Plain("哼(╯▔皿▔)╯,不理你了!")
                                           ]),
                                           quote=message[Source][0])
            else:
                if MessageStr.startswith("/最近"):
                    await app.sendGroupMessage(
                        group,
                        MessageChain.create([
                            At(member.id),
                            Plain("\n" +
                                  await BFservers(member.id, MessageStr))
                        ]),
                        quote=message[Source][0])
                elif MessageStr.startswith("/战绩"):
                    MessageGet = await BFservers(member.id, MessageStr)
                    if MessageGet.startswith("头像"):
                        avatar = re.findall('头像:(.*)', MessageGet)[0]
                        MessageStr = re.findall('昵称:[\s\S]*', MessageGet)[0]
                        try:
                            await app.sendGroupMessage(
                                group,
                                MessageChain.create([
                                    At(member.id),
                                    Image.fromNetworkAddress(avatar),
                                    Plain("\n" + MessageStr)
                                ]),
                                quote=message[Source][0])
                        except:
                            await app.sendGroupMessage(
                                group,
                                MessageChain.create(
                                    [At(member.id),
                                     Plain("\n" + MessageGet)]),
                                quote=message[Source][0])
                    else:
                        await app.sendGroupMessage(group,
                                                   MessageChain.create([
                                                       At(member.id),
                                                       Plain("\n" + MessageGet)
                                                   ]),
                                                   quote=message[Source][0])
                elif MessageStr.startswith("/服务器") or MessageStr.startswith(
                        "/武器") or MessageStr.startswith("/载具"):
                    if MessageStr == "/服务器":
                        MessageStr += SearchSetting(group.id)["name"]
                    MessageGet = await BFservers(member.id, MessageStr)
                    if MessageGet.startswith("./"):
                        await app.sendGroupMessage(
                            group,
                            MessageChain.create([
                                At(member.id),
                                Image.fromLocalFile(MessageGet)
                            ]),
                            quote=message[Source][0])
                        await asyncio.sleep(30)
                        os.remove(MessageGet)
                    else:
                        await app.sendGroupMessage(group,
                                                   MessageChain.create([
                                                       At(member.id),
                                                       Plain("\n" + MessageGet)
                                                   ]),
                                                   quote=message[Source][0])
                elif MessageStr.startswith("/帮助"):
                    await app.sendGroupMessage(
                        group,
                        MessageChain.create([
                            At(member.id),
                            Plain("\n" +
                                  await BFservers(member.id, MessageStr))
                        ]),
                        quote=message[Source][0])
                elif MessageStr.startswith("/绑定"):
                    await app.sendGroupMessage(
                        group,
                        MessageChain.create([
                            At(member.id),
                            Plain(
                                Binding(
                                    member.id,
                                    MessageStr.replace("/绑定",
                                                       "").replace(" ", "")))
                        ]),
                        quote=message[Source][0])
                elif any([
                        MessageStr.startswith("/手榴弹"),
                        MessageStr.startswith("/步枪"),
                        MessageStr.startswith("/轻机枪"),
                        MessageStr.startswith("/手枪"),
                        MessageStr.startswith("/半自动"),
                        MessageStr.startswith("/霰弹枪"),
                        MessageStr.startswith("/精英兵"),
                        MessageStr.startswith("/近战"),
                        MessageStr.startswith("/冲锋枪"),
                        MessageStr.startswith("/装备")
                ]):
                    MessageGet = await BFservers(member.id, MessageStr)
                    if MessageGet.startswith("./"):
                        await app.sendGroupMessage(
                            group,
                            MessageChain.create([
                                At(member.id),
                                Image.fromLocalFile(MessageGet)
                            ]),
                            quote=message[Source][0])
                        await asyncio.sleep(30)
                        os.remove(MessageGet)
                    else:
                        await app.sendGroupMessage(group,
                                                   MessageChain.create([
                                                       At(member.id),
                                                       Plain("\n" + MessageGet)
                                                   ]),
                                                   quote=message[Source][0])
Example #28
0
                         ImageDownload(imgInfo['img_src'],
                                       BILI_ASSET_PATH))
                     for imgInfo in dynamicInfo[1]
                 ] + [
                     Plain(
                         f'\n原动态链接:https://t.bilibili.com/{dynamicID}?tab=2'
                     )
                 ])))
 elif dynamicInfo := GetDynamicInfo(dynamic,
                                    [['card', 'item', 'content']]):
     if RegExMultiPattern(TEXT_IMAGE_PATTERN, dynamicInfo[0]):
         botBroadcast.postEvent(
             BiliDynamicEvent(
                 MessageChain.create([
                     Plain(
                         f'{dynamicInfo[0]}\n原动态链接:https://t.bilibili.com/{dynamicID}?tab=2'
                     )
                 ])))
 elif dynamicInfo := GetDynamicInfo(
         dynamic,
     [['card', 'image_urls'], ['card', 'title'], ['card', 'id']]):
     botBroadcast.postEvent(
         BiliDynamicEvent([
             MessageChain.create([
                 ImageQQ.fromLocalFile(
                     ImageDownload(imgsrc, BILI_ASSET_PATH))
                 for imgsrc in dynamicInfo[0]
             ] + [
                 Plain(
                     f'来自小加加的专栏:\n{dynamicInfo[1]}\nhttps://www.bilibili.com/read/cv{dynamicInfo[2]}'
                 )
Example #29
0
async def BlackId_Group_listener(message: MessageChain,
                                 app: GraiaMiraiApplication, group: Group,
                                 member: Member):
    if message.has(At):
        AtLsit = []
        for i in range(len(message.get(At))):
            AtLsit.append(
                int(re.findall('target=(.*) ', str(message.get(At)[i]))[0]))
        MessageGet = message.asDisplay().replace(" ", "")
        for i in range(len(AtLsit)):
            if AtLsit[i] == Bot:
                pinyinStr = ""
                for i in range(len(lazy_pinyin(MessageGet))):
                    pinyinStr += lazy_pinyin(MessageGet)[i]
                if pinyinStr.find("shabi") >= 0 or pinyinStr.find(
                        "hanhan") >= 0 or pinyinStr.find("bendan") >= 0:
                    if pinyinStr.find("woshishabi") < 0:
                        await app.sendGroupMessage(group,
                                                   MessageChain.create([
                                                       At(member.id),
                                                       Plain("不理你了!")
                                                   ]),
                                                   quote=message[Source][0])
                        BlackId.add(member.id)
                elif MessageGet.find("对不起") >= 0 or MessageGet.find(
                        "我错了") >= 0 or MessageGet.find("抱歉") >= 0:
                    if member.id in BlackId:
                        await app.sendGroupMessage(
                            group,
                            MessageChain.create([
                                At(member.id),
                                Image.fromLocalFile("./Menhera/37.jpg"),
                                Plain("想让我原谅你?请问谁是傻逼?")
                            ]))

                        @Waiter.create_using_function([GroupMessage])
                        async def Remove_Blacklist(
                                event: GroupMessage, waiter_group: Group,
                                waiter_member: Member,
                                waiter_message: MessageChain):
                            if waiter_group.id == group.id and waiter_member.id == member.id and waiter_message.asDisplay(
                            ).find("我是傻逼") >= 0:
                                await app.sendGroupMessage(
                                    group,
                                    MessageChain.create([
                                        At(member.id),
                                        Image.fromLocalFile(
                                            "./Menhera/110.jpg"),
                                        Plain("哼,这还差不多┑( ̄Д  ̄)┍")
                                    ]))
                                BlackId.remove(member.id)
                                await app.sendGroupMessage(
                                    group,
                                    MessageChain.create(
                                        [Plain("这次就算了,下不为例哦╰( ̄ω ̄o)")]))
                                return event

                        try:
                            await asyncio.wait_for(inc.wait(Remove_Blacklist),
                                                   timeout=30)
                        except asyncio.TimeoutError:
                            await app.sendGroupMessage(
                                group,
                                MessageChain.create([
                                    At(member.id),
                                    Image.fromLocalFile("./Menhera/63.jpg"),
                                    Plain("\n不承认自己是傻逼就算了(*  ̄︿ ̄)")
                                ]))
                        pass
                    else:
                        await app.sendGroupMessage(
                            group,
                            MessageChain.create(
                                [Image.fromLocalFile("./Menhera/139.png")]),
                            quote=message[Source][0])
                else:
                    await app.sendGroupMessage(group,
                                               MessageChain.create(
                                                   [Plain("@我没有用哦~")]),
                                               quote=message[Source][0])
Example #30
0
 async def java_main():
     url = 'http://launchermeta.mojang.com/mc/game/version_manifest.json'
     try:
         version_file = os.path.abspath('./assets/mcversion.txt')
         logger_info('Checking mcv...')
         verlist = getfileversions(version_file)
         file = await get_data(url, 'json')
         release = file['latest']['release']
         snapshot = file['latest']['snapshot']
         if release not in verlist:
             logger_info(f'huh, we find {release}.')
             for qqgroup in check_enable_modules_all(
                     'group_permission', 'mcv_rss'):
                 try:
                     await app.sendGroupMessage(
                         int(qqgroup),
                         MessageChain.create([
                             Plain('启动器已更新' + file['latest']['release'] +
                                   '正式版。')
                         ]))
                     await asyncio.sleep(0.5)
                 except Exception:
                     traceback.print_exc()
             for qqfriend in check_enable_modules_all(
                     'friend_permission', 'mcv_rss'):
                 try:
                     await app.sendFriendMessage(
                         int(qqfriend),
                         MessageChain.create([
                             Plain('启动器已更新' + file['latest']['release'] +
                                   '正式版。')
                         ]))
                     await asyncio.sleep(0.5)
                 except Exception:
                     traceback.print_exc()
             addversion = open(version_file, 'a')
             addversion.write('\n' + release)
             addversion.close()
             verlist = getfileversions(version_file)
         if snapshot not in verlist:
             logger_info(f'huh, we find {snapshot}.')
             for qqgroup in check_enable_modules_all(
                     'group_permission', 'mcv_rss'):
                 try:
                     await app.sendGroupMessage(
                         int(qqgroup),
                         MessageChain.create([
                             Plain('启动器已更新' + file['latest']['snapshot'] +
                                   '快照。')
                         ]))
                     await asyncio.sleep(0.5)
                 except Exception:
                     traceback.print_exc()
             for qqfriend in check_enable_modules_all(
                     'friend_permission', 'mcv_rss'):
                 try:
                     await app.sendFriendMessage(
                         int(qqfriend),
                         MessageChain.create([
                             Plain('启动器已更新' + file['latest']['snapshot'] +
                                   '快照。')
                         ]))
                     await asyncio.sleep(0.5)
                 except Exception:
                     traceback.print_exc()
             addversion = open('./assets/mcversion.txt', 'a')
             addversion.write('\n' + snapshot)
             addversion.close()
         logger_info('mcv checked.')
     except Exception:
         traceback.print_exc()