def on_message(self, only_to_me: bool = False, only_group: bool = True, **kwargs) -> "matcher_wrapper": rule = self.check_service(only_to_me, only_group) kwargs['rule'] = rule priority = kwargs.get('priority', 1) mw = matcher_wrapper(self, 'Message.message', priority, only_group=only_group) self.matchers.append(str(mw)) mw.load_matcher(on_message(**kwargs)) _loaded_matchers[mw.matcher] = mw return mw
def on_rex(self, pattern: str, flags: Union[int, re.RegexFlag] = 0, normal: bool = True, only_to_me: bool = False, only_group: bool = True, **kwargs) -> "matcher_wrapper": rule = self.check_service(only_to_me, only_group) rule = regex(pattern, flags, normal) & rule priority = kwargs.get('priority', 1) mw = matcher_wrapper(self, 'Message.regex', priority, pattern=str(pattern), flags=str(flags), only_group=only_group) self.matchers.append(str(mw)) mw.load_matcher(on_message(rule, **kwargs)) _loaded_matchers[mw.matcher] = mw return mw
def on_keyword(self, keywords: Iterable, normal: bool = True, only_to_me: bool = False, only_group: bool = True, **kwargs) -> "matcher_wrapper": if isinstance(keywords, str): keywords = set([keywords]) elif not isinstance(keywords, set): if keywords: keywords = set([keywords]) if len( keywords) == 1 and isinstance(keywords, tuple) else set(keywords) else: keywords = set() rule = self.check_service(only_to_me, only_group) kwargs['rule'] = keyword(*keywords, normal=normal) & rule priority = kwargs.get('priority', 1) mw = matcher_wrapper(self, 'Message.keyword', priority, keywords=str(keywords), only_group=only_group) mw.load_matcher(on_message(**kwargs)) self.matchers.append(str(mw)) _loaded_matchers[mw.matcher] = mw return mw
text = '你是傻逼' else: text = '我是你爹' await bot.send(event, text, at_sender=True) command_test = on_keyword({str}, rule=to_me()) @command_test.handle() async def _echo(bot: Bot, event: MessageEvent): text = str + '是我爹' await bot.send(event, text, at_sender=True) command_test = on_message(rule=to_me(), priority=10) @command_test.handle() async def _echo(bot: Bot, event: MessageEvent): if event.message_type == 'group' and event.get_plaintext() == '': text = '没事@你爹干嘛呢' await bot.send(event, text, at_sender=True) command = on_message(rule=to_me(), priority=5, block=False) @command.handle() async def _echo(bot: Bot, event: MessageEvent): if event.get_plaintext() != '':
""" TextAppraisal包含的功能: 1.初步鉴定消息是否为文字 2.发现违规立即上报 3.正则匹配URL """ from costrule import check_white_list_group import re from datetime import datetime from nonebot.adapters.cqhttp import Bot from nonebot.adapters.cqhttp.event import GroupMessageEvent from nonebot.adapters.cqhttp.message import Message from nonebot.plugin import on_message from config import AdminList_REPORT get_text = on_message(priority=5, rule=check_white_list_group()) @get_text.handle() async def _get_text(bot: Bot, event: GroupMessageEvent): async def report(): time = datetime.now() msg = Message( f"[CQ:at,qq={event.user_id}]喂,你看看你发的什么消息啊kora!" ) msg_master = ( '上报链接消息!!!\n' f'MessageID:{event.message_id}\n' f'Sender:{event.sender.nickname}({event.user_id})\n' f'Time:{time}' )
except ImportError: import json from loguru import logger from nonebot.adapters import Bot, Event from nonebot.adapters.cqhttp.message import Message, MessageSegment from nonebot.typing import T_State from nonebot.exception import ActionFailed config = nonebot.get_driver().config app_id = str(config.tencent_app_id) app_key = config.tencent_app_key cq_code_pattern = re.compile(r'\[CQ:\w+,.+\]') salt = None chat = on_message(priority=5, block=True) def getReqSign(params: dict) -> str: hashed_str = '' for key in sorted(params): hashed_str += key + '=' + quote_plus(params[key]) + '&' hashed_str += 'app_key=' + app_key sign = md5(hashed_str.encode()) return sign.hexdigest().upper() def rand_string(n=8): return ''.join( random.choice(string.ascii_uppercase + string.digits) for _ in range(n))
from nonebot.plugin import on, on_message, on_command command = on_command("log", priority=1) logger = on_message(priority=1, block=False) logger_ = on("message_sent", priority=1, block=False)
import nonebot from nonebot.plugin import on_message, on_command from nonebot.rule import to_me, Rule from nonebot.typing import T_State from nonebot.adapters.mirai import Bot, Event, MessageSegment from .config import Config global_config = nonebot.get_driver().config plugin_config = Config(**global_config.dict()) manual = on_message(rule=to_me(), priority=99) help = on_command('help', priority=98) @manual.handle() async def manual_handle(bot: Bot, event: Event, state: T_State): await manual.finish(plugin_config.about) @help.handle() async def help_handle(bot: Bot, event: Event, state: T_State): args = str(event.get_message()).strip() if args == "r": await help.finish(plugin_config.help_r) elif args == "check": await help.finish(plugin_config.help_check) elif args == "choose": await help.finish(plugin_config.help_choose) elif args == "daily": await help.finish(plugin_config.help_daily)
try: if pic != None: await setu.send(pic) except: await setu.send("呀,发送失败辣,。,") act = on_command("act", priority=1) @act.handle() async def firsthandle(bot: Bot, event: Event, state: dict): await act.finish(unescape(cq.image("activity.jpg"))) stCome = on_message(rule=ckimg("b407f708a2c6a506342098df7cac4a57.image")) @stCome.handle() async def pre(bot: Bot, event: Event, state: dict): if event.detail_type == "group": safe = await cksafe(event.group_id) else: safe = False x, err = await getSetuHigh(bot, not safe) if x == None: await stCome.finish(err) try: await stCome.send(unescape(x)) except: await stCome.send("呀,发送失败辣,。,")
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from nonebot.typing import Event from nonebot.plugin import on_message from nonebot.adapters.cqhttp import Bot test_message = on_message(state={"default": 1}) @test_message.handle() async def test_handler(bot: Bot, event: Event, state: dict): print("[*] Test Matcher Received:", event) state["event"] = event await bot.send_private_msg(message="Received", user_id=event.user_id) @test_message.receive() async def test_receive(bot: Bot, event: Event, state: dict): print("[*] Test Matcher Received next time:", event) print("[*] Current State:", state)
from costrule import check_white_list_all, check_white_list_group, only_master from nonebot import get_bots, get_driver, on_command, require from nonebot.adapters.cqhttp import Bot, Event from nonebot.adapters.cqhttp.message import Message from nonebot.adapters.cqhttp.event import GroupIncreaseNoticeEvent, GroupMessageEvent from nonebot.plugin import on_message, on_notice global memdic memdic = {} LogPath = os.path.join(os.getcwd(), 'DataBase', 'Json', 'datalog.json') StartTime = datetime.datetime.now() scheduler = require('nonebot_plugin_apscheduler').scheduler # 定义计划任务 water = on_command("water", priority=5, rule=check_white_list_all()) # 定义water查询命令 resetLog = on_command("resetLog", priority=5, rule=only_master()) # 定义手动重置模块 writeLog = on_message(rule=check_white_list_group(), priority=5) # 定义吹氵记录增加 addLog = on_notice(priority=5) # 定义群成员变动 async def get_water_list(groupID, bot): linedic = memdic[str(groupID)] findic = reversed( sorted(linedic.items(), key=lambda kv: (kv[1], kv[0]))) a = 0 pa = "-------氵怪排行榜-------" for elem in findic: UQID = elem[0] ts = elem[1] a = a+1 pa = pa + f"\n{a}.[CQ:at,qq={UQID}] 吹水{ts}次" if a == 5:
f'DatabaseError: {e.message}\n{SORRY}\n※请及时联系维护组', at_sender=True) except ClanBattleError as e: await bot.send(event, e.message, at_sender=True) except Exception as e: logger.exception(e) logger.error( f'{type(e)} occured when {func.__name__} handling message {event.message_id}.' ) await bot.send(event, f'Error: 机器人出现未预料的错误\n{SORRY}\n※请及时联系维护组', at_sender=True) sv_message = on_message(permission=MESSAGE, block=False, handlers=[_clanbattle_bus]) def cb_cmd(name, parser: ArgParser) -> Callable: if isinstance(name, str): name = (name, ) if not isinstance(name, Iterable): raise ValueError('`name` of cb_cmd must be `str` or `Iterable[str]`') names = map(lambda x: helper.normalize_str(x), name) def deco(func) -> Callable: for n in names: if n in _registry: logger.warning( f'出现重名命令:{func.__name__} 与 {_registry[n].__name__}命令名冲突')
from ATRI.utils.utils_times import countX from ATRI.utils.utils_yml import load_yaml from ATRI.utils.utils_ban import ban, unban from ATRI.utils.utils_error import errorRepo from ATRI.utils.utils_textcheck import Textcheck from ATRI.utils.utils_history import saveMessage from ATRI.utils.utils_request import request_api_text from ATRI.utils.utils_rule import check_banlist, check_switch CONFIG_PATH = Path('.') / 'config.yml' config = load_yaml(CONFIG_PATH)['bot'] master = config['superusers'] # 收集 bot 所在群的聊天记录 MessageSave = on_message() @MessageSave.handle() async def _(bot: Bot, event: Event, state: dict) -> None: user = str(event.user_id) group = str(event.group_id) message = str(event.message) message_id = str(event.id) if group == "None": saveMessage(message_id, message, user) else: saveMessage(message_id, message, user, group) logger.opt(colors=True).info(
from ATRI.utils.utils_times import countX from ATRI.utils.utils_rule import check_banlist from ATRI.utils.utils_request import request_get from .data_source import dec BILI_REPORT_FORMAT = """[{aid}] Info: Title: {title} bid: {bid} Viev: {view} Like: {like} Coin: {coin} Share: {share} Link: {aid_link} {bid_link}""" bilibiliRich = on_message(rule=check_banlist()) b_list = [] @bilibiliRich.handle() async def _(bot: Bot, event: Event, state: dict) -> None: global b_list user = event.user_id msg = str(event.message) # 防刷屏机制:回复次数达到五次自动忽略下一次 if countX(b_list, user) == 5: return if "qqdocurl" not in msg: try:
import json from config import masterList from costrule import check_white_list_all, only_master from nonebot import on_command from nonebot.adapters.cqhttp import Bot, Event from nonebot.adapters.cqhttp.message import Message from nonebot.adapters.cqhttp.event import PrivateMessageEvent from nonebot.plugin import on_message from nonebot.typing import T_State from PIL import Image, ImageDraw, ImageFont study = on_command("study", priority=5, rule=check_white_list_all()) # 定义study命令 lib_manage = on_command('lib_manage', priority=5, rule=only_master()) # 定义查询与删除 get_march = on_message(rule=check_white_list_all(), priority=5) StudyPath = os.path.join(os.getcwd(), 'DataBase', 'Json', 'studylib.json') with open(StudyPath, 'r', encoding="utf-8") as fr: studylib = json.load(fr) @study.handle() # study写入,需二次确认[private] async def handle_study(bot: Bot, event: Event, state: T_State): arg = str(event.get_message()).split() """ study写入传参 #study module(str) key(str) value(str) 至于<similar(int)>就先咕咕咕吧(别打我) 这次用dict写,可以用更多的符号 """ if len(arg) != 3: await study.finish('[传参错误]:参数数量不足或过多')
def isPixivURL() -> Rule: async def isPixivURL_(bot: "Bot", event: "Event", state: T_State) -> bool: if event.get_type() != "message": return False msg = str(event.get_message()) if re.findall("https://www.pixiv.net/artworks/(\d+)|illust_id=(\d+)", msg): return True return False return Rule(isPixivURL_) pixivURL = on_message(rule=isPixivURL()) @pixivURL.handle() async def pixivURL(bot: Bot, event: Event, state: dict): pid = re.findall("https://www.pixiv.net/artworks/(\d+)|illust_id=(\d+)", str(event.get_message())) if pid: pid = [x for x in pid[0] if x][0] await send(pid, event, bot) # pixiv = on_command(cmd="pixiv") pixiv = on_regex(pattern="^pixiv\ ") # 识别参数 并且给state 赋值
async def bool_recall_rep(bot: "Bot", event: "Event", state: T_State) -> bool: if not event.is_tome(): return False if event.get_type() != "message": return False msg_dict = event.dict() msg_id = msg_dict['raw_message'] id = re.findall('\[CQ\:reply\,id\=(-{0,1}\d+)\]', msg_id) if id: state["id"] = id[0] msgg = msg_id.split(" ")[-1] if msgg == "撤回": return True return False return Rule(bool_recall_rep) recall_rep = on_message(rule=test()) @recall_rep.handle() async def recall_rep(bot: Bot, event: Event, state: dict): msg_id = state['id'] try: await bot.delete_msg(message_id=msg_id, self_id=bot.self_id) except: await bot.send(message="撤回失败")
pic_map: Dict[str, str] = {} # 保存这个群的上一张色图 {"123456":"http://xxx"} async def check_pic(bot: Bot, event: MessageEvent, state: T_State) -> bool: if isinstance(event, MessageEvent): for msg in event.message: if msg.type == "image": url: str = msg.data["url"] state["url"] = url return True return False notice_pic = on_message(check_pic) @notice_pic.handle() async def handle_pic(bot: Bot, event: GroupMessageEvent, state: T_State): try: group_id: str = str(event.group_id) pic_map.update({group_id: state["url"]}) except AttributeError: pass previous = on_command("上一张图是什么", aliases={"上一张", "这是什么"}) @previous.handle()
from nonebot.adapters.cqhttp import Bot from nonebot.adapters.cqhttp.event import Event, GroupMessageEvent, PrivateMessageEvent from nonebot.adapters.cqhttp.message import Message from nonebot.plugin import on_message, require global conclution, picture_lib, check_api conclution, check_api = '', True PicPath = os.path.join(os.getcwd(), 'DataBase', 'Json', 'picture_lib.json') try: with open(PicPath, 'r', encoding="utf-8") as fr: picture_lib = json.load(fr) except: picture_lib = {} scheduler = require('nonebot_plugin_apscheduler').scheduler # 定义计划任务 repire_lib = on_message(priority=5, rule=only_reply()) get_pic = on_message(priority=5, rule=check_white_list_group()) @scheduler.scheduled_job('cron', day='1') # 每月一日重获tocken async def _get_token(): async with AsyncClient() as Client: host = 'https://aip.baidubce.com/oauth/2.0/token' PostData = { 'grant_type': 'client_credentials', 'client_id': baidu_client_id, 'client_secret': baidu_client_secret } get_data = await Client.post(host, data=PostData) result = get_data.json() access_token = result['access_token']
5.多图连搜 """ import re import os from nonebot.adapters.cqhttp import Bot from nonebot.adapters.cqhttp.event import (Event, GroupMessageEvent, PrivateMessageEvent) from nonebot.adapters.cqhttp.message import Message from nonebot.plugin import on_message from costrule import check_white_list_all, only_reply from httpx import AsyncClient from config import SauceNAO_api api_key = SauceNAO_api Reply_SearchPic = on_message(priority=5, rule=only_reply() & check_white_list_all(), block=True) @Reply_SearchPic.handle() async def _Reply_SearchPic(bot: Bot, event: Event): send_except_msg = (Message( f"[CQ:at,qq={event.get_user_id()}]你确定你给我的是一张图片?\n" "若持续出此报错,请按照以下步骤搜图:\n" '1.将图片逐张转发至Senrin\n' '2.回复需要搜索的图片并附上“搜图”')) if '搜图' in str(event.get_message()): search_list = [] result_list = [] send_msg_result = '搜图结果如下:\n' for _msg in event.reply.message: # type:ignore 初步处理数据
from nonebot.typing import T_State from nonebot.adapters.cqhttp import Bot, Event from .config import Config global_config = get_driver().config config = Config(**global_config.dict()) # Export something for other plugin # export = nonebot.export() # export.foo = "bar" # @export.xxx # def some_function(): # pass repeat_after_me = on_message(priority=10) @repeat_after_me.handle() async def _(bot: Bot, event: Event, state: T_State): # 开关检测,开则复述 message = event.get_message() message_type = str(event.dict()["message_type"]) # 来源判断 if message_type == "group": id = str(event.dict()["group_id"]) # message_type = "on_group" switch = (Path(".") / "apeiria_network" / "config" / "repeat" / "group" / "switch.json") re = Path( "."
from nonebot_adapter_gocq.exception import ActionFailed from src.common import Bot, MessageEvent, logger, BOTNAME, MessageSegment, RESPATH from src.common.rules import sv_sw, full_match from src.common.levelsystem import UserLevel, is_user, filter_users from src.utils import imgseg, DailyNumberLimiter from .ballot_fortune import query_fortune, draw_fortune, get_active_user plugin_name = '运势' plugin_usage = """[今日运势] 没日一抽,运气好的话当天可能出门被撞到异世界当美少女""" assets_folder = Path(RESPATH) / 'fortune' sticks = [i for i in assets_folder.glob('*.[jp][pn]*g')] fortune = on_message(rule=sv_sw(plugin_name, plugin_usage) & full_match( ('运势', '今日运势')), priority=2) @fortune.handle() async def check_fortune(bot: Bot, event: MessageEvent): name = event.sender.card if event.message_type == 'group' else event.sender.nickname dlmt = DailyNumberLimiter(event.user_id, func_name='运势', max_num=1) stick = query_fortune(event.user_id) rp = 0 # 如果抽中了特殊的签要发生一些事件 TODO:加入一些今天功能冷却减少之类的什么奖励吧 if dlmt.check(close_conn=False) or not stick: stick = choice(sticks) if dlmt.count == 0: if stick.name == '28.jpg': # 恋爱运,惩罚 rp = 1 elif stick.name == '27.jpg': # 凶,奖励
repeat_data = ujson.load(f) # 保存单个记录 @dataclass class Record: last_msg: str last_user_id: str repeat_count: int = 0 # 存储各个群的复读记录 records: Dict[str, Record] = {} # 复读!学大家说话!优先级最低 repeater = on_message(rule=is_banned(), priority=10) @repeater.handle() async def _(bot: Bot, event: Event, state: dict): msg = str(event.message) logger.info(msg) user_id = str(event.user_id) group = str(event.group_id) if group not in records: rec = Record(msg, user_id, 1) records[group] = rec return rec = records.get(group)
import os from nonebot.plugin import on_notice, on_message, require from nonebot.adapters.cqhttp import GroupRecallNoticeEvent, Bot, Message, FriendRecallNoticeEvent, PokeNotifyEvent, \ MessageEvent, MessageSegment from nonebot.adapters.cqhttp.event import Event, GroupMessageEvent from nonebot.rule import to_me from random import choice, randint poke = on_notice(rule=to_me()) recall = on_notice() flashimg = on_message() help = on_message(rule=to_me()) @poke.handle() async def _(bot: Bot, event: PokeNotifyEvent): # msg = choice([ # "你再戳!", "?再戳试试?", "别戳了别戳了再戳就坏了555", "我爪巴爪巴,球球别再戳了", "你戳你🐎呢?!", # "那...那里...那里不能戳...绝对...", "(。´・ω・)ん?", "有事恁叫我,别天天一个劲戳戳戳!", "欸很烦欸!你戳🔨呢", # "?", "差不多得了😅", "欺负咱这好吗?这不好", "我希望你耗子尾汁" # ]) file = "file:///{0}/src/data/voices/miko-daily-023.mp3".format(os.getcwd()) await poke.finish(MessageSegment.record(file)) @recall.handle() async def _(bot: Bot, event: GroupRecallNoticeEvent): mid = event.message_id meg = await bot.get_msg(message_id=mid) if event.user_id != event.self_id and 'type=flash,' not in meg['message']: re = 'Killer Queen! 第三の爆弾! Bite The Dust!\n{0}刚刚说了:\n' + meg['message']
if sv_on: sv_ls += "已开启 ✓" + '\n' + '\n'.join(map(diver_name, sv_on)) if sv_off: if sv_on: sv_ls += "\n———————\n" sv_ls += "已关闭 ✗" + '\n' + '\n'.join(map(diver_name, sv_off)) else: sv_ls = '\n'.join(map(diver_name, sub_usage)) usage += '发送[使用帮助 功能名]查看以下子功能说明\n———————\n' + sv_ls if not usage: usage = '此功能还未添加描述' await helper.finish(f">——<{name}>——<\n{usage}") about_bot = on_message(rule=full_match("关于Sanae-Bot")) @about_bot.handle() async def show_info(bot: Bot, event: MessageEvent): # TODO: 完善信息 if UserLevel(event.user_id).level > 3: frcode = get_hash_code(FRIENDREQUESTCODESALT, event.user_id) else: frcode = '<->' msg = link_res('sanae-bot.gif') + f'\nversion-{BOT_VERSION}\n' if event.message_type == 'group': msg += f'本群授权时间:<->\n本群授权期至:<->\n' msg += f'您的好友申请码:{frcode}' + '\n测试、反馈、交流群:708242151' await about_bot.finish(msg)
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]
raise IgnoredException('该群已在全局关闭服务') if event.get_type() in ('message', 'notice', 'request') and not User_Blocker( event.user_id).check_block(): raise IgnoredException('该用户在阻塞列表中') # if isinstance(event, PrivateMessageEvent) and event.user_id == event.self_id: # raise IgnoredException('由于当前版本gocq客户端的上报消息类型错误问题必须阻断的事件') # data = {} # for p in filter(lambda x: not (x.startswith('__') and x.endswith('__')), dir(event)): # data[p] = getattr(event, p) # event = PrivateMessageSentEvent(**data) connection_report = on_message(rule=full_match('status'), permission=SUPERUSER) @connection_report.handle() async def report_status(bot: Bot): bots_dict = get_bots() msg = f'{len(bots_dict)} connection(s):\n' + '\n'.join( [q for q in bots_dict]) await connection_report.send(msg) # store all subplugins manager_plugins = set() # load sub plugins manager_plugins |= load_plugins( str((Path(__file__).parent / "plugins").resolve()))
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from nonebot.rule import to_me from nonebot.typing import Event from nonebot.plugin import on_message from nonebot.adapters.cqhttp import Bot test_message = on_message(to_me(), state={"default": 1}) @test_message.handle() async def test_handler(bot: Bot, event: Event, state: dict): print("[*] Test Matcher Received:", event) state["event"] = event await bot.send(message="Received", event=event) @test_message.receive() async def test_receive(bot: Bot, event: Event, state: dict): print("[*] Test Matcher Received next time:", event) print("[*] Current State:", state)