diff options
| author | Kyomotoi <1172294279@qq.com> | 2020-12-20 17:14:41 +0800 | 
|---|---|---|
| committer | Kyomotoi <1172294279@qq.com> | 2020-12-20 17:14:41 +0800 | 
| commit | 9bf222471d34cb756a4878b103ec82c6c4bfb191 (patch) | |
| tree | 1420d498c41f71858e74b4926b8d7206b5235fe6 /ATRI/plugins/plugin_anime | |
| parent | 9ac2c2eb7ef2eb267e926d599dc077f5afae98f9 (diff) | |
| download | ATRI-9bf222471d34cb756a4878b103ec82c6c4bfb191.tar.gz ATRI-9bf222471d34cb756a4878b103ec82c6c4bfb191.tar.bz2 ATRI-9bf222471d34cb756a4878b103ec82c6c4bfb191.zip | |
[Update]
- 创建项目结构
Diffstat (limited to 'ATRI/plugins/plugin_anime')
| -rw-r--r-- | ATRI/plugins/plugin_anime/__init__.py | 338 | ||||
| -rw-r--r-- | ATRI/plugins/plugin_anime/data_source.py | 72 | ||||
| -rw-r--r-- | ATRI/plugins/plugin_anime/sepi_list.json | 0 | 
3 files changed, 0 insertions, 410 deletions
| diff --git a/ATRI/plugins/plugin_anime/__init__.py b/ATRI/plugins/plugin_anime/__init__.py deleted file mode 100644 index fea720b..0000000 --- a/ATRI/plugins/plugin_anime/__init__.py +++ /dev/null @@ -1,338 +0,0 @@ -#!/usr/bin/env python3 -# -*- encoding: utf-8 -*- -''' -@File    :   __init__.py -@Time    :   2020/11/07 14:36:53 -@Author  :   Kyomotoi -@Contact :   kyomotoiowo@gmail.com -@Github  :   https://github.com/Kyomotoi -@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved. -''' -__author__ = 'kyomotoi' - -import re -import json -import sqlite3 -from pathlib import Path -from random import randint -from datetime import datetime, timedelta -from apscheduler.triggers.date import DateTrigger - -from nonebot.rule import Rule -from nonebot.log import logger -from nonebot.typing import Bot, Event -from nonebot.permission import SUPERUSER -from nonebot_plugin_apscheduler import scheduler -from nonebot.plugin import on_message, on_command, on_regex - -from ATRI.utils.utils_times import countX -from ATRI.utils.utils_yml import load_yaml -from ATRI.utils.utils_error import errorRepo -from ATRI.utils.utils_history import getMessage -from ATRI.utils.utils_translate import toSimpleString -from ATRI.utils.utils_rule import check_banlist, check_switch -from ATRI.utils.utils_request import aio_get_bytes, request_get -from ATRI.utils.utils_img import compress_image, aio_download_pics - -from .data_source import resultRepo - -CONFIG_PATH = Path('.') / 'config.yml' -config = load_yaml(CONFIG_PATH) - -plugin_name_0 = "anime-pic-search" -key_SauceNAO = config['api']['SauceNaoKEY'] - -SaucenaoSearch = on_command('以图搜图', -                            rule=check_banlist() -                            & check_switch(plugin_name_0, True)) - - -@SaucenaoSearch.handle() -async def _(bot: Bot, event: Event, state: dict) -> None: -    user = str(event.user_id) -    group = str(event.group_id) - -    state["user"] = user -    state["group"] = group - -    img = str(event.message).strip() - -    if img: -        state["img_url"] = img - - -@SaucenaoSearch.got("img_url", prompt="请发送一张目标图片") -async def _(bot: Bot, event: Event, state: dict) -> None: -    img = state["img_url"] -    img = re.findall(r"(http://.*?)]", img) - -    if len(img): -        pass -    else: -        await SaucenaoSearch.reject("请发送一张目标图片,而非文字或其他非图片成分( -'`-; )") - -    await bot.send(event, "别急!正在找图!") - -    await SaucenaoSearch.finish(resultRepo(state['user'], key_SauceNAO, -                                           img[0])) - - -SaucenaoSearch_repo = on_message(rule=check_banlist() -                                 & check_switch(plugin_name_0, True)) - - -@SaucenaoSearch_repo.handle() -async def _(bot: Bot, event: Event, state: dict) -> None: -    group = str(event.group_id) -    msg = str(event.message) - -    if "[CQ:reply" in msg: -        if "搜图" in msg or "识图" in msg: -            if group == "None": -                await SaucenaoSearch_repo.finish("ごめんなさい...\n该功能只对群聊开放哦~~") - -            try: -                repo_info = re.findall(r"CQ:reply,id=([0-9]\S+)]", msg) -                msg_id = repo_info[0] -            except Exception: -                logger.error("Get message_id ERROR!") -                await SaucenaoSearch_repo.finish(errorRepo('定位消息内容失败')) -                return - -            aim = getMessage(msg_id)[f"{msg_id}"]["message"] -            img = img = re.findall(r"(http://.*?)]", aim) - -            if len(img): -                pass -            else: -                await SaucenaoSearch_repo.finish('这消息内貌似没图片呢...') - -            await bot.send(event, "别急!正在找图!") - -            await SaucenaoSearch.finish( -                resultRepo(state['user'], key_SauceNAO, img[0])) - - -plugin_name_1 = "anime-vid-search" -AnimeSearch = on_command('以图搜番', -                         rule=check_banlist() -                         & check_switch(plugin_name_1, True)) - - -@AnimeSearch.handle() -async def _(bot: Bot, event: Event, state: dict) -> None: -    user = str(event.user_id) -    group = str(event.group_id) - -    state["user"] = user -    state["group"] = group - -    img = str(event.message).strip() - -    if img: -        state["img_url"] = img - - -@AnimeSearch.got("img_url", prompt="请发送一张目标图片") -async def _(bot: Bot, event: Event, state: dict) -> None: -    img = state["img_url"] -    img = re.findall(r"(http://.*?)]", img) - -    if len(img): -        pass -    else: -        await SaucenaoSearch.reject("请发送一张目标图片,而非文字或其他非图片成分(") - -    await bot.send(event, "别急!正在搜索!") -    req = None - -    URL = f'https://trace.moe/api/search?url={img[0]}' -    try: -        req = await aio_get_bytes(URL) -    except: -        await AnimeSearch.finish(errorRepo("请求数据失败")) - -    d = {} -    data = json.loads(req.decode()) - -    try: -        for i in range(len(data['docs'])): -            if data['docs'][i]['title_chinese'] in d: -                d[data['docs'][i] -                  ['title_chinese']][0] += data['docs'][i]['similarity'] - -            else: -                m = data['docs'][i]['at'] / 60 -                s = data['docs'][i]['at'] % 60 - -                if data['docs'][i]['episode'] == '': -                    n = 1 - -                else: -                    n = data['docs'][i]['episode'] - -                d[toSimpleString(data['docs'][i]['title_chinese'])] = [ -                    data['docs'][i]['similarity'], f'第{n}集', -                    f'{int(m)}分{int(s)}秒处' -                ] -    except: -        await AnimeSearch.finish(errorRepo("处理数据失败")) - -    result = sorted( -        d.items(), -        key=lambda x: x[1], -        reverse=True) - -    t = 0 -    msg0 = f'[CQ:at,qq={state["user"]}]\n根据所提供的图片按照相似度找到{len(d)}个结果:' - -    for i in result: -        t += 1 -        lk = ('%.2f%%' % (i[1][0] * 100)) -        msg = ( -            f'\n——————————\n({t})\n相似度:{lk}\n动漫名:《{i[0]}》\n时间点:{i[1][1]} {i[1][2]}' -        ) -        msg0 += msg - -    await AnimeSearch.finish(msg0) - - -plugin_name_2 = "anime-setu" -key_LoliconAPI = config['api']['LoliconAPI'] -setu_type = 2  # setu-type: 1(local), 2(url: https://api.lolicon.app/#/setu) -SP_temp_list = [] -SP_list = [] - - -def check_sepi() -> Rule: -    """检查目标是否是涩批""" -    async def _check_sepi(bot: Bot, event: Event, state: dict) -> bool: -        if event.user_id in SP_list: -            await bot.send(event, "你可少冲点吧!涩批!哼唧") -            return False -        else: -            return True -    return Rule(_check_sepi) - -def add_sepi(user: int) -> None: -    """将目标移入涩批名单""" -    global SP_list -    SP_list.append(user) - -def del_sepi(user: int) -> None: -    """将目标移出涩批名单""" -    global SP_list -    SP_list.remove(user) - - -setu = on_regex( -    r"来[点丶张份副个幅][涩色瑟][图圖]|[涩色瑟][图圖]来|[涩色瑟][图圖][gkd|GKD|搞快点]|[gkd|GKD|搞快点][涩色瑟][图圖]", -    rule=check_banlist() & check_switch(plugin_name_2, False) & check_sepi()) - - -@setu.handle() -async def _(bot: Bot, event: Event, state: dict) -> None: -    global SP_temp_list -    user = event.user_id -    group = event.group_id -    res = randint(1, 5) -    print(1) - -    if countX(SP_temp_list, user) == 5: -        add_sepi(user) # type: ignore -        SP_temp_list = list(set(SP_temp_list)) -        delta = timedelta(hours=1) -        trigger = DateTrigger(run_date=datetime.now() + delta) -        scheduler.add_job(func=del_sepi, -                          trigger=trigger, -                          args=(user, ), -                          misfire_grace_time=60) -        return - -    if setu_type == 1: - -        DATA_PATH = Path('.') / 'ATRI' / 'data' / 'data_Sqlite' / 'setu' / 'nearR18.db' -         -        if not DATA_PATH.is_file(): -            await setu.finish("数据库...她是空的!!!") -         -        con = sqlite3.connect(DATA_PATH) -        cur = con.cursor() -        msg = cur.execute('SELECT * FROM nearR18 ORDER BY RANDOM() limit 1;') - -        for i in msg: -            pid = i[0] -            title = i[1] -            img = i[7] - -            msg0 = "setu info:\n" -            msg0 += f"Title: {title}\n" -            msg0 += f"Pid: {pid}\n" -            msg0 += f"[CQ:image,file=file:///{compress_image(await aio_download_pics(img))}]" - -            if 1 <= res < 5: -                SP_temp_list.append(user) -                await setu.finish(msg0) - -            elif res == 5: -                await bot.send(event, "我找到涩图了!但我发给主人了\nο(=•ω<=)ρ⌒☆") - -                for sup in config['bot']['superusers']: -                    await bot.send_private_msg( -                        user_id=sup, -                        message= -                        f"主人,从群{group}来的涩图!热乎着!\nTitle: {title}\nPid: {pid}\n[CQ:image,file=file:///{compress_image(await aio_download_pics(img))}]" -                    ) - -    else: -        params = {"apikey": key_LoliconAPI, "r18": "0", "num": "1"} - -        data = {} - -        try: -            data = json.loads( -                request_get('https://api.lolicon.app/setu/', params)) -        except Exception: -            await setu.finish(errorRepo("请求数据失败,也可能为接口调用次数达上限")) - -        msg0 = "setu info:\n" -        msg0 += f'Title: {data["data"][0]["title"]}\n' -        msg0 += f'Pid: {data["data"][0]["pid"]}\n' -        msg0 += f'[CQ:image,file=file:///{compress_image(await aio_download_pics(data["data"][0]["url"]))}]' - -        if 1 <= res < 5: -            SP_temp_list.append(user) -            await setu.finish(msg0) - -        elif res == 5: -            await bot.send(event, "我找到涩图了!但我发给主人了\nο(=•ω<=)ρ⌒☆") - -            for sup in config['bot']['superusers']: -                await bot.send_private_msg( -                    user_id=sup, -                    message= -                    f'主人,从群{group}来的涩图!热乎着!\nTitle: {data["data"][0]["title"]}\nPid: {data["data"][0]["pid"]}\n[CQ:image,file=file:///{compress_image(await aio_download_pics(data["data"][0]["url"]))}]' -                ) - - -setuType = on_command("setu-type", permission=SUPERUSER) - - -@setuType.handle() -async def _(bot: Bot, event: Event, state: dict) -> None: -    global setu_type -    msg = str(event.message).strip() - -    if not msg: -        await setuType.finish("请查看文档获取帮助(") - -    if msg == "local": -        setu_type = 1 - -    elif msg == "url": -        setu_type = 2 - -    else: -        await setuType.finish("请检查类型是否输入正确嗷!") - -    await setuType.finish("Type conversion completed!") diff --git a/ATRI/plugins/plugin_anime/data_source.py b/ATRI/plugins/plugin_anime/data_source.py deleted file mode 100644 index a479a0e..0000000 --- a/ATRI/plugins/plugin_anime/data_source.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -# -*- encoding: utf-8 -*- -''' -@File    :   body.py -@Time    :   2020/10/11 14:38:23 -@Author  :   Kyomotoi -@Contact :   kyomotoiowo@gmail.com -@Github  :   https://github.com/Kyomotoi -@License :   Copyright © 2018-2020 Kyomotoi, All Rights Reserved. -''' -__author__ = 'kyomotoi' - -import json - -from ATRI.utils.utils_error import errorRepo -from ATRI.utils.utils_request import request_get - - -class SauceNAO: -    """搜图请求主体""" -    def __init__(self, -                 api_key, -                 output_type=2, -                 testmode=0, -                 dbmask=None, -                 dbmaski=32768, -                 db=5, -                 numres=1): -        api = 'https://saucenao.com/search.php' -        self.api = api -        params = dict() -        params['api_key'] = api_key -        params['output_type'] = output_type -        params['testmode'] = testmode -        params['dbmask'] = dbmask -        params['dbmaski'] = dbmaski -        params['db'] = db -        params['numres'] = numres -        self.params = params - -    def search(self, url): -        self.params['url'] = url -        return request_get(self.api, self.params) - - -def resultRepo(user: str, key: str, img_url: str): -    try: -        task = SauceNAO(key) -        data = task.search(img_url) -        print(data) -    except Exception: -        return errorRepo('请求数据失败') - -    data = json.loads(data)['results'][0] -    msg0 = '' -    print(data) - -    msg0 += f'[CQ:at,qq={user}]\n' -    msg0 += "SauceNAO INFO:\n" -    msg0 += f"[CQ:image,file={data['header'].get('thumbnail', None)}]\n" -    msg0 += f"Like:{data['header'].get('similarity', 0)}%\n" -    msg0 += f"Title:{data['data'].get('title', None)}\n" -    msg0 += f"Pixiv ID:{data['data'].get('pixiv_id', None)}\n" -    msg0 += f"Author:{data['data'].get('member_name', None)}\n" -    msg0 += f"Autoor ID:{data['data'].get('member_id', None)}\n" -    msg0 += f"Pixiv URL: https://www.pixiv.net/artworks/{data['data'].get('pixiv_id', None)}\n" -    msg0 += f"Pic URL: https://pixiv.cat/{data['data'].get('pixiv_id', None)}.jpg" - -    if float(data['header'].get('similarity', 0)) < 65: -        msg0 += '\n注:相似率小于65%不一定正确' - -    return msg0
\ No newline at end of file diff --git a/ATRI/plugins/plugin_anime/sepi_list.json b/ATRI/plugins/plugin_anime/sepi_list.json deleted file mode 100644 index e69de29..0000000 --- a/ATRI/plugins/plugin_anime/sepi_list.json +++ /dev/null | 
