async def get_image(pid): url = 'https://api.pixiv.cat/v1/generate' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36' } payload = {'p': pid} try: resp = await aiorequests.post(url, headers=headers, json=payload, timeout=20) res = await resp.json() except Exception as e: return None success = res['success'] if success is False: return res['error'] multiple = res['multiple'] msg = '' if multiple: img_url = res['original_urls_proxy'] for item in img_url: image = MessageSegment.image(item) msg += f'{image}\n' msg = msg.strip() else: img_url = res['original_url_proxy'] msg = MessageSegment.image(img_url) return msg
def cqcode(self) -> MessageSegment: if cheru.config.RES_PROTOCOL == 'http': return MessageSegment.image(self.url) elif cheru.config.RES_PROTOCOL == 'file': return MessageSegment.image(f'file:///{os.path.abspath(self.path)}') else: try: return MessageSegment.image(helper.pic2b64(self.open())) except Exception as e: return MessageSegment.text('[图片出错]')
async def pic(bot: Bot, event: Event, state: dict): # 数据库 # logger.info(bot.__dict__) # logger.info(event.dict()) # logger.info(state) args = str(event.get_message()).strip().split() url = args[0] if url[:4] == "http": await bot.send(message=Message(MessageSegment.image(url)), event=event) else: key = "https://pixiv.cat/{}.jpg".format(url) await bot.send(message=Message(MessageSegment.image(key)), event=event)
async def _(bot: Bot, event: GroupMessageEvent): global cd if str(event.group_id) not in cd: cd[str(event.group_id)] = int(time.time()) ## 初始化cd if cd[str(event.group_id)] <= int(time.time()): keyword = event.get_message().__str__().strip() response = requests.get( "https://api.lolicon.app/setu/?apikey={0}&r18={1}&keyword={2}&num={3}&proxy=i.pixiv.cat&size1200=false" .format("698604975f3623bd7ed1d0", "2", keyword, 3)) data = json.loads(response.text) if data["code"] == 0: cd[str(event.group_id)] = int(time.time()) + 60 quota = data["quota"] if keyword == "": await setu.send("正在获取涩图,今日剩余可调用 {0} 次".format(quota)) else: await setu.send("正在获取 [{0}] 涩图,今日剩余可调用 {1} 次".format( keyword, quota)) for i in data["data"]: content = "\n标题: {0} (PID: {1})".format(i["title"], i["pid"]) content += "\n作者: {0} (UID: {1})".format(i["author"], i["uid"]) try: await setu.send(MessageSegment.image(i["url"]) + content) except Exception as e: print(e) elif data["code"] == 404: await setu.send("没有符合条件的涩图") else: await setu.send("获取失败") else: await setu.finish( Message(f"CD还剩 {cd[str(event.group_id)] - int(time.time())} 秒,请节制") )
async def gacha_ten(bot: Bot, event: Event, state: dict): SUPER_LUCKY_LINE = 170 uid = event.user_id await check_jewel_num(sv_ten, uid) jewel_limit.increase(uid, 1500) gid = str(event.group_id) gacha = Gacha(_group_pool[gid]) result, hiishi = gacha.gacha_ten() silence_time = 60 res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False) res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False) res = helper.concat_pic([res1, res2]) res = helper.pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res}\n{res1}\n{res2}' if hiishi >= SUPER_LUCKY_LINE: await sv_ten.send('恭喜海豹!おめでとうございます!') try: await bot.set_group_ban(self_id=event.self_id, group_id=event.group_id, user_id=uid, duration=silence_time) except Exception as e: logger.error(e) kwargs = {'at_sender': True} await sv_ten.finish(f'素敵な仲間が増えますよ!\n{res}\n', **kwargs)
async def handle_short(bot: Bot, event: GroupMessageEvent, state: T_State): group = state["_matched_dict"] number = int(group["number"]) full_name = get_group_bind_repo(str(event.group_id)) if not full_name: await issue_short.finish("此群尚未与仓库绑定!") return match = re.match(REPO_REGEX, full_name) if not match: await issue_short.finish("绑定的仓库名不合法!请重新尝试绑定~") owner = match.group("owner") repo = match.group("repo") token = None if get_user_token: token = get_user_token(event.get_user_id()) try: issue_ = await get_issue(owner, repo, number, token) except HTTPStatusError: await issue.finish(f"Issue #{number} not found for repo {owner}/{repo}" ) return img = await issue_to_image(issue_) if img: await send_github_message( issue_short, owner, repo, number, MessageSegment.image(f"base64://{base64.b64encode(img).decode()}"))
async def workTMD(): bot = nonebot.get_bots() if bot: bot = bot['1928994748'] await bot.send_msg(message=MessageSegment.image( f"file:////root/QQbotFiles/baoshi/workTMD.png"), user_id="1761512493")
async def handle(bot: Bot, event: Event, state: T_State): async with httpx.AsyncClient() as client: resp = await client.get('https://api.mtyqx.cn/api/random.php?return=json') logger.debug(resp.json()) imgurl = resp.json()['imgurl'] # cqimg = f"[CQ:image,file=1.{imgurl.split('.')[1]},url={imgurl}]" await setu.send(MessageSegment.image(imgurl))
async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): image_url = state['image_url'] if not re.match(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=.+])', image_url): await search_anime.reject('你发送的似乎不是图片呢, 请重新发送, 取消命令请发送【取消】:') # 提取图片url image_url = re.sub(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=)', '', image_url) image_url = re.sub(r'(])$', '', image_url) await search_anime.send('获取识别结果中, 请稍后~') res = await get_identify_result(img_url=image_url) if not res.success(): logger.info(f"Group: {event.group_id}, user: {event.user_id} " f"search_anime failed: {res.info}") await search_anime.finish('发生了意外的错误QAQ, 请稍后再试') if not res.result: logger.info(f"Group: {event.group_id}, user: {event.user_id} " f"使用了search_anime, 但没有找到相似的番剧") await search_anime.finish('没有找到与截图相似度足够高的番剧QAQ') for item in res.result: try: raw_at = item.get('raw_at') at = item.get('at') anilist_id = item.get('anilist_id') anime = item.get('anime') episode = item.get('episode') tokenthumb = item.get('tokenthumb') filename = item.get('filename') similarity = item.get('similarity') title_native = item.get('title_native') title_chinese = item.get('title_chinese') is_adult = item.get('is_adult') thumb_img_url = f'https://trace.moe/thumbnail.php?' \ f'anilist_id={anilist_id}&file={filename}&t={raw_at}&token={tokenthumb}' img_b64 = await pic_2_base64(thumb_img_url) if not img_b64.success(): msg = f"识别结果: {anime}\n\n名称:\n【{title_native}】\n【{title_chinese}】\n" \ f"相似度: {similarity}\n\n原始文件: {filename}\nEpisode: 【{episode}】\n" \ f"截图时间位置: {at}\n绅士: 【{is_adult}】" await search_anime.send(msg) else: img_seg = MessageSegment.image(img_b64.result) msg = f"识别结果: {anime}\n\n名称:\n【{title_native}】\n【{title_chinese}】\n" \ f"相似度: {similarity}\n\n原始文件: {filename}\nEpisode: 【{episode}】\n" \ f"截图时间位置: {at}\n绅士: 【{is_adult}】\n{img_seg}" await search_anime.send(Message(msg)) except Exception as e: logger.error(f"Group: {event.group_id}, user: {event.user_id} " f"使用命令search_anime时发生了错误: {repr(e)}") continue logger.info(f"Group: {event.group_id}, user: {event.user_id} " f"使用search_anime进行了一次搜索")
async def love_rev(bot: Bot, event: Event, state: dict): msg = "/root/" + str(event.get_message())[5:] print(msg) if os.path.exists(msg): await bot.send(event=event, message=MessageSegment.image(f"file:///{msg}")) else: await bot.send(event=event, message="错误: 文件不存在,或者不是图片")
async def handle_poke(bot: Bot, event: PokeNotifyEvent): if event.target_id == BOT_ID: # 自己被戳 try: await poke.finish("狗修金!不许踢丛雨丸!" + MessageSegment.image(get_avatar_url())) except ActionFailed as e: print(f"[poke.py]: {e}") await poke.finish("狗修金!不许踢丛雨丸!>_<")
async def handle_moepic(bot: Bot, event: GroupMessageEvent, state: T_State): tags = state['tags'] if tags: _res_list = list() for tag in tags: _res = DBPixivillust.list_illust(nsfw_tag=0, keyword=tag) if _res.success(): _pids = set(_res.result) _res_list.append(_pids) if len(_res_list) > 1: # 处理tag交集, 同时满足所有tag for item in _res_list[1:]: _res_list[0].intersection_update(item) pid_list = _res_list[0] elif len(_res_list) == 1: pid_list = _res_list[0] else: pid_list = _res_list else: # 没有tag则随机获取 pid_list = DBPixivillust.rand_illust(num=3, nsfw_tag=0) if not pid_list: logger.info( f"Group: {event.group_id}, User: {event.user_id} 没有找到他/她想要的萌图") await moepic.finish('找不到萌图QAQ') elif len(pid_list) > 3: pid_list = random.sample(pid_list, k=3) await moepic.send('稍等, 正在下载图片~') # 处理article中图片内容 tasks = [] for pid in pid_list: tasks.append(fetch_illust_b64(pid=pid)) p_res = await asyncio.gather(*tasks) fault_count = 0 for image_res in p_res: try: if not image_res.success(): fault_count += 1 logger.warning(f'图片下载失败, error: {image_res.info}') continue else: img_seg = MessageSegment.image(image_res.result) # 发送图片 await moepic.send(img_seg) except Exception as e: logger.warning( f"图片发送失败, group: {event.group_id}. error: {repr(e)}") continue if fault_count == len(pid_list): logger.info( f"Group: {event.group_id}, User: {event.user_id} 没能看到他/她想要的萌图") await moepic.finish('似乎出现了网络问题, 所有的图片都下载失败了QAQ') else: logger.info( f"Group: {event.group_id}, User: {event.user_id} 找到了他/她想要的萌图")
async def handle(bot: Bot, event: MessageEvent, state: T_State): raw_args = str(event.get_message()).strip() argc = 0 if raw_args: arg_list = raw_args.split() argc = len(arg_list) for i in range(argc): state[f"arg{i+1}"] = arg_list[i] if argc > 0 and state["arg1"] == "日榜": is_timeout, is_error, status, data = await get_image_data_v1( url="https://rakuen.thec.me/PixivRss/daily-10") elif argc > 0 and state["arg1"] == "周榜": is_timeout, is_error, status, data = await get_image_data_v1( url="http://rakuen.thec.me/PixivRss/weekly-10") elif argc > 0 and state["arg1"] == "月榜": is_timeout, is_error, status, data = await get_image_data_v1( url="https://rakuen.thec.me/PixivRss/monthly-10") elif argc > 0: keyword = unescape(state["arg1"]) await pixiv.send(f"正在搜索[{keyword}]……") is_timeout, is_error, status, data = await get_image_data_v2( tag=keyword) else: is_timeout, is_error, status, data = await get_image_data_v2() uid = event.user_id session_id = event.get_session_id().split("_") # 消息来自群聊 if len(session_id) == 3: at = MessageSegment.at(uid) + "\n" else: at = "" if is_timeout: await pixiv.finish(at + "苦しい……请求超时了(´。_。`)") if status != 200 and status != 0: await pixiv.finish(at + f"苦しい……连接出错了({status}),可以马上重试一下呢!") if is_error: await pixiv.finish(at + "苦しい……连接出错了(´。_。`)") elif len(data) == 0: await pixiv.finish(at + "寂しい……什么都没找到呢。试试范围更大的关键词哦!") else: chosen = choice(data) try: await pixiv.send(at + f"{chosen[0]}\nPixiv 链接:{chosen[1]}\n" + MessageSegment.image(chosen[2]) + "可能会发不出图片呜呜,复制下面链接到浏览器查看吧") except ActionFailed as e: await pixiv.send( at + f"{chosen[0]}\nPixiv 链接:{chosen[1]}\n大概是太涩了差点发不出来,复制下面链接到浏览器查看吧" ) print(f"[pixiv.py]: {e}") finally: await pixiv.finish(await async_shorten_url(chosen[2]))
async def handle_search(bot: Bot, event: Event, state: T_State): keywords = state["keywords"] data = await search_pic(keywords) if data == "404": await bot.send(event=event, message="没有符合条件的图") else: await bot.send(event=event, message=Message("找到图了!但是发给主人了~")) await bot.call_api("send_private_msg", user_id=1924451951, message=MessageSegment.image(file=data['url']))
async def handle_draw(bot: Bot, event: GroupMessageEvent, state: T_State): image_url = state['image_url'] if not re.match(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=.+])', image_url): await search_image.reject('你发送的似乎不是图片呢, 请重新发送, 取消命令请发送【取消】:') # 提取图片url image_url = re.sub(r'^(\[CQ:image,file=[abcdef\d]{32}\.image,url=)', '', image_url) image_url = re.sub(r'(])$', '', image_url) try: await search_image.send('获取识别结果中, 请稍后~') identify_result = await get_identify_result(url=image_url) # saucenao 没有结果时再使用 ascii2d 进行搜索 if not identify_result: identify_ascii2d_result = await get_ascii2d_identify_result( url=image_url) # 合并搜索结果 identify_result.extend(identify_ascii2d_result) if identify_result: for item in identify_result: try: if type(item['ext_urls']) == list: ext_urls = '' for urls in item['ext_urls']: ext_urls += f'{urls}\n' ext_urls = ext_urls.strip() else: ext_urls = item['ext_urls'] ext_urls = ext_urls.strip() img_b64 = await pic_2_base64(item['thumbnail']) if not img_b64.success(): msg = f"识别结果: {item['index_name']}\n\n相似度: {item['similarity']}\n资源链接: {ext_urls}" await search_image.send(msg) else: img_seg = MessageSegment.image(img_b64.result) msg = f"识别结果: {item['index_name']}\n\n相似度: {item['similarity']}\n资源链接: {ext_urls}\n{img_seg}" await search_image.send(Message(msg)) except Exception as e: logger.warning(f'处理和发送识别结果时发生了错误: {repr(e)}') continue logger.info(f"Group: {event.group_id}, user: {event.user_id} " f"使用searchimage成功搜索了一张图片") return else: await search_image.send('没有找到相似度足够高的图片QAQ') logger.info(f"Group: {event.group_id}, user: {event.user_id} " f"使用了searchimage, 但没有找到相似的图片") return except Exception as e: await search_image.send('识图失败, 发生了意外的错误QAQ') logger.error(f"Group: {event.group_id}, user: {event.user_id} " f"使用命令searchimage时发生了错误: {repr(e)}") return
def build_imgmsg(gets: list, msgs: list): msg = "" for i in range(len(gets)): if not gets[i]: msg = msg + msgs[i] + "无\n" else: msg += msgs[i] for s in gets[i]: msg = msg + MessageSegment.image(file=s["url"]) msg += "\n" return [msg[:-1]]
async def get_des(url: str): image_data: List[Tuple] = await get_pic_from_url(url) if not image_data: msg: str = "找不到高相似度的" yield msg return for pic in image_data: msg = MessageSegment.image(file=pic[0]) + "\n" for i in pic[1:]: msg = msg + f"{i}\n" yield msg
async def _(bot: Bot, event: MessageEvent): city = get_msg(event.get_plaintext()) if city is None: await weather.finish("地点是...空气吗?? >_<") data = await get_City_Weather(city) if type(data) is int: if data == 404: await weather.finish() else: await weather.finish(f"出错了! 错误代码={data}") img = draw(data) if data else None b64 = img_to_b64(img) if img else None if data["warning"]: warning = data["warning"]["warning"] text = "" for i in range(len(warning)): text = f'\n{warning[i]["text"]}' await weather.finish( MessageSegment.image(b64) + MessageSegment.text(text)) else: await weather.finish(MessageSegment.image(b64))
async def get_des(url: str): image_data: List[Tuple] = await get_pic_from_url(url) if not image_data: msg: str = "找不到高相似度的" yield msg return for pic in image_data: msg = MessageSegment.image( file=pic[0] ) + f"\n相似度:{pic[1]}\n标题:{pic[2]}\npixivid:{pic[3]}\nmember:{pic[4]}\n" yield msg pass
async def get_des(url: str): image_data: List[Tuple] = await get_pic_from_url(url) if not image_data: msg: str = "找不到高相似度的" yield msg return for pic in image_data: msg = MessageSegment.image( file=pic[ 0]) + f"\n相似度:{pic[1]}%\n标题:{pic[6]['native'] + ' ' + pic[6]}\n第{pic[7]}集\nR18:{pic[3]}\n开始时间:{pic[4]}s\n结束时间{pic[5]}s" yield msg pass
async def random_setu() -> tuple: """ 随机涩图. """ res = await request.get(LOLICON_URL) data: dict = await res.json() temp_data: dict = data.get("data", list())[0] title = temp_data.get("title", "木陰のねこ") p_id = temp_data.get("pid", 88124144) url = temp_data["urls"].get("original", "ignore") setu = MessageSegment.image(url) return setu, title, p_id
def build_imgmsg(draw_result: Dict[str, List[str]]): """生成图像消息""" # 将每个类别的抽卡结果汇聚到一个列表 items = [] for _, l in draw_result.items(): items.extend(l) # 对每个item获取图像 imgs = [get_image(current_game, item) for item in items] res_img = concat_pic(imgs) res_b64 = pic2b64(res_img) msg = MessageSegment.image(file=res_b64) return msg
async def search(bot: Bot, event: Event, state: T_State): images = get_message_image(event.json()) if have_image(images): for image in images: logger.info(f"imgsearch: search -> \"{image}\"") logger.info(f"SauceNAO: searching...") res_sauce = await saucenao.search(image) if res_sauce.status_code // 100 == 2: logger.info(f"SauceNAO: hit on {res_sauce.content['rate']}") res_text = f"[ {res_sauce.content['index']} / {res_sauce.content['rate']} ]\n" + \ "\n".join(f"{k}: {v}"for k, v in res_sauce.content['data'].items()) message = MessageSegment.reply( event.message_id) + MessageSegment.text(res_text) await bot.send(event, message) elif res_sauce.status_code // 100 == 3: logger.info("SauceNAO: not found") logger.info(f"Ascii2D: searching...") res_ascii = await ascii2d.search(image) if res_ascii.status_code // 100 == 2: message = MessageSegment.reply( event.message_id) + MessageSegment.text("\n".join( f"{k}: {v}" for k, v in res_ascii.content.items())) await bot.send(event, message) elif res_ascii.status_code // 100 == 3: message_1 = MessageSegment.reply(event.message_id)+MessageSegment.text("\n".join(f"{k}: {v}"for k, v in res_ascii.content[0].items())) +\ MessageSegment.image(res_ascii.content[1]) message_2 = MessageSegment.reply(event.message_id)+MessageSegment.text("\n".join(f"{k}: {v}"for k, v in res_ascii.content[2].items())) +\ MessageSegment.image(res_ascii.content[3]) logger.info(f"Ascii2D: sending possible results...") await bot.send(event, message_1) await bot.send(event, message_2) elif res_ascii.status_code // 100 == 4: logger.info(f"Ascii2D: {res_ascii.message}") elif res_sauce.status_code // 100 == 4: logger.error(f"SauceNAO: {res_sauce.message}")
def setu_msg(data: Dict, type: int, user: int) -> Message: msg = "" pid = data["pid"] title = data["title"] img_url = data["urls"]["original"] img = MessageSegment.image(img_url, proxy=False) setu = Message(f"Pid: {pid}\n" f"Title: {title}\n" f"{img}") at_msg = Message(f">{MessageSegment.at(user)}\n") if type == 3: msg = f"[CQ:cardimage,file={img_url}]" elif type == 1: msg = at_msg + setu return Message(msg)
async def threeciyuan_rep(bot: Bot, event: Event, state: dict): if pingbi(event): return path_prefix = "/root/QQbotFiles/3c/" img_list = await get_img_list(path_prefix) if not img_list: await yulu.finish("3次元库已经空了") else: path = rd.choice(img_list) await bot.send(event=event, message=MessageSegment.image( await get_img_url(path_prefix + path)) + f"rm {path}")
async def setu_rev(bot: Bot, event: Event, state: dict): if pingbi(event): return path_prefix = "/root/QQbotFiles/img/" img_list = await get_img_list(path_prefix) if not img_list: await setu.finish("色图库已经空了") else: rd.seed(time.time()) path = img_list[rd.randint(0, len(img_list) - 1)] await bot.send(event=event, message=MessageSegment.image( await get_img_url(path_prefix + path)) + f"rm {path}")
async def handle_city(bot: Bot, event: Event, state: T_State): words = state["words"] data = await fetch_wikipedia(words) if data['content'] == '': msg = '==未找到该词条==' await bot.send(event=event, message=msg) else: msg = data['content'] try: await bot.send(event=event, message=msg + MessageSegment.image(file=data['ImgUrl'])) except: await bot.send(event=event, message=msg)
async def run_every_2_hour(): hour = datetime.now().hour if 1 <= hour <= 8: return if hour > 12: hour -= 12 if hour == 0: hour = 12 bot = nonebot.get_bots() if bot: bot = bot['1928994748'] # await bot.send_msg(message_type="group",message=MessageSegment.image(f"file:////root/QQbotFiles/baoshi/{hour}.png"),group_id=68724983) await bot.send_msg(message=MessageSegment.image( f"file:////root/QQbotFiles/baoshi/{hour}.png"), user_id="1761512493")
async def get_des(url: str): """ 迭代要发送的信息 :param url: :return: """ image_data: List[Tuple] = await get_pic_from_url(url) if not image_data: msg: str = "找不到高相似度的" yield msg return for name, href, pic_url in image_data: content = await get_content_from_url(pic_url) msg = MessageSegment.image( file=content) + f"\n本子名称:{name}\n" + f"链接{href}\n" yield msg
async def get_des(url: str): """ 返回详细简介 cq码转义 :param url: :return: """ image_data: List[Tuple] = await get_pic_from_url(url) if not image_data: msg: str = "找不到高相似度的" yield msg return for pic in image_data: msg = MessageSegment.image(file=pic[0]) + f"\n{pic[1]}\n" for i in pic[2]: msg = msg + f"{i}\n" yield msg