async def msgDistributer(**kwargs): """ 根据player号分发消息 输入字典msg为源文本,typ标识其类型('E'表情,'I'图片文件目录,'P'普通文本) """ if 'msg' in kwargs and kwargs['msg']: if kwargs.get('typ', 'P') == 'E': seq = [Face(QQFaces[kwargs['msg']])] elif kwargs.get('typ', 'P') == 'I': f_n = randstr(8) with open(f_n, 'wb') as f: f.write(kwargs['msg']) seq = [Image.fromFileSystem(f_n)] # seq = [Image.fromFileSystem(kwargs['msg'])] else: seq = [Plain(kwargs['msg'])] if 'gp' in kwargs: await GLOBAL.app.sendGroupMessage(kwargs['gp'], seq) elif 'mem' in kwargs: await GLOBAL.app.sendFriendMessage(kwargs['mem'], seq) elif 'player' in kwargs: kwargs['player'] = int(kwargs['player']) if kwargs['player'] > 1 << 39: await GLOBAL.app.sendGroupMessage(kwargs['player'] - (1 << 39), seq) else: await GLOBAL.app.sendFriendMessage(kwargs['player'], seq)
async def CFProblemRender(g, cid, ti): FN = 'CF/%s.png' % cid print('在%f秒后渲染比赛' % ti + cid + '的问题图片') if cid in GLOBAL.CFRenderFlag or os.path.exists(FN): #有队列在做了 await asyncio.sleep(ti) if not os.path.exists(FN): await asyncio.sleep(20) await GLOBAL.app.sendGroupMessage(g, [Image.fromFileSystem(FN)]) else: GLOBAL.CFRenderFlag.add(cid) await asyncio.sleep(ti) base = 'https://codeforces.com/contest/' + cid + '/problems' l = renderHtml(base, FN) GLOBAL.CFRenderFlag.discard(ti) l.append(Image.fromFileSystem(FN)) await GLOBAL.app.sendGroupMessage(g, l)
def __validate_responses__(self, resps): valid_resps = [] for r in resps: if r.startswith(self.image_save_path): valid_resps.append(Image.fromFileSystem(r)) else: valid_resps.append(Plain(r)) return valid_resps
def 二维码生成器(*attrs, **kwargs): s = ' '.join(attrs) q = qrcode.make(s) fn = randstr(GLOBAL.randomStrLength) + 'tmpqrcode' + str(kwargs['mem'].id) q.save(fn) #threading.Thread(target=rmTmpFile).start() asyncio.ensure_future(rmTmpFile(fn), loop=None) return [Image.fromFileSystem(fn)]
async def event_gm(session: Session, message: MessageChain, friend: Friend): if message.toString().startswith("/image"): await session.sendFriendMessage(friend, [ Image.fromFileSystem( "E:\\Image\\00C49FCD-D8D9-4966-B2FC-F18F6220485E.jpg"), Plain(text="??") ])
def 爬LaTeX(*attrs, **kwargs): base = r'\dpi{150} \bg_white \large ' + ' '.join(attrs).replace( '+', '+') r = requests.get( 'https://latex.vimsky.com/test.image.latex.php?fmt=png&dl=0&val=' + urllib.parse.quote(urllib.parse.quote(base))) fn = f"tmpLaTeX{randstr(3)}.png" with open(fn, 'wb') as f: f.write(r.content) asyncio.ensure_future(rmTmpFile(fn)) return [Image.fromFileSystem(fn)]
def 优质解答生成器(*attrs,**kwargs): font = ImageFont.truetype('sarasa-gothic-ttf-0.12.5/sarasa-ui-tc-bold.ttf',25) nyaSrc = PImage.open('answer.jpg').convert('RGBA') layer2 = PImage.new('RGBA',nyaSrc.size,(255,255,255,0)) draw = ImageDraw.Draw(layer2) text = ' '.join(attrs) beginPixel = (50,120) draw.text(beginPixel,text,fill=(0,0,0,255),font=font) p = 'tmpAns' + randstr(GLOBAL.randomStrLength) +str(kwargs['mem'].id)+'.png' PImage.alpha_composite(nyaSrc,layer2).save(p) asyncio.ensure_future(rmTmpFile(p),loop=None) return [Image.fromFileSystem(p)]
def IPlay生成器(*attrs,**kwargs): font = ImageFont.truetype('sarasa-gothic-ttf-0.12.5/sarasa-ui-tc-bold.ttf',25) Src = PImage.open('IPlayRhythmGame.png').convert('RGBA') layer2 = PImage.new('RGBA',Src.size,(255,255,255,0)) draw = ImageDraw.Draw(layer2) text = ' '.join(attrs) beginPixel = (308,1004) draw.text(beginPixel,text,fill=(255,255,255,255),font=font) p = 'tmpIPlay' + randstr(GLOBAL.randomStrLength) +str(kwargs['mem'].id)+'.png' PImage.alpha_composite(Src,layer2).save(p) asyncio.ensure_future(rmTmpFile(p)) return [Image.fromFileSystem(p)]
def showClock(sender): clockMessage=[ At(target=sender), Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="如:选择表盘1\n"), Plain(text="表盘预览:") ] clockList = os.listdir(clockPreviewDist) clockList.sort(key=lambda x:int(x[:-4])) index=1 for i in clockList: clockMessage.append(Plain(text="\n%s."%index)) clockMessage.append(Image.fromFileSystem(clockPreviewDist+i)) index+=1 return clockMessage
def 希望工程(*attrs,**kwargs): font = ImageFont.truetype('sarasa-gothic-ttf-0.12.5/sarasa-ui-tc-bold.ttf',100) nyaSrc = PImage.open('wish.jpg').convert('RGBA') layer2 = PImage.new('RGBA',nyaSrc.size,(255,255,255,0)) draw = ImageDraw.Draw(layer2) text = attrs[0] beginPixel = (540-len(text)*50,900) if len(attrs)>1: r = int(attrs[1][:2],16) g = int(attrs[1][2:4],16) b = int(attrs[1][4:],16) draw.text(beginPixel,text,fill=(r,g,b,255),font=font) else: draw.text(beginPixel,text,fill=(0,0,0,255),font=font) p = 'tmpWish' + randstr(GLOBAL.randomStrLength) + str(kwargs['mem'].id)+'.png' PImage.alpha_composite(nyaSrc,layer2).save(p) asyncio.ensure_future(rmTmpFile(p),loop=None) return [Image.fromFileSystem(p)]
def get_response(self): if self.__handle_at_all__(): return self.responses if not self.command.chat_mode: bot = config['mirai_http_api']['qq'] if bot not in (at.target for at in self.ats): return self.responses if self.__handle_plain_text__(): return self.responses self.__handle_face__() self.__handle_image__() if not self.responses: rand_img = image_helper.get_rand_img( config['image']['not_understand']) return [Image.fromFileSystem(rand_img)] return self.responses
def get_setu(self, tags=None): if not tags or tags == "normalrank": classi = "normalrank" label = None elif tags.split(" ")[0] == "user": classi = "illustrator" label = tags.split(" ")[1] else: classi = "tag" label = tags self.check_tempfile_overflow() setu_path = pc.random_one_by_classfi(classi, label) if isinstance(setu_path, list): ret_msg = [] text_lis = [ "{0}({1})".format(user[0], user[1]) for user in setu_path ] text = "\n".join(text_lis) ret_msg = [Plain(text=text)] else: # setu_path="./default_save/75568889_p0.png" if not setu_path: return None ret_msg = [Image.fromFileSystem(setu_path)] # if os.path.getsize(setu_path)<4*1024*1024 and False: # #UPLOAD # # setu_url=self.upload_tuc(setu_path) # setu_url=self.jdtuc.upload(setu_path) # if not setu_url:return None # else: # # use akaisora.tech # setu_url=setu_path.replace("/var/www/html","http://akaisora.tech") # print(setu_url) return ret_msg
async def GMHandler(app: Mirai, group: Group, message: MessageChain): aat: At = message.getFirstComponent(At) replyFlag = 0 if aat is not None: if aat.target == Account.qq: aplain: Plain = message.getFirstComponent(Plain) replyFlag = 1 if aplain is None: plainToSend = Plain(text="还没有输入指令哦") else: atext = aplain.text if "谁" in atext: aimage: Image = message.getFirstComponent(Image) if aimage is None: plainToSend = Plain(text="没有收到图片呢,请在@我的同时发送图片") else: replyFlag = 2 utility.download_imgae(aimage.url) recg_face.recognize_face() else: plainToSend = Plain(text="兔兔目前还不会这个指令哟") if replyFlag == 1: await app.sendGroupMessage(group.id, [plainToSend]) elif replyFlag == 2: if recg_face.recg_res: plainToSend = [Plain(text=f"兔兔找到了{len(recg_face.reslist)}个人")] if len(recg_face.reslist) > 1: plainToSend.append(Plain(text="分别")) plainToSend.append(Plain(text="是:\n")) for name in recg_face.reslist: plainToSend.append(Plain(text=f"{name} ")) imageToSend = Image.fromFileSystem( f"{recg_face.res_face_path}/{recg_face.image_cnt}.jpg") await app.sendGroupMessage(group.id, plainToSend) await app.sendGroupMessage(group.id, [imageToSend]) else: plainToSend = Plain(text="兔兔没有找到人脸欸,换张照片试试吧") await app.sendGroupMessage(group.id, [plainToSend])
def printHelp(*attrs,**kwargs): if not attrs: l = [Plain('命令分类:\n')] l.append(Plain('\tAVG 正在开发的文字冒险游戏类\n')) l.append(Plain('\tGame 小游戏类\n')) l.append(Plain('\tString 字符串处理类\n')) l.append(Plain('\tFile 异步与文件读写类\n')) l.append(Plain('\tSpider 爬虫类\n')) l.append(Plain('\tTest 测试类(开发用\n')) l.append(Plain('\tGenerator 生成器类\n')) l.append(Plain('\tTranslate 翻译类\n')) l.append(Plain('\tMath 数学类\n')) l.append(Plain('输入#h <类名> 以查询分类下命令\n')) l.append(Plain('使用#h <命令名> 可以查询详细用法\n')) l.append(Plain('使用#h #abb可以查询缩写表\n')) else: if attrs[0] in shortMap: attrs = [shortMap[attrs[0]],*attrs[1:]] if attrs[0] in functionDescript: l=[Plain(text=functionDescript[attrs[0]])] elif attrs[0] in ('all','old'): l = [Plain(text='可用命令表:\n')] for k in functionMap: l.append(Plain(text='\t'+k+'\n')) l.append(Plain(text='使用#h 命令名(带井号)可以查询详细用法\n')) l.append(Plain(text='使用#h #abb可以查询缩写表\n')) l.append(Plain(text='注命令后需打空格,之后的参数如存在空格即以空格分开多个参数,如#qr 1 1 4 5 1 4\n')) l.append(Image.fromFileSystem('muzukashi.png')) elif attrs[0] in Classes: l = [Plain(text=f'分类:{attrs[0]}\n')] for k in Classes[attrs[0]]: l.append(Plain(text='\t'+k+'\n')) else: l = [Plain('【错误】参数不合法\n')] + printHelp() return l
def asobiSlidingPuzzle(*attrs,**kwargs): player = getPlayer(**kwargs) def find1(array): for p,i in enumerate(array): for q,j in enumerate(i): if j == 1: return p,q def splitImage(fn:str,n:int,array)->str: """ 根据传入的array将图片重组 array得是n*n的numpy.array对象 返回保存的文件的临时文件路径 array是1~n^2,注意不是从0开始 """ bg = PImage.open(fn).convert('RGBA') edge = min(bg.width,bg.height) cell = edge // n bg = bg.crop((0,0,edge,edge)) newbg = [] for i in range(n): # tmp = [] for j in range(n): newbg.append(bg.crop((i * cell, j * cell, (i + 1) * cell, (j + 1) * cell))) # newbg.append(tmp) dst = PImage.new('RGBA',(n*cell,n*cell)) for i in range(n): # tmp = [] for j in range(n): if array[i][j]!=1: dst.paste(newbg[int(array[i][j]-1)],(i * cell, j * cell, (i + 1) * cell, (j + 1) * cell)) sfn = 'tmp' + randstr(4) + '.png' dst.save(sfn) asyncio.ensure_future(rmTmpFile(sfn)) return sfn if not os.path.exists('SlidingPuzzle/'): os.mkdir('SlidingPuzzle/') if not os.path.exists(f'''SlidingPuzzle/{player}BG'''): shutil.copy('default.png',f'''SlidingPuzzle/{player}BG''') if not os.path.exists(f'''SlidingPuzzle/{player}.txt''') or attrs and attrs[0] == 'init': try: n=int(attrs[1]) if n not in range(2,7): return [Plain(text='为了宁的游戏体验,棋盘只能要2~6阶内的方阵')] except: n = 3 arr = [i for i in range(1,1+n*n)] random.shuffle(arr) tmp = copy.deepcopy(arr) tmp.remove(1) invs = calcinvs(tmp) k = arr.index(1) // n if n&1: while invs&1: random.shuffle(arr) tmp = copy.deepcopy(arr) tmp.remove(1) invs = calcinvs(tmp) else: while (invs^(k&1)) & 1: random.shuffle(arr) tmp = copy.deepcopy(arr) tmp.remove(1) invs = calcinvs(tmp) k = arr.index(1) // n print(arr) grids = numpy.array(arr) grids.resize(n,n) numpy.savetxt(f'''SlidingPuzzle/{player}.txt''',grids,fmt='%d') return [ Plain(f'移动拼图初始化完成\n{grids}'), Image.fromFileSystem(splitImage(f'''SlidingPuzzle/{player}BG''',n,grids)) ] grids = numpy.loadtxt(f'''SlidingPuzzle/{player}.txt''') n = len(grids) if attrs: if attrs[0] in ('下','S','s','shita'): x,y = find1(grids) if y>0: grids[x][y],grids[x][y-1] = grids[x][y-1],grids[x][y] elif attrs[0] in ('上','W','w','ue'): x,y = find1(grids) if y<3: grids[x][y],grids[x][y+1] = grids[x][y+1],grids[x][y] elif attrs[0] in ('右','D','d','migi'): x,y = find1(grids) if x>0: grids[x][y],grids[x-1][y] = grids[x-1][y],grids[x][y] elif attrs[0] in ('左','A','a','hidari'): x,y = find1(grids) if x<3: grids[x][y],grids[x+1][y] = grids[x+1][y],grids[x][y] elif attrs[0] in ('txt','t','T','文字'): return [Plain(f'{grids}')] elif attrs[0] in ('bg','changebackground','换图','换老婆'): if 'pic' in kwargs and kwargs['pic']: src = requests.get(kwargs['pic'].url).content with open(f'''SlidingPuzzle/{player}BG''','wb') as f: f.write(src) return [Plain('图片背景更新成功')] elif attrs[0] in ('快速模式','gamestart'): GLOBAL.QuickCalls[player] = [asobiSlidingPuzzle] return [Plain(text=random.choice(['老婆快速重组模式,退出请用bye']))] elif attrs[0].lower() in ('cancel','terminate','quit','exit','seeyou','bye','sayonara','sayounara','madane','yamero','停','关','やめろ'): del GLOBAL.QuickCalls[player] return [Plain(text=random.choice(['还是慢慢拼老婆吧']))] numpy.savetxt(f'''SlidingPuzzle/{player}.txt''',grids,fmt='%d') return [Image.fromFileSystem(splitImage(f'''SlidingPuzzle/{player}BG''',n,grids))]
async def Process(message,groupId,sender): responseCalled=getData("responseCalled") responseCalled+=1 #responseCalled计数 updateData(responseCalled,"response") # message预处理 messageText=message.toString() # setu功能 if messageText in setuCallText: setuCalled=getData("setuCalled") setuCalled+=1 #setuCalled计数 updateData(setuCalled,"setu") if not getSetting(groupId,"setu"): #本群禁止要setu forbiddenCount=getSetting(groupId,"forbiddenCount") forbiddenCount+=1 updateSetting(groupId,"forbiddenCount",forbiddenCount) record("setu","none",sender,groupId,False,"img") if forbiddenCount<=3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount<=6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount<=9: return [Plain(text="爬爬爬,天天脑子里都是些什么啊,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: if sender in blackList: #发送人在黑名单中 record("setu","none",sender,groupId,False,"img") return [ At(target=sender), Plain(text="要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!") ] if getSetting(groupId,"countLimit"): #如果有每分钟调用次数限制 if not getMemberPicStatus(groupId,sender): record("setu","none",sender,groupId,False,"img") return [Plain(text="你已达到限制,每分钟最多只能要%d张setu/real哦~\n歇会儿再来吧!"%getSetting(groupId,"limit"))] if getSetting(groupId,"setuLocal"): #是否为本地库 if getSetting(groupId,"imgLightning") and randomJudge(): record("setu","lightning",sender,groupId,False,"img") return "lightningPic" if getSetting(groupId,"r18"): dist=randomPic(setu18Dist) record("setu18",dist,sender,groupId,True,"img") else: dist=randomPic(setuDist) record("setu",dist,sender,groupId,True,"img") print("本地setu图片地址:",dist) return [Image.fromFileSystem(dist)] else: pass #因api变动不稳定,暂时不进行编写 # real功能 elif messageText=="real": realCalled=getData("realCalled") realCalled+=1 #realCalled计数 updateData(realCalled,"real") if not getSetting(groupId,"real"): #本群禁止要real forbiddenCount=getSetting(groupId,"forbiddenCount") forbiddenCount+=1 updateSetting(groupId,"forbiddenCount",forbiddenCount) record("real","none",sender,groupId,False,"img") if forbiddenCount<=3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount<=6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount<=9: return [Plain(text="爬爬爬,天天脑子里都是些什么啊,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: if sender in blackList: #发送人在黑名单中 record("real",dist,sender,groupId,False,"img") return [Plain(text="要要要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!")] if getSetting(groupId,"countLimit"): #如果有每分钟调用次数限制 if not getMemberPicStatus(groupId,sender): record("real","none",sender,groupId,False,"img") return [Plain(text="你已达到限制,每分钟最多只能要%d张setu/real哦~\n歇会儿再来吧!"%getSetting(groupId,"limit"))] if getSetting(groupId,"imgLightning") and randomJudge(): record("real","lightning",sender,groupId,False,"img") return "lightningPic" dist=randomPic(realDist) record("real",dist,sender,groupId,True,"img") print("本地real图片地址:",dist) return [Image.fromFileSystem(dist)] # bizhi功能 elif messageText=="bizhi": bizhiCalled=getData("bizhiCalled") bizhiCalled+=1 #bizhiCalled计数 updateData(bizhiCalled,"bizhi") if not getSetting(groupId,"bizhi"): #本群禁止要bizhi record("bizhi","none",sender,groupId,False,"img") return [Plain(text="bizhi功能被关闭了呐>^<,想打开的话联系下管理员呐~")] else: if sender in blackList: #发送人在黑名单中 record("bizhi",dist,sender,groupId,False,"img") return [Plain(text="要要要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!")] dist=randomPic(bizhiDist) print("本地bizhi图片地址:",dist) record("bizhi",dist,sender,groupId,True,"img") return [Image.fromFileSystem(dist)] # 批量pic功能 elif messageText[:5]=="setu*" or messageText[:5]=="real*": aim=messageText[:4] if aim=="setu": aimDist=setuDist else: aimDist=realDist if not ((getSetting(groupId,"setu") and aim=="setu") or (getSetting(groupId,"real") and aim=="real")): #本群禁止要setu forbiddenCount=getSetting(groupId,"forbiddenCount") forbiddenCount+=1 updateSetting(groupId,"forbiddenCount",forbiddenCount) record(messageText,"none",sender,groupId,False,"img") if forbiddenCount<=3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount<=6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount<=9: return [Plain(text="爬爬爬,天天脑子里都是些什么玩意儿,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: try: num=int(message.toString()[5:]) if aim=="setu": setuCalled=getData("setuCalled") setuCalled+=num updateData(setuCalled,"setu") else: realCalled=getData("realCalled") realCalled+=num updateData(realCalled,"real") if sender in getAdmin(groupId): if sender == HostQQ or num <= 5: picMsg=[] for i in range(num): # if setting[groupId]["setuLocal"]: dist=randomPic(aimDist) picMsg.append(Image.fromFileSystem(dist)) record("%s*%d"%(aim,num),dist,sender,groupId,True,"img") # else: # pass return picMsg else: record("%s*%d"%(aim,num),dist,sender,groupId,False,"img") return [Plain(text="管理最多也只能要5张呐~我可不会被轻易玩儿坏呢!!!!")] elif num <= 5: record("%s*%d"%(aim,num),"none",sender,groupId,False,"img") return [Plain(text="只有主人和管理员可以使用%s*num命令哦~你没有权限的呐~"%aim)] else: record("%s*%d"%(aim,num),"none",sender,groupId,False,"img") return [Plain(text="老色批,要那么多,给你🐎一拳,爬!")] except ValueError: return [Plain(text="命令错误!%s*后必须跟数字!"%aim)] # 搜图功能 elif messageText in searchCallText: if not getSetting(groupId,"search"): return [ At(target=sender), Plain(text="搜图功能关闭了呐~想要打开就联系机器人管理员吧~") ] setSearchReady(groupId,sender,True) return [ At(target=sender), Plain(text="请发送要搜索的图片呐~") ] elif message.hasComponent(Image) and getSetting(groupId,"search") and getSearchReady(groupId,sender): print("searching") img = message.getFirstComponent(Image) return searchImage(groupId,sender,img) # 图片预测功能 elif messageText=="这张图里是什么": if not getSetting(groupId,"imgPredict"): return [ At(target=sender), Plain(text="图片预测功能关闭了呐~想要打开就联系机器人管理员吧~") ] setPredictReady(groupId,sender,True) return [ At(target=sender), Plain(text="请发送要预测的图片呐(推荐真实图片呐)~") ] elif message.hasComponent(Image) and getSetting(groupId,"imgPredict") and getPredictReady(groupId,sender): print("predicting") img = message.getFirstComponent(Image) return predictImage(groupId,sender,img) # 黄图评价功能 elif messageText=="这张图涩吗": if not getSetting(groupId,"yellowPredict"): return [ At(target=sender), Plain(text="图片涩度评价功能关闭了呐~想要打开就联系机器人管理员吧~") ] setYellowPredictReady(groupId,sender,True) return [ At(target=sender), Plain(text="请发送要预测的图片呐~") ] elif message.hasComponent(Image) and getSetting(groupId,"yellowPredict") and getYellowPredictReady(groupId,sender): print("judging") img = message.getFirstComponent(Image) return judgeImageYellow(groupId,sender,img.url) # 笑话功能 elif "来点" in messageText and "笑话" in messageText: name=re.findall(r'来点(.*?)笑话',messageText,re.S) if name==[]: return "noneReply" else: record("joke","none",sender,groupId,True,"function") return getJoke(name[0]) # 获取时间功能(可选背景) elif messageText in timeCallText: clockCalled=getData("clockCalled") clockCalled+=1 updateData(clockCalled,"clock") if getClockChoice(groupId,sender)=="none": clockMessage=[ At(target=sender), Plain(text="你还没有选择表盘哦~快来选择一个吧~\n"), Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="如:选择表盘1\n"), Plain(text="表盘预览:") ] clockList = os.listdir(clockPreviewDist) clockList.sort(key=lambda x:int(x[:-4])) index=1 for i in clockList: clockMessage.append(Plain(text="\n%s."%index)) clockMessage.append(Image.fromFileSystem(clockPreviewDist+i)) index+=1 return clockMessage else: t = datetime.datetime.now() #目前时间 t = t.strftime("%H:%M") t = t.replace(":","") dist=timeDist+str(getClockChoice(groupId,sender))+"/%s.png"%t return [Image.fromFileSystem(dist)] # 选择表盘(获取时间功能) elif messageText[:4]=="选择表盘": if messageText=="选择表盘": return showClock(sender) else: code=messageText[4:] if code.isdigit() and int(code)<=int(getData("dialsCount")): recordClock(groupId,sender,int(code)) return[ Plain(text="已经选择了表盘%s呢!\n现在可以问我时间啦~"%code) ] else: return [ Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="再检查下有没有输错呢~\n") ] # 天气查询功能 elif "[At::target=%i] 天气"%BotQQ in messageText: weatherCalled=getData("weatherCalled") weatherCalled+=1 updateData(weatherCalled,"weather") return getWeather(message,sender) # 碧蓝航线wiki查询功能 elif "[At::target=%i] blhx:"%BotQQ in messageText: name=messageText[28:] return blhxWiki(sender,name) # 营销号生成器 elif "[At::target=%i] 营销号"%BotQQ in messageText: _,somebody,something,other_word=messageText.split('、') # print(something,somebody,other_word) return yingxiaohao(somebody,something,other_word) # 问你点儿事儿 elif "[At::target=%i] 问你点儿事儿:"%BotQQ in message.toString(): question=message.toString()[30:] question=parse.quote(question) return askSth(sender,question) #linux命令查询功能 elif "[At::target=%i] linux"%BotQQ in messageText: if ':' in messageText: messageText=messageText.replace(':',':') command=messageText.replace("[At::target=%i] linux:"%BotQQ,"") print("get linux:%s"%command) text=getLinuxExplanation(command) if text=="error!no command!": return [ At(target=sender), Plain(text="未搜索到命令%s!请检查拼写!"%command) ] else: return [ At(target=sender), Plain(text="%s:%s"%(command,text)) ] # 翻译功能 elif "[At::target=%i] "%BotQQ in messageText and "用" in messageText and "怎么说" in messageText: supportLanguage={"中文":"zh","英文":"en","日文":"jp","韩文":"kr","法文":"fr","西班牙文":"es","意大利文":"it","德文":"de","土耳其文":"tr","俄文":"ru","葡萄牙文":"pt","越南文":"vi","印度尼西亚文":"id","马来西亚文":"ms","泰文":"th"} tp=re.findall(r'\[At::target=\] (.*?)用(.*?)怎么说',messageText,re.S)[0] #target后面换成qqbot text=tp[0] target=tp[1] print("text:%s,target:%s"%(text,target)) source=textDetect(text.encode("utf-8")) if target not in supportLanguage.keys(): sL="" for i in supportLanguage.keys(): sL+=i sL+='、' return [ At(target=sender), Plain(text="目前只支持翻译到%s哦~\n要全字匹配哦~看看有没有打错呐~\n翻译格式:text用(目标语言)怎么说"%sL) ] target=supportLanguage[target] # print(target) return translate(groupId,sender,text,source,target) #设置处理 elif "[At::target=%i] setting."%BotQQ in messageText: command=messageText[16:] try: print(command) name,config,change=command.split('.') print(name,'-->'," config:",config,"set to",change) return settingProcess(groupId,sender,config,change) except ValueError: return [ At(target=sender), Plain(text="Command error! Use the '@bot command' command to query the commands you can use!") ] # 获取信息处理 elif "[At::target=%i] info."%BotQQ in messageText: command=messageText[16:] # try: print(command) info,check=command.split('.') print(info,'-->'," info:",check) return infoProcess(groupId,sender,check) # wiki处理 elif "[At::target=%i] wiki"%BotQQ in messageText: if ':' in messageText: messageText=messageText.replace(':',':') print(messageText) print("get wiki:%s"%messageText.replace("[At::target=%i] wiki"%BotQQ,"")) return wikiProcess(groupId,sender,messageText) # 添加管理员处理 elif "[At::target=%i] addAdmin"%BotQQ in messageText: target=int(re.findall(r'At::target=(.*?)]',message.toString()[19:],re.S)[0]) print("add admin:%d in group %d"%(target,groupId)) return addAdmin(groupId,target) # 回复@bot(normal,zuanLow,zuanHigh,rainbow) elif "[At::target=%i]"%BotQQ in messageText: if messageText.replace("[At::target=%d] "%BotQQ,"") in sleepMuteCallText and sender not in getAdmin(groupId): return "goodNight" elif messageText.replace("[At::target=%d] "%BotQQ,"") in muteAllCallText and sender==HostQQ: return "muteAll" elif messageText.replace("[At::target=%d] "%BotQQ,"") in unmuteAllCallText and sender==HostQQ: return "unmuteAll" elif sender == HostQQ and not getSetting(groupId,"speakMode")=="chat": return [ At(target=sender), Plain(text="诶嘿嘿,老公@我是要找人家玩嘛~纱雾这就来找你玩哟~") ] else: mode_now=getSetting(groupId,"speakMode") if not mode_now=="normal": if mode_now=="zuanHigh": text=requests.get(zuanHighSrc).text record("zuanHigh","none",sender,groupId,True,"function") elif mode_now=="zuanLow": text=requests.get(zuanLowSrc).text record("zuanLow","none",sender,groupId,True,"function") elif mode_now=="rainbow": text=requests.get(rainbowSrc).text record("rainbow","none",sender,groupId,True,"function") elif mode_now=="chat": if not len(messageText.replace("[At::target=%i] "%BotQQ,""))==0: text=getChatText(groupId,sender,str(messageText.replace("[At::target=%i] "%BotQQ,""))) record("chat","none",sender,groupId,True,"function") else: return "noneReply" return [ At(target=sender), Plain(text=text) ] return "noneReply"
async def good_night(self): rand_img = image_helper.get_rand_img(config['image']['good_night']) await self.app.sendGroupMessage(self.group, [Image.fromFileSystem(rand_img)])
def searchImage(groupId,sender,img): setSearchReady(groupId,sender,False) searchCount=getData("searchCount")+1 print(searchCount) updateData(searchCount,"search") dist="%s%s.png"%(searchDist,searchCount) img_content=requests.get(img.url).content image=IMG.open(BytesIO(img_content)) image.save(dist) #url for headers url = 'https://saucenao.com/search.php' #picture url picUrl = img.url #json requesting url url2 = f'https://saucenao.com/search.php?db=999&output_type=2&testmode=1&numres=1&url={picUrl}' #data for posting. data = { 'url' : picUrl, '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' : '?1', 'Referer' : url, 'Origin' : 'https://saucenao.com', 'Host' : 'saucenao.com' } page = requests.post(url, headers=headers, data=data) # html=page.text json_data = page.json() #print thumbnail URL. # print(json_data) # print(json_data['results'][0]['header']['thumbnail']) dist="M:\pixiv\Thumbnail\\%s.png"%searchCount response=requests.get(json_data['results'][0]['header']['thumbnail']) imgContent=response.content image=IMG.open(BytesIO(imgContent)) image.save(dist) similarity=json_data['results'][0]['header']['similarity'] try: pixiv_url=json_data['results'][0]['data']['ext_urls'][0] except KeyError: pixiv_url="None" if 'pixiv_id' not in json_data['results'][0]['data']: if 'source' not in json_data['results'][0]['data']: record("search",dist,sender,groupId,False,"img") return [Plain(text="8好意思~没有找到相似的图诶~")] else: try: creator=json_data['results'][0]['data']['creator'][0] except Exception: creator="Unknown!" record("search",dist,sender,groupId,True,"img") return [ At(target=sender), Plain(text="这个结果相似度很低诶。。。。要不你康康?\n"), Image.fromFileSystem(dist), Plain(text="\n相似度:%s%%\n"%(similarity)), Plain(text="原图地址:%s\n"%pixiv_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 [ At(target=sender), Image.fromFileSystem(dist), Plain(text="\n相似度:%s%%\n"%(similarity)), Plain(text="原图地址:%s\n"%pixiv_url), Plain(text="作品id:%s\n"%pixiv_id), Plain(text="作者名字:%s\n"%user_name), Plain(text="作者id:%s\n"%user_id) ]
async def Process(message, groupId, sender, memberList): responseCalled = getData("responseCalled") responseCalled += 1 #responseCalled计数 updateData(responseCalled, "response") if sender in blackList: #发送人在黑名单中 return "noneReply" # message预处理 messageText = message.toString() # setu功能 if messageText in setuCallText: if sender == 80000000: return [Plain(text="匿名请求已被屏蔽!做涩批就要光明正大!匿名算什么好汉!")] updateDragon(groupId, sender, "normal") updateUserCalled(groupId, sender, "setu", 1) setuCalled = getData("setuCalled") setuCalled += 1 #setuCalled计数 updateData(setuCalled, "setu") if not getSetting(groupId, "setu"): #本群禁止要setu forbiddenCount = getSetting(groupId, "forbiddenCount") forbiddenCount += 1 updateSetting(groupId, "forbiddenCount", forbiddenCount) record("setu", "none", sender, groupId, False, "img") if forbiddenCount <= 3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount <= 6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount <= 9: return [Plain(text="爬爬爬,天天脑子里都是些什么啊,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: # if sender in blackList: #发送人在黑名单中 # record("setu","none",sender,groupId,False,"img") # return [ # At(target=sender), # Plain(text="要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!") # ] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用setu功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] if getSetting(groupId, "countLimit"): #如果有每分钟调用次数限制 if not getMemberPicStatus(groupId, sender): record("setu", "none", sender, groupId, False, "img") return [ Plain(text="你已达到限制,每分钟最多只能要%d张setu/real哦~\n歇会儿再来吧!" % getSetting(groupId, "limit")) ] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用setu功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] if getSetting(groupId, "setuLocal"): #是否为本地库 if getSetting(groupId, "imgLightning") and randomJudge(): record("setu", "lightning", sender, groupId, False, "img") return "lightningPic" if getSetting(groupId, "r18"): dist = randomPic(setu18Dist) record("setu18", dist, sender, groupId, True, "img") else: dist = randomPic(setuDist) record("setu", dist, sender, groupId, True, "img") print("本地setu图片地址:", dist) return [Image.fromFileSystem(dist)] else: pass #因api变动不稳定,暂时不进行编写 # real功能 elif messageText == "real": if sender == 80000000: return [Plain(text="匿名请求已被屏蔽!做涩批就要光明正大!匿名算什么好汉!")] updateDragon(groupId, sender, "normal") updateUserCalled(groupId, sender, "real", 1) realCalled = getData("realCalled") realCalled += 1 #realCalled计数 updateData(realCalled, "real") if not getSetting(groupId, "real"): #本群禁止要real forbiddenCount = getSetting(groupId, "forbiddenCount") forbiddenCount += 1 updateSetting(groupId, "forbiddenCount", forbiddenCount) record("real", "none", sender, groupId, False, "img") if forbiddenCount <= 3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount <= 6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount <= 9: return [Plain(text="爬爬爬,天天脑子里都是些什么啊,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: # if sender in blackList: #发送人在黑名单中 # record("real",dist,sender,groupId,False,"img") # return [Plain(text="要要要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!")] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用real功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] if getSetting(groupId, "countLimit"): #如果有每分钟调用次数限制 if not getMemberPicStatus(groupId, sender): record("real", "none", sender, groupId, False, "img") return [ At(target=sender), Plain(text="你已达到限制,每分钟最多只能要%d张setu/real哦~\n歇会儿再来吧!" % getSetting(groupId, "limit")) ] if getSetting(groupId, "imgLightning") and randomJudge(): record("real", "lightning", sender, groupId, False, "img") return "lightningPic" dist = randomPic(realDist) record("real", dist, sender, groupId, True, "img") print("本地real图片地址:", dist) return [Image.fromFileSystem(dist)] # bizhi功能 elif messageText == "bizhi": bizhiCalled = getData("bizhiCalled") bizhiCalled += 1 #bizhiCalled计数 updateData(bizhiCalled, "bizhi") updateUserCalled(groupId, sender, "bizhi", 1) if not getSetting(groupId, "bizhi"): #本群禁止要bizhi record("bizhi", "none", sender, groupId, False, "img") return [Plain(text="bizhi功能被关闭了呐>^<,想打开的话联系下管理员呐~")] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用bizhi功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] # else: # if sender in blackList: #发送人在黑名单中 # record("bizhi",dist,sender,groupId,False,"img") # return [Plain(text="要要要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!")] dist = randomPic(bizhiDist) print("本地bizhi图片地址:", dist) record("bizhi", dist, sender, groupId, True, "img") return [Image.fromFileSystem(dist)] # 批量pic功能 elif messageText[:5] == "setu*" or messageText[:5] == "real*": aim = messageText[:4] if aim == "setu": aimDist = setuDist else: aimDist = realDist if not ((getSetting(groupId, "setu") and aim == "setu") or (getSetting(groupId, "real") and aim == "real")): #本群禁止要setu forbiddenCount = getSetting(groupId, "forbiddenCount") forbiddenCount += 1 updateSetting(groupId, "forbiddenCount", forbiddenCount) record(messageText, "none", sender, groupId, False, "img") if forbiddenCount <= 3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount <= 6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount <= 9: return [Plain(text="爬爬爬,天天脑子里都是些什么玩意儿,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: try: num = int(message.toString()[5:]) if sender in getAdmin(groupId): if sender == HostQQ or num <= 5: if aim == "setu": setuCalled = getData("setuCalled") setuCalled += num updateData(setuCalled, "setu") else: realCalled = getData("realCalled") realCalled += num updateData(realCalled, "real") picMsg = ["pic*"] for i in range(num): # if setting[groupId]["setuLocal"]: dist = randomPic(aimDist) picMsg.append(Image.fromFileSystem(dist)) record("%s*%d" % (aim, num), dist, sender, groupId, True, "img") # else: # pass return picMsg else: record("%s*%d" % (aim, num), "none", sender, groupId, False, "img") return [Plain(text="管理最多也只能要5张呐~我可不会被轻易玩儿坏呢!!!!")] elif num <= 5: record("%s*%d" % (aim, num), "none", sender, groupId, False, "img") return [Plain(text="只有主人和管理员可以使用%s*num命令哦~你没有权限的呐~" % aim)] else: record("%s*%d" % (aim, num), "none", sender, groupId, False, "img") return [Plain(text="不是管理员你要你🐎呢?老色批!还要那么多?给你🐎一拳,给爷爬!")] except ValueError: return [Plain(text="命令错误!%s*后必须跟数字!" % aim)] # 搜图功能 elif messageText in searchCallText: if not getSetting(groupId, "search"): return [At(target=sender), Plain(text="搜图功能关闭了呐~想要打开就联系机器人管理员吧~")] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用搜图功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] setReady(groupId, sender, True, "searchReady") return [At(target=sender), Plain(text="请发送要搜索的图片呐~")] elif message.hasComponent(Image) and getSetting( groupId, "search") and getReady(groupId, sender, "searchReady"): print("searching") img = message.getFirstComponent(Image) return searchImage(groupId, sender, img) # 图片预测功能 elif messageText == "这张图里是什么": if not getSetting(groupId, "imgPredict"): return [ At(target=sender), Plain(text="图片预测功能关闭了呐~想要打开就联系机器人管理员吧~") ] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用图片预测功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] setReady(groupId, sender, True, "PredictReady") return [At(target=sender), Plain(text="请发送要预测的图片呐(推荐真实图片呐)~")] elif message.hasComponent(Image) and getSetting( groupId, "imgPredict") and getReady(groupId, sender, "predictReady"): print("predicting") updateUserCalled(groupId, sender, "imgPredict", 1) img = message.getFirstComponent(Image) return predictImage(groupId, sender, img) # 黄图评价功能 elif messageText == "这张图涩吗": if not getSetting(groupId, "yellowPredict"): return [ At(target=sender), Plain(text="图片涩度评价功能关闭了呐~想要打开就联系机器人管理员吧~") ] if getSetting(groupId, "tribute") and not getTributeInfo( sender, "VIP"): #是否已完成上贡 return [ At(target=sender), Plain(text="啊嘞嘞~你还不是VIP哦~不能使用涩度评价功能呐~\n"), Plain(text="快来完成每月指标吧~\n"), Plain(text="群内发送'开始上贡'即可开始发送图片哦~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] setReady(groupId, sender, True, "yellowPredictReady") return [At(target=sender), Plain(text="请发送要预测的图片呐~")] elif message.hasComponent(Image) and getSetting( groupId, "yellowPredict") and getReady(groupId, sender, "yellowPredictReady"): print("judging") updateUserCalled(groupId, sender, "yellowPredict", 1) img = message.getFirstComponent(Image) return judgeImageYellow(groupId, sender, img.url, yellowJudgeDist) # 上贡图片Judge elif message.hasComponent(Image) and getSetting( groupId, "tribute") and getReady(groupId, sender, "tributeReady"): # setReady(groupId,sender,False,"tributeready") print("judging") img = message.getFirstComponent(Image) result = judgeImageYellow(groupId, sender, img.url, tributeDist) Normal = float(re.findall(r'Normal :(.*?)%', result[2].text)[0]) Hot = float(re.findall(r'Hot :(.*?)%', result[3].text)[0]) Sexy = float(re.findall(r'Sexy :(.*?)%', result[4].text)[0]) Total = float(re.findall(r'Total :(.*?)%', result[5].text)[0]) if Normal <= 55 or Hot > 50 or Sexy > 50 or Total > 20: code = getData("searchCount") hammRes = imgSimilarJudge( imgHash("%s%d.png" % (tributeDist, code)), "tribute", 3) if hammRes[0]: removedFile = "%s%d.png" % (tributeDist, code) shutil.move(removedFile, tributeSimilarDist) return [ "上贡", At(target=sender), Plain(text="\n有相似图片在tribute图库中呐~\n"), Plain(text="汉明距离%d\n" % hammRes[1]), Plain(text="再找些别的图吧~") ] else: hammRes = imgSimilarJudge( imgHash("%s%d.png" % (tributeDist, code)), "setu", 3) if hammRes[0]: removedFile = "%s%d.png" % (tributeDist, code) shutil.move(removedFile, tributeSimilarDist) return [ "上贡", At(target=sender), Plain(text="\n有相似图片在setu图库中呐~\n"), Plain(text="汉明距离%d\n" % hammRes[1]), Plain(text="再找些别的图吧~") ] else: hammRes = imgSimilarJudge( imgHash("%s%d.png" % (tributeDist, code)), "setu18", 3) if hammRes[0]: removedFile = "%s%d.png" % (tributeDist, code) shutil.move(removedFile, tributeSimilarDist) return [ "上贡", At(target=sender), Plain(text="\n有相似图片在setu18图库中呐~\n"), Plain(text="汉明距离%d\n" % hammRes[1]), Plain(text="再找些别的图吧~") ] insertHash("%s%d.png" % (tributeDist, code), imgHash("%s%d.png" % (tributeDist, code)), "tribute") record("tribute accepted", "%s%d.png" % (tributeDist, code), sender, groupId, 1, "img") if int(getTributeInfo(sender, "tributeCount")) + 1 >= int( getSetting(groupId, "tributeQuantity")): setTributeInfo(sender, getTributeInfo(sender, "tributeCount") + 1, "tributeCount") now = datetime.datetime.now() end = now + relativedelta(months=+1) now = now.strftime("%Y-%m-%d %H:%M:%S") end = end.strftime("%Y-%m-%d %H:%M:%S") setTributeInfo(sender, now, "startTime") setTributeInfo(sender, end, "endTime") setTributeInfo(sender, True, "VIP") setReady(groupId, sender, False, "tributeready") return [ "上贡", At(target=sender), Plain(text="恭喜~这张图通过了测试呐~\n"), Plain(text="本月目标%d张,现在已经传了%d张呐~\n" % (getSetting(groupId, "tributeQuantity"), getTributeInfo(sender, "tributeCount"))), Plain(text="你已获得VIP身份辣~\n"), Plain(text="VIP从现在开始到%s哦" % end) ] else: setTributeInfo(sender, getTributeInfo(sender, "tributeCount") + 1, "tributeCount") return [ "上贡", At(target=sender), Plain(text="恭喜~这张图通过了测试呐~\n"), Plain(text="本月目标%d张,现在已经传了%d张呐~\n" % (getSetting(groupId, "tributeQuantity"), getTributeInfo(sender, "tributeCount"))), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] else: code = getData("searchCount") insertHash("%s%d.png" % (tributeDist, code), imgHash("%s%d.png" % (tributeDist, code)), "tribute") removedFile = "%s%d.png" % (tributeDist, code) shutil.move(removedFile, tributeDelDist) record("tribute not accepted", "%s%d.png" % (tributeDelDist, code), sender, groupId, 1, "img") return [ "上贡", At(target=sender), Plain(text="很遗憾,这张图没有达标呢~\n"), Plain("本图评价结果:\n"), result[2], result[3], result[4], result[5], Plain(text="\n评判标准为:\n"), Plain(text="Normal<=55 or Hot>50 or Sexy>50 or Total>20\n"), Plain(text="再找些别的图吧~\n"), Plain(text="群内发送'停止上贡'即可停止发送图片哦~") ] # 笑话功能 elif "来点" in messageText and "笑话" in messageText: jokeDict = { "苏联": "soviet", "法国": "french", "法兰西": "french", "美国": "america", "美利坚": "america" } name = re.findall(r'来点(.*?)笑话', messageText, re.S) if name == ['']: return [At(target=sender), Plain(text="来点儿啥笑话啊,你又不告诉人家!哼!")] elif name[0] in jokeDict.keys(): record("joke", "none", sender, groupId, True, "function") return getKeyJoke(jokeDict[name[0]]) else: record("joke", "none", sender, groupId, True, "function") return getJoke(name[0]) # 群语录功能 celebrityQuotes elif messageText == "群语录": return getCelebrityQuotes(groupId, memberList, "none", "random") # 群语录精准迫害功能 elif "来点" in messageText and "语录" in messageText: name = re.findall(r'来点(.*?)语录', messageText, re.S) if name == []: return "noneReply" else: record("quotes", "none", sender, groupId, True, "function") return getCelebrityQuotes(groupId, memberList, name, "select") # 网抑云 elif messageText == "网抑云" or messageText == "wyy": return getWyy() # 群友平安 elif messageText == "平安": return safe(groupId, memberList) # 历史上的今天 elif messageText == "历史上的今天": return getHistoryToday() # 开始上贡 elif messageText == "开始上贡": if not getSetting(groupId, "tribute"): return [At(target=sender), Plain(text="本群未开启上贡功能哦~")] if int(getTributeInfo(sender, "tributeCount")) >= int( getSetting(groupId, "tributeQuantity")): setReady(groupId, sender, False, "tributeready") return [ At(target=sender), Plain(text="你这个月已经发够%s张符合标准的图了呐~可以不用发啦~" % getSetting(groupId, "tributeQuantity")) ] else: setReady(groupId, sender, True, "tributeready") return [ At(target=sender), Plain(text="现在可以发图啦~本月目标%d张,现在已经传了%d张呐~" % (getSetting(groupId, "tributeQuantity"), getTributeInfo(sender, "tributeCount"))) ] # 停止上贡 elif messageText == "停止上贡": if not getSetting(groupId, "tribute"): return [At(target=sender), Plain(text="本群未开启上贡功能哦~")] setReady(groupId, sender, False, "tributeready") return [ At(target=sender), Plain(text="上贡暂停啦~本月目标%d张,现在已经传了%d张呐~" % (getSetting(groupId, "tributeQuantity"), getTributeInfo(sender, "tributeCount"))) ] # 获取时间功能(可选背景) elif messageText in timeCallText: clockCalled = getData("clockCalled") clockCalled += 1 updateData(clockCalled, "clock") if getClockChoice(groupId, sender) == "none": clockMessage = [ At(target=sender), Plain(text="你还没有选择表盘哦~快来选择一个吧~\n"), Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="如:选择表盘1\n"), Plain(text="表盘预览:") ] clockList = os.listdir(clockPreviewDist) clockList.sort(key=lambda x: int(x[:-4])) index = 1 for i in clockList: clockMessage.append(Plain(text="\n%s." % index)) clockMessage.append(Image.fromFileSystem(clockPreviewDist + i)) index += 1 return clockMessage else: t = datetime.datetime.now() #目前时间 t = t.strftime("%H:%M") t = t.replace(":", "") dist = timeDist + str(getClockChoice(groupId, sender)) + "/%s.png" % t return [Image.fromFileSystem(dist)] # 选择表盘(获取时间功能) elif messageText[:4] == "选择表盘": if messageText == "选择表盘": return showClock(sender) else: code = messageText[4:] if code.isdigit() and int(code) <= int(getData("dialsCount")): recordClock(groupId, sender, int(code)) return [Plain(text="已经选择了表盘%s呢!\n现在可以问我时间啦~" % code)] else: return [ Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="再检查下有没有输错呢~\n") ] # 天气查询功能 elif "[At::target=%i] 天气" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) weatherCalled = getData("weatherCalled") weatherCalled += 1 updateData(weatherCalled, "weather") return getWeather(message, sender) # 碧蓝航线wiki查询功能 elif "[At::target=%i] blhx:" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) name = messageText[28:] return blhxWiki(sender, name) # 营销号生成器 elif "[At::target=%i] 营销号" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) _, somebody, something, other_word = messageText.split('、') # print(something,somebody,other_word) return yingxiaohao(somebody, something, other_word) # 问你点儿事儿 elif "[At::target=%i] 问你点儿事儿:" % BotQQ in message.toString(): updateUserCalled(groupId, sender, "at", 1) question = message.toString()[30:] question = parse.quote(question) return askSth(sender, question) # myInfo功能 elif "[At::target=%i] myInfo" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) return getUserCalled(groupId, sender, memberList) # lspRank功能 elif "[At::target=%i] rank" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) return getRank(groupId, memberList) # linux命令查询功能 elif "[At::target=%i] linux" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) if ':' in messageText: messageText = messageText.replace(':', ':') command = messageText.replace("[At::target=%i] linux:" % BotQQ, "") print("get linux:%s" % command) text = getLinuxExplanation(command) if text == "error!no command!": return [At(target=sender), Plain(text="未搜索到命令%s!请检查拼写!" % command)] else: return [At(target=sender), Plain(text="%s:%s" % (command, text))] # 翻译功能 elif "[At::target=%i] " % BotQQ in messageText and "用" in messageText and "怎么说" in messageText: updateUserCalled(groupId, sender, "at", 1) supportLanguage = { "中文": "zh", "英文": "en", "日文": "jp", "韩文": "kr", "法文": "fr", "西班牙文": "es", "意大利文": "it", "德文": "de", "土耳其文": "tr", "俄文": "ru", "葡萄牙文": "pt", "越南文": "vi", "印度尼西亚文": "id", "马来西亚文": "ms", "泰文": "th" } tp = re.findall(r'\] (.*?)用(.*?)怎么说', messageText, re.S)[0] text = tp[0] target = tp[1] print("text:%s,target:%s" % (text, target)) source = textDetect(text.encode("utf-8")) if target not in supportLanguage.keys(): sL = "" for i in supportLanguage.keys(): sL += i sL += '、' return [ At(target=sender), Plain( text="目前只支持翻译到%s哦~\n要全字匹配哦~看看有没有打错呐~\n翻译格式:text用(目标语言)怎么说" % sL) ] target = supportLanguage[target] # print(target) return translate(groupId, sender, text, source, target) # 设置处理 elif "[At::target=%i] setting." % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) command = messageText[16:] try: print(command) name, config, change = command.split('.') print(name, '-->', " config:", config, "set to", change) return settingProcess(groupId, sender, config, change) except ValueError: return [ At(target=sender), Plain( text= "Command error! Use the '@bot command' command to query the commands you can use!" ) ] # 获取信息处理 elif "[At::target=%i] info." % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) command = messageText[16:] # try: print(command) info, check = command.split('.') print(info, '-->', " info:", check) return infoProcess(groupId, sender, check) # wiki处理 elif "[At::target=%i] wiki" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) if ':' in messageText: messageText = messageText.replace(':', ':') print(messageText) print("get wiki:%s" % messageText.replace("[At::target=%i] wiki" % BotQQ, "")) return wikiProcess(groupId, sender, messageText) # 添加群语录处理 @bot func.addQuote.content.target elif "[At::target=%i] func.addQuote." % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) if message.hasComponent(Image): try: _, func, target, img = messageText.split(".") quotesCount = getData("quotesCount") + 1 print(quotesCount) updateData(quotesCount, "quotes") dist = "%s%s.png" % (quotesDist, quotesCount) print(dist) img = message.getFirstComponent(Image) img_content = requests.get(img.url).content image = IMG.open(BytesIO(img_content)) image.save(dist) return funcProcess(groupId, sender, func, pymysql.escape_string(dist), target, "img") except Exception: pass else: try: _, func, content, target = messageText.split(".") return funcProcess(groupId, sender, func, content, target, "text") except Exception: pass # 添加别名处理 @bot func.addQuote.content.target elif "[At::target=%i] func.addNickname." % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) try: _, func, nickname, target = messageText.split(".") return funcProcess(groupId, sender, func, nickname, target, "nickname") except Exception: pass # 添加管理员处理 elif "[At::target=%i] addAdmin" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) target = int( re.findall(r'At::target=(.*?)]', message.toString()[19:], re.S)[0]) print("add admin:%d in group %d" % (target, groupId)) return addAdmin(groupId, target) # 删除管理员处理 elif "[At::target=%i] deleteAdmin" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) target = int( re.findall(r'At::target=(.*?)]', message.toString()[19:], re.S)[0]) print("delete admin:%d in group %d" % (target, groupId)) return deleteAdmin(groupId, target) # 加入黑名单处理 elif "[At::target=%i] addBlacklist" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) target = int( re.findall(r'At::target=(.*?)]', message.toString()[19:], re.S)[0]) if target in blackList: return [ Plain(text="%s is already in the blacklist") % qq2name(memberList, target) ] else: blackList.append(target) print("%s is added to the blacklist" % qq2name(memberList, target)) return addToBlacklist(target) # 移出黑名单处理 elif "[At::target=%i] removeBlacklist" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) target = int( re.findall(r'At::target=(.*?)]', messageText[19:], re.S)[0]) if target not in blackList: return [ Plain(text="%s is not in the blacklist originally") % qq2name(memberList, target) ] else: blackList.remove(target) print("%s is removed from the blacklist" % qq2name(memberList, target)) return removeFromBlacklist(target) # 添加监听处理 elif "[At::target=%i] addListen" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) target = int( re.findall(r'At::target=(.*?)]', message.toString()[19:], re.S)[0]) print("add listen:%d in group %d" % (target, groupId)) Msg = addListen(groupId, target) Msg.insert(0, "addListen.%d.%d" % (groupId, target)) return Msg # 获取疫情统计 elif messageText == "疫情" or messageText == "疫情统计": return [LightApp(getEpidemic())] # 点歌 elif messageText[:3] == "点歌 ": if getSetting(groupId, "music") != "off": target = messageText[3:] updateUserCalled(groupId, sender, "songOrder", 1) return [LightApp(songOrder(target))] else: return [At(target=sender), Plain(text="点歌功能关闭了呐~想要打开就去找主人吧~")] # 微博热搜 elif messageText == "weibo" or messageText == "微博" or messageText == "微博热搜": return getWeiboHot() # 超度 elif "超度" in messageText and sender == HostQQ: target = int(re.findall(r'\[At::target=(.*?)\]', messageText, re.S)[0]) return [At(target=target), Plain(text=chaodu)] # 添加订阅检查 elif messageText[:7] == "添加B站订阅 ": target = messageText.replace("添加B站订阅 ", "") status = getBilibiliRoomInfo(target) if status[0]: return [ At(target=sender), Plain(text="\n你确定要添加直播间%s?\n" % target), Plain(text="--------------------------------\n"), Plain(text="该直播间信息如下:\n"), Plain(text="房间名:%s\n" % status[2]), Plain(text="主播名:%s\n" % status[3]), Plain(text="主播种类:%s\n" % status[4]), Plain(text="主播区域:%s\n" % status[5]), Plain(text="房间链接:%s\n" % status[6]), Plain(text="--------------------------------\n"), Plain(text="确认是此主播嘛~\n如果确认的话发送\n'确定添加B站订阅 %s'\n就可以添加订阅啦~" % target) ] else: return [At(target=sender), Plain(text="\n直播间号错误!请检查后重新发送!")] # 添加订阅 elif messageText[:9] == "确定添加B站订阅 ": target = messageText.replace("确定添加B站订阅 ", "") status = getBilibiliRoomInfo(target) return addSubscribe(groupId, sender, target, "bilibili") # 回复@bot(normal,zuanLow,zuanHigh,rainbow) elif "[At::target=%i]" % BotQQ in messageText: updateUserCalled(groupId, sender, "at", 1) if messageText.replace( "[At::target=%d] " % BotQQ, "") in sleepMuteCallText and sender not in getAdmin(groupId): return "goodNight" elif messageText.replace("[At::target=%d] " % BotQQ, "") in muteAllCallText and sender == HostQQ: return "muteAll" elif messageText.replace("[At::target=%d] " % BotQQ, "") in unmuteAllCallText and sender == HostQQ: return "unmuteAll" elif sender == HostQQ and not getSetting(groupId, "speakMode") == "chat": return [At(target=sender), Plain(text="诶嘿嘿,老公我来啦~")] else: mode_now = getSetting(groupId, "speakMode") if not mode_now == "normal": if mode_now == "zuanHigh": text = requests.get(zuanHighSrc).text record("zuanHigh", "none", sender, groupId, True, "function") elif mode_now == "zuanLow": text = requests.get(zuanLowSrc).text record("zuanLow", "none", sender, groupId, True, "function") elif mode_now == "rainbow": text = requests.get(rainbowSrc).text record("rainbow", "none", sender, groupId, True, "function") elif mode_now == "chat": if not len( messageText.replace("[At::target=%i] " % BotQQ, "")) == 0: text = getChatText( groupId, sender, str( messageText.replace("[At::target=%i] " % BotQQ, ""))) if text == "": text = "我不知道怎么回答呐~抱歉哦~" record("chat", "none", sender, groupId, True, "function") else: return "noneReply" return [At(target=sender), Plain(text=text)] return "noneReply"
def 爬OIWiki(*attrs, **kwargs): lnk = 'https://oi-wiki.org/' if len(attrs): query = ' '.join(attrs) plnk = 'https://search.oi-wiki.org:8443/?s=' + query j = json.loads(requests.get(plnk).text) ostr = [Plain(text='找到了%d个类似的东西\n' % len(j))] if len(j): c = j[0] ostr.append(Plain(text='直接把%s扔给你了\n' % c['title'])) suflnk = c['url'] # print(c) # print(suflnk) else: ostr.append(Plain(text='无结果')) return ostr else: ostr = [] if random.choice([True, False]): r = requests.get(lnk, headers=GLOBAL.OIWikiHeaders) r.encoding = 'utf-8' s = BeautifulSoup(r.text, 'html.parser') res = s.find('nav', attrs={'data-md-component': 'tabs'}) hdir = random.choice(res('a')[2:-2]) subRes = s.find('label', string=hdir.string, attrs={'class': 'md-nav__link'}) hd2 = random.choice( list(subRes.next_siblings)[1]('li', attrs={ 'class': 'md-nav__item' })) suflnk = hd2.a['href'] else: lnk = 'https://ctf-wiki.github.io/ctf-wiki/' r = requests.get(lnk, headers=GLOBAL.OIWikiHeaders) r.encoding = 'utf-8' s = BeautifulSoup(r.text, 'html.parser') res = s.find('nav', attrs={'data-md-component': 'tabs'}) hdir = random.choice(res('a')[1:]) subRes = [ i for i in s('label', attrs={ 'class': 'md-nav__link', 'for': re.compile('nav-[0-9]*$') }) if hdir.string.strip() in i.text ][0] hd2 = random.choice( list(subRes.next_siblings)[1]('li', attrs={ 'class': 'md-nav__item' })) suflnk = hd2.a['href'] url = lnk + suflnk print(url) save_fn = randstr(GLOBAL.randomStrLength) + "tmpLearn" + str( kwargs['gp'].id) + '.png' ostr += renderHtml(url, save_fn) asyncio.ensure_future(rmTmpFile(save_fn), loop=None) ostr.append(Image.fromFileSystem(save_fn)) return ostr
async def Process(message, groupId, sender): responseCalled = getData("responseCalled") responseCalled += 1 #responseCalled计数 updateData(responseCalled, "response") #message预处理 messageText = message.toString() #setu功能 if messageText in setuCallText: setuCalled = getData("setuCalled") setuCalled += 1 #setuCalled计数 updateData(setuCalled, "setu") if not getSetting(groupId, "setu"): #本群禁止要setu forbiddenCount = getSetting(groupId, "forbiddenCount") forbiddenCount += 1 updateSetting(groupId, "forbiddenCount", forbiddenCount) record("setu", "none", sender, groupId, False, "img") if forbiddenCount <= 3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount <= 6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount <= 9: return [Plain(text="爬爬爬,天天脑子里都是些什么啊,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: if sender in blackList: #发送人在黑名单中 record("setu", "none", sender, groupId, False, "img") return [ At(target=sender), Plain(text="要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!") ] if getSetting(groupId, "countLimit"): #如果有每分钟调用次数限制 if not getMemberPicStatus(groupId, sender): record("setu", "none", sender, groupId, False, "img") return [ Plain(text="你已达到限制,每分钟最多只能要%d张setu/real哦~\n歇会儿再来吧!" % getSetting(groupId, "limit")) ] if getSetting(groupId, "setuLocal"): #是否为本地库 if getSetting(groupId, "r18"): dist = randomPic(setu18Dist) record("setu18", dist, sender, groupId, True, "img") else: dist = randomPic(setuDist) record("setu", dist, sender, groupId, True, "img") print("本地setu图片地址:", dist) return [Image.fromFileSystem(dist)] else: pass #因api变动不稳定,暂时不进行编写 #real功能 elif messageText == "real": realCalled = getData("realCalled") realCalled += 1 #realCalled计数 updateData(realCalled, "real") if not getSetting(groupId, "real"): #本群禁止要real forbiddenCount = getSetting(groupId, "forbiddenCount") forbiddenCount += 1 updateSetting(groupId, "forbiddenCount", forbiddenCount) record("real", "none", sender, groupId, False, "img") if forbiddenCount <= 3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount <= 6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount <= 9: return [Plain(text="爬爬爬,天天脑子里都是些什么啊,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: if sender in blackList: #发送人在黑名单中 record("real", dist, sender, groupId, False, "img") return [ Plain(text="要要要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!") ] if getSetting(groupId, "countLimit"): #如果有每分钟调用次数限制 if not getMemberPicStatus(groupId, sender): record("real", "none", sender, groupId, False, "img") return [ Plain(text="你已达到限制,每分钟最多只能要%d张setu/real哦~\n歇会儿再来吧!" % getSetting(groupId, "limit")) ] dist = randomPic(realDist) record("real", dist, sender, groupId, True, "img") print("本地real图片地址:", dist) return [Image.fromFileSystem(dist)] #bizhi功能 elif messageText == "bizhi": bizhiCalled = getData("bizhiCalled") bizhiCalled += 1 #bizhiCalled计数 updateData(bizhiCalled, "bizhi") if not getSetting(groupId, "bizhi"): #本群禁止要bizhi record("bizhi", "none", sender, groupId, False, "img") return [Plain(text="bizhi功能被关闭了呐>^<,想打开的话联系下管理员呐~")] else: if sender in blackList: #发送人在黑名单中 record("bizhi", dist, sender, groupId, False, "img") return [ Plain(text="要要要你🐎?大胆妖孽!我一眼就看出来你不是人!大威天龙!世尊地藏!般若诸佛!般若巴麻空!") ] dist = randomPic(bizhiDist) print("本地bizhi图片地址:", dist) record("bizhi", dist, sender, groupId, True, "img") return [Image.fromFileSystem(dist)] #批量pic功能 elif messageText[:5] == "setu*" or messageText[:5] == "real*": aim = messageText[:4] if aim == "setu": aimDist = setuDist else: aimDist = realDist if not ((getSetting(groupId, "setu") and aim == "setu") or (getSetting(groupId, "real") and aim == "real")): #本群禁止要setu forbiddenCount = getSetting(groupId, "forbiddenCount") forbiddenCount += 1 updateSetting(groupId, "forbiddenCount", forbiddenCount) record(messageText, "none", sender, groupId, False, "img") if forbiddenCount <= 3: return [Plain(text="我们是正规群呐,不搞那一套哦,想看去辣种群看哟~")] elif forbiddenCount <= 6: return [Plain(text="Kora!都说了是正规群啦!怎么老要这种东西呀,真是够讨厌的呢!再问我就生气啦!")] elif forbiddenCount <= 9: return [Plain(text="爬爬爬,天天脑子里都是些什么玩意儿,滚呐!爷生气啦!打你哦!")] else: return [Image.fromFileSystem(angryDist)] else: try: num = int(message.toString()[5:]) if aim == "setu": setuCalled = getData("setuCalled") setuCalled += num updateData(setuCalled, "setu") else: realCalled = getData("realCalled") realCalled += num updateData(realCalled, "real") if sender in getAdmin(groupId): if sender == HostQQ or num <= 5: picMsg = [] for i in range(num): # if setting[groupId]["setuLocal"]: dist = randomPic(aimDist) picMsg.append(Image.fromFileSystem(dist)) record("%s*%d" % (aim, num), dist, sender, groupId, True, "img") # else: # pass return picMsg else: record("%s*%d" % (aim, num), dist, sender, groupId, False, "img") return [Plain(text="管理最多也只能要5张呐~我可不会被轻易玩儿坏呢!!!!")] elif num <= 5: record("%s*%d" % (aim, num), "none", sender, groupId, False, "img") return [Plain(text="只有主人和管理员可以使用%s*num命令哦~你没有权限的呐~" % aim)] else: record("%s*%d" % (aim, num), "none", sender, groupId, False, "img") return [Plain(text="老色批,要那么多,给你🐎一拳,爬!")] except ValueError: return [Plain(text="命令错误!%s*后必须跟数字!" % aim)] #搜图功能 elif messageText in searchCallText: setSearchReady(groupId, sender, True) return [At(target=sender), Plain(text="请发送要搜索的图片呐~")] elif message.hasComponent(Image) and getSearchReady(groupId, sender): print("searching") img = message.getFirstComponent(Image) return searchImage(groupId, sender, img) #获取时间功能(可选背景) elif messageText in timeCallText: clockCalled = getData("clockCalled") clockCalled += 1 updateData(clockCalled, "clock") if getClockChoice(groupId, sender) == "none": clockMessage = [ At(target=sender), Plain(text="你还没有选择表盘哦~快来选择一个吧~\n"), Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="如:选择表盘1\n"), Plain(text="表盘预览:") ] clockList = os.listdir(clockPreviewDist) clockList.sort(key=lambda x: int(x[:-4])) index = 1 for i in clockList: clockMessage.append(Plain(text="\n%s." % index)) clockMessage.append(Image.fromFileSystem(clockPreviewDist + i)) index += 1 return clockMessage else: t = datetime.datetime.now() #目前时间 t = t.strftime("%H:%M") t = t.replace(":", "") dist = timeDist + str(getClockChoice(groupId, sender)) + "/%s.png" % t return [Image.fromFileSystem(dist)] #选择表盘(获取时间功能) elif messageText[:4] == "选择表盘": if messageText == "选择表盘": return showClock(sender) else: code = messageText[4:] if code.isdigit() and int(code) <= int(getData("dialsCount")): recordClock(groupId, sender, int(code)) return [Plain(text="已经选择了表盘%s呢!\n现在可以问我时间啦~" % code)] else: return [ Plain(text="看中后直接发送选择表盘+序号即可哦~\n"), Plain(text="再检查下有没有输错呢~\n") ] #天气查询功能 elif "[At::target=%i] 天气" % BotQQ in messageText: weatherCalled = getData("weatherCalled") weatherCalled += 1 updateData(weatherCalled, "weather") return getWeather(message, sender) #碧蓝航线wiki查询功能 elif "[At::target=%i] blhx:" % BotQQ in messageText: name = messageText[28:] return blhxWiki(sender, name) #营销号生成器 elif "[At::target=%i] 营销号" % BotQQ in messageText: _, somebody, something, other_word = messageText.split('、') # print(something,somebody,other_word) return [Plain(text=yingxiaohao(somebody, something, other_word))] #设置处理 elif "[At::target=%i] setting." % BotQQ in messageText: command = messageText[16:] try: print(command) name, config, change = command.split('.') print(name, '-->', " config:", config, "set to", change) return settingProcess(groupId, sender, config, change) except ValueError: return [ At(target=sender), Plain( text= "Command error! Use the '@bot command' command to query the commands you can use!" ) ] #获取信息处理 elif "[At::target=%i] info." % BotQQ in messageText: command = messageText[16:] # try: print(command) info, check = command.split('.') print(info, '-->', " info:", check) return infoProcess(groupId, sender, check) # except: # return [ # At(target=sender), # Plain(text="Command error! Use the '@bot command' command to query the commands you can use!") # ] #回复@bot(normal,zuanLow,zuanHigh,rainbow) elif "[At::target=%i]" % BotQQ in messageText: if sender == HostQQ: return [Plain(text="诶嘿嘿,老公@我是要找人家玩嘛~纱雾这就来找你玩哟~")] else: mode_now = getSetting(groupId, "speakMode") if not mode_now == "normal": # text="@我是要干什么呢?可以通过 @我+menu/command/info/mode 的方式查询信息哟~" if mode_now == "zuanHigh": text = requests.get(zuanHighSrc).text record("zuanHigh", "none", sender, groupId, True, "function") elif mode_now == "zuanLow": text = requests.get(zuanLowSrc).text record("zuanLow", "none", sender, groupId, True, "function") elif mode_now == "rainbow": text = requests.get(rainbowSrc).text record("rainbow", "none", sender, groupId, True, "function") return [At(target=sender), Plain(text=text)] return "noneReply"
async def event_fm(app: Mirai, friend: Friend, message: MessageChain): print(message.toString()) if message.toString() == "/followed": await app.sendFriendMessage(friend, [ Image.fromFileSystem("D:\\palette\\Sync\\Devices\\81519056_p0.jpg") ])
def asobiPolyline(*attrs,**kwargs): player = getPlayer(**kwargs) n=1000 m = { 1:(0,-1), # 左 2:(-1,0), # 上 3:(0,1), # 右 4:(1,0) # 下 } if not os.path.exists('Polyline/'): os.mkdir('Polyline/') try: if attrs[0] == 'init': try: n=int(attrs[1]) if n < 2 or n > 2000: return [Plain(text='为了宁的游戏体验,地图只能要2~2000阶内的方阵')] except: pass raise NameError('PolylineRESET') grids = numpy.loadtxt(f'''Polyline/{player}mat.txt''') n = len(grids) with open(f'''Polyline/{player}ans.txt''','r') as fr: s = fr.readline().strip().split(' ') ctr = int(fr.readline().strip()) op = numpy.array([int(s[0]),int(s[1])]) ed = numpy.array([int(s[2]),int(s[3])]) except: #进行初始化操作 grids = numpy.zeros([n,n]) op = (random.randint(0,n-1),random.randint(0,n-1)) polylen = random.randint(1,(n-1)*n) print(polylen) p = numpy.array(op) op = numpy.array(op) rush = 0 for i in range(polylen): if rush: rush-=1 else: movement = random.randint(1,4) rush = random.randint(1,int(min(n,(polylen-i))**0.5)) tmp = numpy.array(m[movement]) + p if i % 10000 == 0: print(rush) print(i) print(p) print(grids[p[0]][p[1]]) if tmp[0] in range(n) and tmp[1] in range(n) and grids[tmp[0]][tmp[1]] == 0: valid = True grids[p[0]][p[1]] = movement p = tmp else: tm = copy.deepcopy(m) tm.pop(movement) valid = False while len(tm): movement = random.choice(list(tm)) tmp = numpy.array(tm[movement]) + p if tmp[0] in range(n) and tmp[1] in range(n) and grids[tmp[0]][tmp[1]] == 0: grids[p[0]][p[1]] = movement p = tmp valid = True break tm.pop(movement) #print(tm.pop(movement)) #print('out') if valid == False: print('getBreakSignal') polylen = i ed = p break if valid: ed = p numpy.savetxt(f'''Polyline/{player}mat.txt''',grids,fmt='%d') with open(f'''Polyline/{player}ans.txt''','w') as fw: fw.write(f'{op[0]} {op[1]} {ed[0]} {ed[1]}\n0') ctr = 0 return [Plain(text=f'折线初始化完毕,长度{polylen},flag状态{valid}')] if attrs[0] == '!': try: x,y,X,Y = (int(_)-1 for _ in attrs[1:]) if (x==op[0] and y==op[1] and X==ed[0] and Y==ed[1]) or (x==ed[0] and y==ed[1] and X==op[0] and Y==op[1]): return [Plain(text=f'正确,目前查询次数{ctr}')] else: return [Plain(text='错啦!')] except Exception as e: return [Plain(text=f'输入格式错误,info:{e}')] elif attrs[0] == '?': try: x,y,X,Y = (int(_)-1 for _ in attrs[1:]) if x>X: x,X=X,x if y>Y: y,Y=Y,y if X>=n or Y>=n or x<0 or y<0: return [Plain(text='查询越界')] ctr+=1 with open(f'''Polyline/{player}ans.txt''','w') as fw: fw.write(f'{op[0]} {op[1]} {ed[0]} {ed[1]}\n') fw.write(str(ctr)) penetrateCtr = 0 for i in range(x,X+1): #统计列 if y: if grids[i][y-1] == 3: penetrateCtr += 1 if y != n: if grids[i][y] == 1: penetrateCtr += 1 if Y+1: if grids[i][Y] == 3: penetrateCtr += 1 if Y+1 != n: if grids[i][Y+1] == 1: penetrateCtr += 1 for i in range(y,Y+1): #统计行 if x: if grids[x-1][i] == 4: penetrateCtr += 1 if x != n: if grids[x][i] == 2: penetrateCtr += 1 if X+1: if grids[X][i] == 4: penetrateCtr += 1 if X+1 != n: if grids[X+1][i] == 2: penetrateCtr += 1 return [Plain(text=f'穿界次数:{penetrateCtr},查询次数:{ctr}')] except Exception as e: return [Plain(text=f'输入格式错误,info:{e}')] elif attrs[0] == 'render': col = 255 try: col = int(attrs[1]) except: pass for pi,i in enumerate(grids): for pj,j in enumerate(i): if j: grids[pi][pj] = col renderedPng = PImage.fromarray(grids).convert('L') fn = f'''Polyline/{player}.png''' with open(fn,'wb') as fw: renderedPng.save(fw) asyncio.ensure_future(rmTmpFile(fn)) return [Image.fromFileSystem(fn)] else: return [Plain(text='命令错误')]