コード例 #1
0
    async def handle(app: Ariadne, message: MessageChain, group: Group, member: Member):
        if message.asDisplay() == "搜番":
            await update_user_call_count_plus(group, member, UserCalledCount.search, "search")
            if not await group_setting.get_setting(group.id, Setting.bangumi_search):
                return MessageItem(MessageChain.create([Plain(text="搜番功能未开启呐~请联系管理员哦~")]), Normal())
            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

            inc = InterruptControl(bcc)
            start_time = time.time()
            await inc.wait(waiter)
            if image_get:
                logger.success("收到用户图片,启动搜索进程!")
                try:
                    await app.sendGroupMessage(
                        group,
                        await BangumiSearcher.search_bangumi(message_received[Image][0]),
                        quote=message_received[Source][0]
                    )
                except AccountMuted:
                    logger.error(f"Bot 在群 <{group.name}> 被禁言,无法发送!")
                    pass
            return None
        else:
            return None
コード例 #2
0
ファイル: main.py プロジェクト: Restent/commspt-bot
async def new_question_nofication(app: Ariadne, group: Group, member: Member, msg: MessageChain):
    enable_in_groups: List[int] = [qq.littleskin_main]
    admins = await app.getMemberList(qq.notification_channel)
    admins_id = [m.id for m in admins]
    if group.id in enable_in_groups and member.id not in admins_id:
        await app.sendGroupMessage(qq.notification_channel,
                                   MessageChain.create(
                                       [Plain(tF.new_question_nofication)]),
                                   quote=msg[Source][0].id)
        await app.sendGroupMessage(group,
                                   MessageChain.create(
                                       [Plain(tF.new_question_sent)]),
                                   quote=msg[Source][0].id)
コード例 #3
0
 async def cache(self, **kwargs):
     accepted = ['update', 'store']
     command = None
     for name, arg in kwargs.items():
         if name == "arg" and isinstance(arg, str):
             command = arg
     if not command:
         return MessageChain.create([Plain(text=f"未填写参数")])
     if command not in accepted:
         return MessageChain.create([Plain(text=f"未知参数:{command}")])
     if command == 'update':
         return self.update_cache(manual=True)
     if command == 'store':
         return self.store_cache(manual=True)
コード例 #4
0
ファイル: main.py プロジェクト: Restent/commspt-bot
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch):
    player_name = params.result.asDisplay()
    player_uuid = await apis.MojangPlayerUuidApi.get(player_name)
    if not player_uuid.existed:
        await app.sendGroupMessage(group, MessageChain.create([Plain(f'「{player_name}」不存在')]))
        return
    async with aiohttp.ClientSession() as session:
        async with session.get(f'https://crafatar.com/renders/body/{player_uuid.id}?overlay') as resp:
            if resp.status == 200:
                image = await resp.content.read()
                await app.sendGroupMessage(group, MessageChain.create([Image(data_bytes=image)]))
            else:
                err_msg = await resp.text()
                await app.sendGroupMessage(group, MessageChain.create([Plain(f'Crafatar Error: {err_msg.strip()[:64]}')]))
コード例 #5
0
 async def github_schedule(self, **kwargs):
     if not self.initialize:
         self.update_cache()
         self.initialize = True
     try:
         app = None
         manual = False
         repo = None
         per_page = 30
         page = 1
         for name, arg in kwargs.items():
             if name == "manual" and isinstance(arg, bool):
                 manual = arg
             if name == "repo" and isinstance(arg, tuple):
                 repo = arg
             if name == "per_page" and isinstance(arg, int):
                 per_page = arg
             if name == "page" and isinstance(arg, int):
                 page = arg
             if isinstance(arg, Ariadne):
                 app = arg
         if not app:
             logger.error("无法获得 Ariadne 实例")
             return None
         if self.__is_running:
             if manual:
                 return MessageItem(
                     MessageChain.create(
                         [Plain(text="Github 订阅插件正在进行其他操作,请稍后再试。")]),
                     QuoteSource())
             return None
         if self.__status and repo:
             res = []
             if events := await self.get_repo_event(repo, per_page, page):
                 if isinstance(events, list):
                     self.__cached[repo]['last_id'] = int(events[0]['id'])
                     if resp := await self.a_generate_plain(events[0]):
                         res.append(resp)
                 else:
                     res.append(Plain(text=events["message"]))
             if not res:
                 return None
             res.insert(0, Plain(text=f"仓库:{repo[0]}/{repo[1]}\n"))
             res.append(
                 Plain(
                     text=
                     f"----------\n获取时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
                 ))
             return MessageChain.create(res)
コード例 #6
0
 def update_cache(self, manual: bool = False):
     try:
         with open(str(Path(__file__).parent.joinpath("watcher_data.json")),
                   "r") as r:
             data = json.loads(r.read())
             cache = {}
             for key in data.keys():
                 owner, repo = key.split("/")
                 cache[(owner, repo)] = data[key]
             self.__cached = cache
         return MessageChain.create([Plain(
             text="更新缓存成功")]) if manual else None
     except (FileNotFoundError, JSONDecodeError):
         return MessageChain.create(
             [Plain(text="无法更新缓存,请检查是否删除了缓存文件并重新储存缓存")])
コード例 #7
0
async def search(*,
                 keyword: Optional[str] = None,
                 data_bytes: Optional[bytes] = None) -> MessageChain:
    search_url = "https://xslist.org/search?lg=en&query="
    pic_search_url = "https://xslist.org/search/pic"
    if not keyword and not data_bytes:
        raise ValueError("You should give keyword or data_bytes!")
    elif keyword:
        keyword = keyword.strip()
        async with get_running(Adapter).session.get(search_url + keyword,
                                                    proxy=proxy) as resp:
            html = await resp.text()
    elif data_bytes:
        async with get_running(Adapter).session.post(pic_search_url,
                                                     data={
                                                         "pic": data_bytes,
                                                         "lg": "en"
                                                     },
                                                     proxy=proxy) as resp:
            html = await resp.text()
    soup = BeautifulSoup(html, "html.parser")
    lis = soup.find_all("li")
    if not lis:
        return MessageChain(f"没有找到关于 {keyword} 的结果呢~换个关键词试试?")
    msgs = []
    for li in lis:
        avatar = li.find("img")["src"]
        async with get_running(Adapter).session.get(avatar,
                                                    proxy=proxy) as resp:
            avatar = await resp.read()
        msgs.append(
            MessageChain([
                Image(data_bytes=avatar),
                Plain('\n'),
                Plain(li.find("h3").find("a")["title"]),
                Plain('\n'),
                Plain(li.find("p").get_text().replace("<br />", '\n'))
            ]))
    return msgs[0] if len(msgs) == 1 else MessageChain([
        Forward([
            ForwardNode(
                senderId=config.bot_qq,
                time=datetime.now(),
                senderName="SAGIRI BOT",
                messageChain=msg,
            ) for msg in msgs
        ])
    ])
コード例 #8
0
async def gacha(app: Ariadne, group: Group, message: MessageChain,
                member: Member, count: RegexResult):
    gid = group.id
    user_id = member.id
    count = int(count.result.asDisplay())
    if all([
            count == 10 and not daily_limiter_10.check(user_id), count == 90
            and not daily_limiter_90.check(user_id), count == 180
            and not daily_limiter_180.check(user_id)
    ]):
        await app.sendMessage(
            group, MessageChain.create([Plain(text='今天已经抽了很多次啦,明天再来吧~')]))
        return
    if gid in group_pool:
        G = Gacha(group_pool[gid])
    else:
        G = Gacha()
    if count == 10:
        daily_limiter_10.increase(user_id)
    elif count == 90:
        daily_limiter_90.increase(user_id)
    else:
        daily_limiter_180.increase(user_id)
    await app.sendMessage(group,
                          G.gacha_10() if count == 10 else
                          (G.gacha_90() if count == 90 else G.gacha_90(180)),
                          quote=message.getFirst(Source))
コード例 #9
0
async def group_wordcloud_generator(
    app: Ariadne,
    message: MessageChain,
    group: Group,
    member: Member,
    scope: MatchResult,
    period: MatchResult,
    topK: MatchResult,
    mask: ElementResult
):
    scope = "group" if scope.result.asDisplay() == "本群" else "member"
    if scope == "group" and not await user_permission_require(group, member, 2):
        return await app.sendGroupMessage(
            group,
            MessageChain.create([Plain(text="权限不足呢~爪巴!")]),
            quote=message.getFirst(Source),
        )

    period = period.result.asDisplay()
    topK = min(int(topK.result.asDisplay()), 100000) if topK.matched else 1000
    await app.sendGroupMessage(
        group,
        await GroupWordCloudGenerator.get_review(group, member, period, scope, topK, mask.result),
        quote=message.getFirst(Source),
    )
コード例 #10
0
def exception_resender_listener(app: Ariadne,
                                exception_resender_instance: ExceptionReSender,
                                loop):
    while True:
        task = exception_resender_instance.get()
        if task:
            logger.warning("task caught! " + "len:" +
                           str(exception_resender_instance.getLen()) +
                           "task: " + str(task))
            try:
                asyncio.run_coroutine_threadsafe(
                    task[0].strategy.send(app, task[0].message, task[1],
                                          task[2], task[3]), loop)
                logger.success(f"task resend successfully! task: {str(task)}")
            except Exception:
                task[4] += 1
                if task[4] <= exception_resender_instance.max_retries:
                    exception_resender_instance.addTask(task)
                else:
                    logger.error(
                        "Maximum number of retries exceeded! Task cancelled!")
                    asyncio.run_coroutine_threadsafe(
                        app.sendGroupMessage(
                            task[4],
                            MessageChain.create([
                                Plain(
                                    text=
                                    "Maximum number of retries exceeded! Task cancelled!"
                                )
                            ]),
                            quote=task[1][Source][0]), loop)
        time.sleep(2)
コード例 #11
0
 async def cd_check(event: GroupMessage) -> NoReturn:
     if await Permission.get(event.sender.group,
                             event.sender) >= override_level:
         return
     current = time.time()
     async with (await cls.get_lock()):
         last = cls.last_exec[event.sender.id]
         if current - cls.last_exec[event.sender.id][1] >= suspend_time:
             cls.last_exec[event.sender.id] = (1, current)
             if event.sender.id in cls.sent_alert:
                 cls.sent_alert.remove(event.sender.id)
             return
         elif last[0] < max_exec:
             cls.last_exec[event.sender.id] = (last[0] + 1, current)
             if event.sender.id in cls.sent_alert:
                 cls.sent_alert.remove(event.sender.id)
             return
         if event.sender.id not in cls.sent_alert:
             if not silent:
                 await ariadne_ctx.get().sendGroupMessage(
                     event.sender.group,
                     MessageChain.create([
                         Plain(
                             f"冷却还有{last[1] + suspend_time - current:.2f}秒结束,"
                             f"之后可再执行{max_exec}次")
                     ]),
                     quote=event.messageChain.getFirst(Source).id,
                 )
             cls.sent_alert.add(event.sender.id)
         raise ExecutionStop()
コード例 #12
0
async def github_info(app: Ariadne, message: MessageChain, group: Group, image: ArgResult, keyword: RegexResult):
    image = image.matched
    keyword = keyword.result.asDisplay()
    url = "https://api.github.com/search/repositories?q="
    img_url = "https://opengraph.githubassets.com/c9f4179f4d560950b2355c82aa2b7750bffd945744f9b8ea3f93cc24779745a0/"
    async with get_running(Adapter).session.get(url=url + keyword) as resp:
        result = (await resp.json())["items"]
    if not result:
        await app.sendGroupMessage(group, MessageChain("没有搜索到结果呢~"), quote=message.getFirst(Source))
    elif image:
        img_url += result[0]["full_name"]
        async with get_running(Adapter).session.get(img_url) as resp:
            content = await resp.read()
        await app.sendGroupMessage(group, MessageChain([Image(data_bytes=content)]), quote=message.getFirst(Source))
    else:
        result = result[0]
        name = result["name"]
        owner = result["owner"]["login"]
        description = result["description"]
        repo_url = result["html_url"]
        stars = result["stargazers_count"]
        watchers = result["watchers"]
        language = result["language"]
        forks = result["forks"]
        issues = result["open_issues"]
        repo_license = result["license"]["key"] if result["license"] else "无"
        msg = MessageChain([
            Plain(text=f"名称:{name}\n"),
            Plain(text=f"作者:{owner}\n"),
            Plain(text=f"描述:{description}\n"),
            Plain(text=f"链接:{repo_url}\n"),
            Plain(text=f"stars:{stars}\n"),
            Plain(text=f"watchers:{watchers}\n"),
            Plain(text=f"forks:{forks}\n"),
            Plain(text=f"issues:{issues}\n"),
            Plain(text=f"language:{language}\n"),
            Plain(text=f"license:{repo_license}")
        ])
        try:
            await app.sendGroupMessage(group, msg, quote=message.getFirst(Source))
        except MessageTooLong:
            await app.sendGroupMessage(
                group,
                MessageChain([Image(data_bytes=TextEngine([GraiaAdapter(msg)]).draw())]),
                quote=message.getFirst(Source)
            )
コード例 #13
0
ファイル: __init__.py プロジェクト: nullqwertyuiop/sagiri-bot
 async def super_resolution(image_data: bytes,
                            resize: bool = False) -> MessageItem:
     start = time.time()
     image = IMG.open(BytesIO(image_data))
     image_size = image.size[0] * image.size[1]
     if image_size > max_size:
         if not resize:
             await mutex.acquire()
             SuperResolution.processing = False
             mutex.release()
             return MessageItem(
                 MessageChain.create([
                     Plain(
                         text=
                         "图片尺寸过大!请发送1080p以内即像素数小于 1920×1080=2073600的照片!\n"),
                     Plain(
                         text=
                         f"此图片尺寸为:{image.size[0]}×{image.size[1]}={image_size}!"
                     )
                 ]), QuoteSource())
         length = 1
         for b in str(max_size / image_size).split('.')[1]:
             if b == '0':
                 length += 1
             else:
                 break
         magnification = round(max_size / image_size, length + 1)
         image = image.resize((round(image.size[0] * magnification),
                               round(image.size[1] * magnification)))
     image_array: np.ndarray = image.__array__()
     output, _ = await loop.run_in_executor(None, upsampler.enhance,
                                            image_array, 2)
     result = BytesIO()
     img = IMG.fromarray(output)
     img.save(result, format='PNG')  # format: PNG / JPEG
     end = time.time()
     use_time = round(end - start, 2)
     await mutex.acquire()
     SuperResolution.processing = False
     mutex.release()
     return MessageItem(
         MessageChain.create([
             Plain(text=f"超分完成!处理用时:{use_time}s\n"),
             Plain(text=f"由于像素过大,图片已进行缩放,结果可能不如原图片清晰\n" if resize else ""),
             Image(data_bytes=result.getvalue())
         ]), QuoteSource())
コード例 #14
0
ファイル: main.py プロジェクト: Restent/commspt-bot
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch):
    player_name = params.result.asDisplay()
    result = await apis.CustomSkinLoaderApi.get('https://littleskin.cn/csl', player_name)
    if not result.player_existed:
        await app.sendGroupMessage(group, MessageChain.create([Plain(f'「{player_name}」不存在')]))
    else:
        bs_root = 'https://littleskin.cn'
        preview_images: List[Image] = list()
        for texture in [result.skin_hash, result.cape_hash]:
            if texture:
                preview_images.append(Image(data_bytes=await apis.getTexturePreview(
                    bs_root, texture)))
    await app.sendGroupMessage(group,
                               MessageChain.create([*preview_images,
                                                    Plain(f'''「{player_name}」
Skin: {result.skin_hash[:7]} [{result.skin_type}]
Cape: {result.cape_hash[:7] if result.cape_existed else None}''')]))
コード例 #15
0
    async def search_bangumi(img: Image) -> MessageChain:
        url = f"https://api.trace.moe/search?anilistInfo&url={img.url}"
        async with aiohttp.ClientSession() as session:
            async with session.post(url=url, proxy=proxy if proxy != "proxy" else '') as resp:
                result = await resp.json()
        # print(result)
        if result := result.get("result"):
            # print(json.dumps(result[0], indent=4))
            title_native = result[0]["anilist"]["title"]["native"]
            title_romaji = result[0]["anilist"]["title"]["romaji"]
            title_english = result[0]["anilist"]["title"]["english"]
            file_name = result[0]["filename"]
            similarity = round(float(result[0]["similarity"]) * 100, 2)
            time_from = result[0]["from"]
            time_to = result[0]["to"]
            thumbnail_url = result[0]["image"]

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

            message = await MessageChainUtils.messagechain_to_img(
                MessageChain.create([
                    Plain(text="搜索到结果:\n"),
                    Image(data_bytes=thumbnail_content),
                    Plain(text=f"番剧名: {title_native}\n"),
                    Plain(text=f"罗马音名: {title_romaji}\n"),
                    Plain(text=f"英文名: {title_english}\n"),
                    Plain(text=f"文件名: {file_name}\n"),
                    Plain(text=f"时间: {sec_to_str(time_from)} ~ {sec_to_str(time_to)}\n"),
                    Plain(text=f"相似度: {similarity}%"),
                ])
            )
            return message
コード例 #16
0
ファイル: saucenao.py プロジェクト: nullqwertyuiop/sagiri-bot
async def saucenao_search(api_key: str,
                          proxies: Optional[str] = None,
                          *,
                          url: Optional[str] = None,
                          file: Optional[BinaryIO] = None) -> MessageChain:
    if not url and not file:
        raise ValueError("You should give url or file!")
    if not api_key:
        return MessageChain("未配置SAUCENAO_API_KEY!")
    async with Network(proxies=proxies) as client:
        saucenao = SauceNAO(client=client, api_key=api_key)
        if url:
            resp = await saucenao.search(url=url)
        elif file:
            resp = await saucenao.search(file=file)
        if not resp.raw:
            return MessageChain("SAUCENAO未搜索到结果!")
        resp = resp.raw[0]
        return MessageChain([
            Plain("SAUCENAO搜索到以下结果:\n"),
            Image(data_bytes=await get_thumb(resp.thumbnail, proxies)),
            Plain(f"\n标题:{resp.title}\n"),
            Plain(f"相似度:{resp.similarity}%\n"),
            Plain(f"作者:{resp.author}\n"),
            Plain(f"pixiv图像 id:{resp.pixiv_id}\n" if resp.pixiv_id else ''),
            Plain(f"pixiv画师 id:{resp.member_id}\n" if resp.member_id else ''),
            Plain(f"链接:{resp.url}")
        ])
コード例 #17
0
 def store_cache(self, manual: bool = False):
     with open(str(Path(__file__).parent.joinpath("watcher_data.json")),
               "w") as w:
         cache = {}
         for key in self.__cached.keys():
             new_key = f"{key[0]}/{key[1]}"
             cache[new_key] = self.__cached[key]
         w.write(json.dumps(cache, indent=4))
     return MessageChain.create([Plain(text="写入缓存成功")]) if manual else None
コード例 #18
0
async def online_notice(app: Ariadne):
    group_list = await app.getGroupList()
    for group in group_list:
        if await group_setting.get_setting(group.id, Setting.online_notice):
            try:
                await app.sendGroupMessage(
                    group, MessageChain.create([Plain(text="纱雾酱打卡上班啦!")]))
            except AccountMuted:
                pass
コード例 #19
0
ファイル: main.py プロジェクト: Restent/commspt-bot
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch):
    infos = await apis.CustomSkinLoaderLatest.get()
    mod_loader = params.result.asDisplay().strip()
    forge = f'''CustomSkinLoader 最新版本:{infos.version}
1.7.10 ~ 1.16.5: {infos.downloads.Forge}
1.17+: {infos.downloads.ForgeActive}'''
    fabric = f'''CustomSkinLoader 最新版本:{infos.version}
Fabric: {infos.downloads.Fabric}'''
    _message = forge if mod_loader == 'forge' else fabric
    await app.sendGroupMessage(group, MessageChain.create([Plain(_message)]))
コード例 #20
0
ファイル: main.py プロジェクト: Restent/commspt-bot
async def command_handler(app: Ariadne, group: Group, params: WildcardMatch):
    player_name = params.result.asDisplay()
    result = await apis.CustomSkinLoaderApi.get('https://littleskin.cn/csl', player_name)
    if not result.player_existed:
        _message = f'「{player_name}」不存在'
    else:
        _message = f'''「{player_name}」
Skin: {result.skin_hash[:7]} [{result.skin_type}]
Cape: {result.cape_hash[:7] if result.cape_existed else None}'''
    await app.sendGroupMessage(group, MessageChain.create([Plain(_message)]))
コード例 #21
0
 async def handle(app: Ariadne, message: MessageChain, group: Group,
                  member: Member):
     if message.asDisplay().startswith("/fake "):
         content = "".join(i.text for i in message.get(Plain))[6:]
         if not message.has(At):
             return MessageItem(MessageChain.create([Plain(text="未指定目标!")]),
                                Normal())
         sender = message.get(At)[0]
         forward_nodes = [
             ForwardNode(
                 senderId=sender.target,
                 time=datetime.now(),
                 senderName=(await app.getMember(group,
                                                 sender.target)).name,
                 messageChain=MessageChain.create(Plain(text=content)),
             )
         ]
         return MessageItem(
             MessageChain.create(Forward(nodeList=forward_nodes)), Normal())
コード例 #22
0
ファイル: tarot.py プロジェクト: nullqwertyuiop/sagiri-bot
 def get_tarot() -> MessageChain:
     card, filename = Tarot.get_random_tarot()
     card_dir = random.choice(['normal', 'reverse'])
     card_type = '正位' if card_dir == 'normal' else '逆位'
     content = f"{card['name']} ({card['name-en']}) {card_type}\n牌意:{card['meaning'][card_dir]}"
     elements = []
     img_path = f"{os.getcwd()}/statics/tarot/{card_dir}/{filename + '.jpg'}"
     if filename and os.path.exists(img_path):
         elements.append(Image(path=img_path))
     elements.append(Plain(text=content))
     return MessageChain(elements)
コード例 #23
0
ファイル: main.py プロジェクト: GWDx/Mado
async def friend_message_listener(message: MessageChain, app: Ariadne,
                                  friend: Friend):
    command = normalize(message)
    result = kernel(command, str(friend.id))
    if result:
        try:
            await app.sendFriendMessage(friend, MessageChain.create([result]))
        except Exception as ex:
            print('## ', ex)
            await app.sendFriendMessage(friend,
                                        MessageChain.create([Plain(str(ex))]))
コード例 #24
0
 async def wrapper(*args, **kwargs):
     try:
         if asyncio.iscoroutinefunction(func):
             result = await func(*args, **kwargs)
         else:
             result = func(*args, **kwargs)
         return result
     except:
         return MessageItem(
             MessageChain.create([Plain(text=traceback.format_exc())]),
             QuoteSource())
コード例 #25
0
 async def handle(app: Ariadne, message: MessageChain, group: Group,
                  member: Member):
     if re.match(pattern, message.asDisplay()):
         if not await user_permission_require(group, member, 2):
             return MessageItem(
                 MessageChain.create([Plain(text="你没有权限,爬!")]), Normal())
         image_type = re.findall(r"添加(.*?)图片.*(\[图片].*)+",
                                 message.asDisplay(), re.S)[0][0]
         if image_type not in legal_type:
             return MessageItem(
                 MessageChain.create([
                     Plain(
                         text=f"非法图片类型!\n合法image_type:{'、'.join(legal_type)}"
                     )
                 ]), QuoteSource())
         if path := image_paths.get(image_type):
             if os.path.exists(path):
                 try:
                     await ImageAdder.add_image(path, message.get(Image))
                 except:
                     logger.error(traceback.format_exc())
                     return MessageItem(
                         MessageChain.create(
                             [Plain(text="出错了呐~请查看日志/控制台输出!")]), Normal())
                 return MessageItem(
                     MessageChain.create([
                         Plain(
                             text=f"保存成功!共保存了{len(message.get(Image))}张图片!")
                     ]), Normal())
             else:
                 return MessageItem(
                     MessageChain.create([
                         Image(
                             path=
                             f"{os.getcwd()}/statics/error/path_not_exists.png"
                         )
                     ]), QuoteSource())
         else:
             return MessageItem(
                 MessageChain.create([Plain(text=f"无{image_type}项!请检查配置!")
                                      ]), QuoteSource())
コード例 #26
0
async def google_search(proxies: Optional[str] = None,
                        *,
                        url: Optional[str] = None,
                        file: Optional[BinaryIO] = None) -> MessageChain:
    if not url and not file:
        raise ValueError("You should offer url or file!")
    async with Network(proxies=proxies) as client:
        google = Google(client=client)
        if url:
            resp = await google.search(url=url)
        elif file:
            resp = await google.search(file=file)
        if not resp.raw:
            return MessageChain("GOOGLE未搜索到结果!")
        resp = resp.raw[2]
        return MessageChain([
            Plain("GOOGLE搜索到以下结果:\n"),
            Image(data_bytes=await get_thumb(resp.thumbnail, proxies)),
            Plain(f"\n标题:{resp.title}\n"),
            Plain(f"链接:{resp.url}")
        ])
コード例 #27
0
ファイル: baidu.py プロジェクト: nullqwertyuiop/sagiri-bot
async def baidu_search(*,
                       url: Optional[str] = None,
                       file: Optional[BinaryIO] = None) -> MessageChain:
    if not url and not file:
        raise ValueError("You should offer url or file!")
    async with Network() as client:
        baidu = BaiDu(client=client)
        if url:
            resp = await baidu.search(url=url)
        elif file:
            resp = await baidu.search(file=file)
        if not resp.raw:
            return MessageChain("BAIDU未搜索到结果!")
        resp = resp.raw[2]
        return MessageChain([
            Plain("BAIDU搜索到以下结果:\n"),
            Image(data_bytes=await get_thumb(resp.image_src, '')),
            Plain(f"\n标题:{resp.title}\n"),
            Plain(f"摘要:{resp.abstract}\n"),
            Plain(f"链接:{resp.url}")
        ])
コード例 #28
0
 async def check(self, **kwargs) -> MessageChain:
     group = None
     friend = None
     for name, arg in kwargs.items():
         if isinstance(arg, Group):
             group = arg
         if isinstance(arg, Friend):
             friend = arg
     if not group and not friend:
         return MessageChain.create([Plain(text=f"无法获取 Group 或 Friend 实例")])
     watched = []
     target = group if group else friend
     field = 'group' if group else 'friend'
     for repo in self.__cached.keys():
         if target.id in self.__cached[repo][field]:
             watched.append(f"{repo[0]}/{repo[1]}")
     res = [
         Plain(text=f"{'本群' if group else '你'}订阅的仓库有:\n"
               f"{' '.join(watched)}")
     ]
     return MessageChain.create(res)
コード例 #29
0
ファイル: ehentai.py プロジェクト: nullqwertyuiop/sagiri-bot
async def ehentai_search(proxies: Optional[str] = None,
                         cookies: Optional[str] = None,
                         ex: bool = False,
                         *,
                         url: Optional[str] = None,
                         file: Optional[BinaryIO] = None) -> MessageChain:
    if not url and not file:
        raise ValueError("You should offer url or file!")
    if ex and not cookies:
        raise ValueError(
            "If you use EXHentai Searcher, you should offer cookies!")
    async with Network(proxies=proxies, cookies=cookies) as client:
        ehentai = EHentai(client=client)
        if url:
            resp = await ehentai.search(url=url, ex=ex)
        elif file:
            resp = await ehentai.search(file=file, ex=ex)
        if not resp.raw:
            return MessageChain("EHentai未搜索到结果!")
        resp = resp.raw[0]
        return MessageChain([
            Plain("EHentai搜索到以下结果:\n"),
            Image(data_bytes=await get_thumb(resp.thumbnail, proxies)),
            Plain(f"\n标题:{resp.title}\n"),
            Plain(f"类别:{resp.type}\n"),
            Plain(f"上传日期:{resp.date}\n"),
            Plain(f"标签:{', '.join(resp.tags)}\n"),
            Plain(f"链接:{resp.url}")
        ])
コード例 #30
0
async def chat_reply(
        app: Ariadne,
        message: MessageChain,
        group: Group,
        member: Member,
        at: ElementResult
):
    assert isinstance(at.result, At)
    if at.result.target == config.bot_qq:
        content = "".join(plain.text for plain in message.get(Plain)).strip().replace(" ", ",")
        mode_now = await group_setting.get_setting(group, Setting.speak_mode)

        if mode_now in ("normal", "zuanLow", "zuanLow"):
            return

        elif mode_now == "rainbow":
            async with get_running(Adapter).session.get("https://api.shadiao.app/chp") as resp:
                text = (await resp.json())['data']['text']

        elif mode_now == "chat":
            user_data = config.functions['tencent']
            if user_data["secret_id"] == "secret_id" or user_data["secret_key"] == "secret_key":
                text = "secret_id/secret_key未初始化"
            else:
                try:
                    user_data = config.functions['tencent']
                    cred = credential.Credential(user_data["secret_id"], user_data["secret_key"])
                    http_profile = HttpProfile()
                    http_profile.endpoint = "nlp.tencentcloudapi.com"

                    client_profile = ClientProfile()
                    client_profile.httpProfile = http_profile
                    client = nlp_client.NlpClient(cred, "ap-guangzhou", client_profile)

                    req = models.ChatBotRequest()
                    params = {"Query": content}
                    req.from_json_string(json.dumps(params))
                    resp = client.ChatBot(req)
                    text = json.loads(resp.to_json_string())["Reply"]\
                        .replace("腾讯小龙女", "纱雾酱").replace("小龙女", "纱雾酱")
                except TencentCloudSDKException as e:
                    logger.error(traceback.format_exc())
                    text = str(e)

        else:
            raise Exception(f"数据库群 <{group.id}> speak_mode项非法!目前值:{mode_now}")

        if text:
            await app.sendGroupMessage(group, MessageChain.create([
                At(target=member.id),
                Plain(text=f" {text}")
            ]))