本插件针对的是使用nonebot2+go-CQHttp为框架的QQ机器人。具体搭建方法可以参考 川川菜鸟 的《qq机器人小白教程系列》

本插件使用前需要创建一个计时文件.xlsx,下面的代码中默认D:\QQbot文件\计时文件-飞花令.xlsx,各位可以根据自己的实际情况在合适的文件路径下创建计时文件并更改代码中的路径。请将空表格的sheet的名字改成任意数字,单元格(1,2)、(1,4)、(1,5)键入任意数字;0;0,防止程序出错。另外定期重置表格。

请将以下飞花令规则存在cqhttp4的data\image文件里。

五个指令(均是指令开头,不需要@bot):“发 飞花令x”x可以是1-4或者自定义文字,开启飞花令;“发 加入飞花令”,其它成员加入飞花令,发起者默认是第一个,不需要发送该指令。“发 开始飞花令”,发起者开启飞花令的计时。“发 飞花令.close()”发起者在正式开始前关闭飞花令。“#诗句”,飞花令诗句。

以下是代码,本人没有系统学习过代码规范,所以略粪,如果有大佬可以优化本人将再三感谢

# -*- coding:utf-8 -*-
from nonebot.adapters.cqhttp import Message
from nonebot import on_keyword, on_notice, on_message,on_startswith
from nonebot.typing import T_State
from nonebot.adapters import Bot, Event
from nonebot import require
from aiocqhttp.exceptions import Error as CQHttpError
from nonebot.adapters.cqhttp import message, GroupMessageEvent, Message, MessageEvent
from nonebot.typing import T_State
import random,openpyxl,time,nonebot,requests
from nonebot_plugin_apscheduler import scheduler
from bs4 import BeautifulSoup
#本插件内容:飞花令开局、加入、开启、判定、计时、结算
dict2,dict3 = {},{} #dict3是当前群聊有无飞花令,dict2是当前飞花令的表格名称,list1是说过的内容,dict2是关键字,dict4是用户
f0 = openpyxl.load_workbook('D:/QQbot文件/计时文件-飞花令.xlsx')#如果没有这个文件,需要先创建一个fhrule = on_keyword('飞花令规则',priority=98)@fhrule.handle()
async def fhgz(bot: Bot, event: GroupMessageEvent, state: T_State):#飞花令仅在群聊中开启guize = '飞花令.jpg'#将飞花令规则截图存在cqhttp4的dataimage文件里tu = [{"type":"image","data":{'file':f'{guize}'}}]await fhrule.send(tu)fhstart = on_startswith({'发 飞花令'},priority=3)@fhstart.handle()
async def j(bot: Bot, event: GroupMessageEvent, state: T_State):#飞花令仅在群聊中开启global dict2,dict3,f0x = str(event.message).replace('发 飞花令','').strip()#获取飞花令难度,什么也不写默认4grname = event.group_idusid = event.user_idtry:#首先判定群里有没有正在开的飞花令,没有的话将数值设置为0status1 = dict3[grname]except KeyError:dict3[grname] = 0if dict3[grname] == 1:#如果有正在开的飞花令,不能开始新局try:await fhstart.send(Message('当前正在进行,请勿重开'))except TypeError:#CQHttpError:passelse:if grname in [915324969,957383234,799524693,571060634]:#屏蔽一些群聊中的功能,可以手动添加也可以另外设置一个口令passelse:if not x:x = '4'if x not in ['1','2','3','4']:await fhstart.send('请输入正确难度(1-4)!')else:#根据难度出题dict3[grname] = 1#判定开局,状态改为1atime = time.time()dict3[grname] = 1dict2[grname] = str(grname)+str(atime)sheet = f0.create_sheet(dict2[grname])#根据群名+创建时间建立的飞花令表格,便于复查飞花令记录,如果没有这个必要,可以直接改成群聊的名字,每次开局重置。后面的表格判定也都直接改成判定以这个群号为名称的表格的状态,而不需要遍历。if x == '1':b = random.choice(['风', '花', '月', '人', '春', '天', '河', '红', '白', '秋', '水', '江', '海', '如', '中', '上', '下', '一', '日', '不', '无', '明', '山', '云', '大', '小', '我', '时', '有', '长', '何', '空', '心', '来', '去', '里', '为', '君', '知', '见', '在', '相', '年', '自', '此'])elif x == '2':b = random.choice(['安', '百', '半', '杯', '北', '碧', '别', '波', '残', '草', '尘', '成', '城', '愁', '出', '处', '从', '翠', '当', '到', '道', '得', '地', '东', '独', '断', '对', '发', '方', '方位+风', '飞', '非', '风+季节/+时间点', '复', '高', '歌', '个位数+个位数', '更', '孤', '古', '故','关', '光', '归', '国', '过', '寒', '好', '合', '荷/芙蓉/蕖', '后', '黄', '回', '几', '家', '间', '将', '今', '尽', '近', '惊', '酒', '旧', '开', '看', '可', '客', '老', '冷', '离', '连', '林', '流', '龙', '楼', '路', '露', '落', '绿', '马', '满', '门', '梦', '明+月', '莫', '木', '暮', '南','难', '能', '鸟', '平', '起', '气', '千', '前', '桥', '青', '清', '情', '然', '入', '三', '色', '少', '谁', '身', '深', '生', '声', '十', '石', '时间点+季节/+时间点', '似', '是', '书', '树', '数字+花', '数字+年', '数字+月', '双', '霜', '思', '随', '岁', '台', '同', '头', '外', '晚', '万', '望','微', '文', '闻', '五', '西', '溪', '闲', '乡', '香', '晓', '新', '行', '须', '雪', '烟', '颜色+花', '阳', '野', '叶', '夜', '衣', '已', '意', '吟', '应', '影', '游', '与', '雨', '玉', '欲', '远', '照', '终', '重', '竹', '子', '醉','黑山/阴山/塞/天山/昆仑/长城','消/销/萧/潇/宵/霄','血/肉/骨/肤','才/刚/方/正','方/圆/规/矩','指定植物+花','花+植物器官/+植物种类','区划地形+区划地形','区划地形+方位','颜色+植物器官/+植物种类'])elif x == '3':b = random.choice(['八', '冰', '病', '不+尽', '采', '彩', '蚕', '曾', '常', '沉', '池', '赤', '川', '船', '窗', '吹', '垂', '春+花', '辞', '大+江', '待', '但', '灯', '灯', '低', '帝', '点', '叠字(或连续两个一样的字)', '动', '都', '儿', '而', '二', '方位+方位', '方位+海', '风+雨', '峰', '浮', '阁', '隔', '功', '宫', '共', '观', '还', '汉', '恨', '鸿', '忽', '胡', '湖', '画', '荒', '昏', '火', '寄', '佳', '剑', '皆', '接', '节', '锦', '景', '镜', '九', '菊', '觉', '堪', '口', '哭', '兰', '浪', '乐', '帘', '柳', '六', '乱', '漫', '眉', '梅', '美', '面', '鸣', '目', '念', '暖', '蓬', '片', '破', '七', '旗', '浅', '墙', '琴', '晴', '曲', '全', '泉', '犬', '人+不', '诗', '时间点+花', '时间点+月', '食', '始', '世', '手', '数字+百', '数字+季节/+时间点', '数字+里', '数字+千', '数字+人', '数字+日', '数字+万', '数字+颜色', '说', '丝', '死', '四', '素', '堂','同一个字重复出现但不连在一起', '桐', '童', '土', '王', '问', '舞', '雾', '细', '霞', '夏', '想', '笑', '斜', '星', '休', '寻', '言', '颜色+水/+江', '颜色+云', '眼', '雁', '燕','杨', '也', '依', '疑', '音', '银', '悠', '于', '于', '语', '怨', '愿', '早', '章', '真', '征', '正', '枝', '只','州', '烛', '转', '紫', '足','最', '户', '映', '数字+十', '松', '凤', '指', '却', '柔', '定', '落+花', '流+水/+江', '季节+水/+江', '不+闻/+见', '惟/唯/剩/仅', '花+无/+不', '小楼/西楼/高楼/楼高', '城外/门前/枝头/天下/山中/海上', '岩/涯/崖/岭/谷/壁/巅/顶', '季节+雨/+雪', '箫/笛/笙/箜篌/筝','鼓/瑟/钟/琵琶/磬', '妆/容/粉/黛', '姿/服/裳/袍', '日+颜色/+季节', '云+颜色/+季节', '数字+心/+情', '离+别/+人', '无边/无语/无言/不语/不见/不闻', '烽/漠/榆/旌', '画/图/点/墨', '时间点+雨/+风','接/发/留/住','数字+颜色','江+季节/+时间点','泽/黄鹤/洞庭/潇/湘','梨/李/瓜/海棠/枣','鬼/魂/魄/灵','人+月/+时间点','不+无/+不','逢/遇/适/邂逅','颜色+月/日','徘徊/盘桓/踌躇/踟蹰/踯躅','指定植物+植物器官','植物种类+月/+季节','指定植物+月/+季节','植物器官+数字','植物器官+月/+季节','指定植物+指定植物','植物器官+植物器官/+植物种类','区划地形+季节/+时间点','区划地形+数字','指定动物+颜色'])elif x == '4':b = random.choice(['哀', '爱', '岸', '把', '薄', '杯', '边', '别', '鬓', '兵', '病', '彩/蛋/农/校/科/技/协/会', '残', '蚕', '草', '曾', '车', '沉', '陈', '晨/旦/曙/早/晓', '城', '池', '迟', '尺', '虫', '初', '楚', '朝', '吹', '垂', '词', '辞', '此', '从', '翠', '打', '旦', '淡', '当', '登', '底', '点', '雕', '蝶', '冬', '豆', '杜', '儿', '帆', '翻', '方位+方位', '芳', '飞', '肥', '取/赢/赏/功','分', '纷', '枫', '逢', '夫', '拂', '复','敢', '更', '鼓', '故', '顾', '关', '光', '桂', '国', '还', '好', '号', '浩', '和', '河汉/星汉/银汉/银河/银潢/星河/星汉', '黑', '侯', '乎', '呼', '胡', '户', '华', '化', '黄+河', '悔', '昏', '鸡', '急', '记', '季节+月', '家', '间', '建康/建邺/建业/宁/金陵', '渐', '脚', '金', '经', '惊', '镜', '旧', '举', '卷', '绝', '槛', '可', '客', '口', '哭', '狂', '来+往/+去', '栏', '阑', '蓝', '郎', '乐', '泪', '梨', '篱', '立', '丽', '连', '怜','帘', '莲', '零', '留', '落', '麦', '忙', '茫', '没', '眉', '梅+花', '门', '眠', '眠/寐/醒/寝', '名', '名', '鸣', '磨', '莫', '木', '泥', '娘', '牛', '弄', '女', '怕', '旁', '萍', '破', '其', '旗', '气', '泣', '浅', '强', '清明/元宵/元夜/春社', '穷', '泉', '然', '若', '桑', '沙', '山+水','裳', '舍', '谁', '身', '深', '神', '胜', '石', '识', '食', '事', '是', '首', '数字+季节', '双', '送', '所', '苔', '滩', '潭', '叹', '涕','天孙/河鼓/牵牛/织女/黄姑/鹊', '铁', '听', '庭', '停', '同', '桐', '头', '王', '往', '未', '问', '翁', '卧', '吴', '夕', '夕阳/斜阳/落日/日暮', '兮', '息', '稀', '细', '闲', '弦', '乡', '相', '向', '晓', '歇', '斜', '辛', '行', '杏', '兄', '休', '寻', '压', '涯', '颜', '颜色+山', '颜色+颜色', '雁', '燕', '扬州/杭州/苏州/姑苏', '阳', '杨+柳', '遥', '衣/襟/裳/冠/冕', '亦', '阴', '饮', '应', '幽', '犹', '又', '右', '鱼','羽', '元', '原', '岳','在', '赠', '长+江', '折', '征', '之', '枝', '至', '终', '钟', '舟', '烛', '妆', '字', '总', '最', '左', '作', '染', '进', '腹','取/赢/赏/功','秦/晋/京/津/齐/鲁','关/轮台/燕然/贺兰/燕山/青海','雀/乌/子规/鹧鸪/鹦鹉/莺/鸳','弓/箭/刀/矢/剑/戟','衰/老/朽/弱','恶/苦/贬/谪','仙/神/东君/社','月+方位/+时间点','花+方位/+时间点','方位+季节/+时间点','不+无/+不','徘徊/盘桓/踌躇/踟蹰/踯躅','枕/倚/凭/扶','独+立/+数字','园/圃/场/原','花+植物器官/+植物种类','指定植物+数字','区划地形+方位','指定动物+数字','指定植物+颜色','颜色+植物器官/+植物种类','指定动物+指定动物','指定动物+指定植物','指定动物+月/+季节','区划地形+颜色','指定植物+花','植物器官+月/+季节','区划地形+区划地形','指定植物+指定植物','区划地形+数字'])else:for i in x:if i in ['。',',','?','!','、',';',':','“','《','(']:success = Falsebreakelse:success = Trueif success:b = xelse:await fhstart.send('请输入正确难度(1-5)!如果是自选主题,请注意格式,详见“飞花令规则”!')b = Falseif b:sheet.append(['group',grname,atime,'飞花令',-1,'',b])#单元格(1,5)存储本局飞花令的状态,-1未开始,0已结束,1-n代表参与者的顺序sheet.append(['group',grname,atime,'参加',1,usid,'0'])#飞花令的发起者默认顺序为1,发起者ID录入这一行的F格await fhstart.send('请在十分钟内找到至少其他1人才能正式开始哦,如果要参与,请发送‘发 加入飞花令’加入飞花名单,如果凑齐人数且在开局10分钟内,发起者均可发送‘发 开始飞花令’开启飞花之旅。')f0.save('D:/QQbot文件/计时文件-飞花令.xlsx')async def gjzxq(b):#将几种特殊类型的飞花令拆解成可以判定的单字dict1 = {'数字':['一','二','三','四','五','六','七','八','九','十','零','百','千','万','亿','两','数','半'],'个位数':['一','二','三','四','五','六','七','八','九','零'],'颜色':['红','橙','黄','绿','青','蓝','紫','粉','黑','白','碧','褐','赤','灰','金','银','玄'],'方位':['东','南','西','北','中','上','下','左','右','里','外','内','前','后'],'季节':['春','夏','秋','冬'],'时间点':['朝','夕','暮','夜','晚','午','晓','晡','昨','明日','一更','二更','三更','四更','五更','昏'],'指定植物':['桃','杏','梨','李','棠','梅','苔','蕨','樱','松','柏','杨','柳','芦','蒿','蓼','榔','棣','莪','萍','苹','蘋','葭','兰','竹','菊','豆','麦','荻','稻','粟','荷','莲','芙','槿','蒲','桂','槐','桑','榆','藕','薇','枫','榴','牡丹'],'植物器官':['根','茎','叶','实','种','萼','枝','芽','苗','花'],'指定动物':['鹤','鸳','燕','雁','鸿','鸥','鹭','鹂','鸪','鹃','莺','犬','牛','羊','鹦','马','鸡','鸭','鹅','猿','鹿','雀','鹊','鱼','虫','子规','蝶','蜂','蝉','蟾','蚁','虾','蟆','蚕','蜻蜓','鸾','蛇','狼','狸','鸦','蜉','狐','豚'],'植物种类':['树','草','藤','木'],'区划地形':['州','乡','村','阴','阳','山','河','湖','海','谷','山','原','江'],'酒器':['斗','樽','碗','杯','斛','壶','瓮','盏']}listb = []if '叠字' in b:b = '叠字'elif '重复' in b:b = '重复'elif len(b) <3:b = b.split()elif '+' in b and '/' not in b:b = b.split('+')for i in b:if len(i)>1:i = dict1[i]listb.append(i)else:listb.append(i.split())if listb:b = listbelif '/' in b and '+' not in b:b = b.split('/')for i in b:listb.append(i.split())if listb:b = listbelse:b = b.split('/+')for i in b:if '+' in i:a = i.split('+')for i2 in a:if len(i2)<2:listb.append(i2.split())else:listb.append(dict1[i2])else:if len(i)<2:listb.append(i.split())else:listb.append(dict1[i])if listb:b = listbreturn bfhjoin = on_startswith({'发 加入飞花令'},priority=72)@fhjoin.handle()
async def j2(bot: Bot, event: GroupMessageEvent, state: T_State):f0 = openpyxl.load_workbook('D:/QQbot文件/计时文件-飞花令.xlsx')#如果没有这个文件,需要先创建一个grname = event.group_idusid = event.user_idsheetlist = f0.sheetnamesfor sheets in sheetlist:success = Falsesheet = f0[sheets]if str(grname) not in sheets:continueelif sheet.cell(1,5).value > 0:success = Trueawait fhjoin.send('当前本群有飞花令正在进行,不能中途加入!')breakelif sheet.cell(1,5).value == -1:success = Trueshunxu = sheet.max_row#因为第一行是基本信息,所以在加入之前的最后一行就是加入者的序号if shunxu > 18:await fhjoin.send('人数已经达到18人,不可再加入!')else:success = Falsefor i in range(2,sheet.max_row+1):if sheet.cell(i,6).value == usid:await fhjoin.send('你已经加入这局飞花令啦!')success = Truebreakif not success:success = Trueawait fhjoin.send(f'加入成功!请等待发起者开始。\n你的序号是:{shunxu}')sheet.append(['group',grname,time.time(),'参加',shunxu,usid,'0'])f3 = open("D:/QQbot文件/计时文件.txt",'w',encoding='utf-8')f3.write(str(time.time()))f3.close()f0.save('D:/QQbot文件/计时文件-飞花令.xlsx')breakif not success or event.user_id in [2538372982,1540689041]:await fhjoin.send('当前没有正在发起的飞花令,请发送‘发 飞花令x’发起新的飞花令。')fhbegin = on_startswith({'发 开始飞花令'},priority=73)@fhbegin.handle()
async def j3(bot: Bot, event: GroupMessageEvent, state: T_State):f0 = openpyxl.load_workbook('D:/QQbot文件/计时文件-飞花令.xlsx')#如果没有这个文件,需要先创建一个grname = event.group_idusid = event.user_idsheetlist = f0.sheetnamesfor sheets in sheetlist:success = Falsesheet = f0[sheets]if str(grname) not in sheets:continueelif sheet.cell(1,5).value > 0:success = Trueawait fhbegin.send('当前本群有飞花令正在进行,请勿重开!')breakelif sheet.cell(1,5).value == -1:success = Trueif sheet.cell(3,6).value:if sheet.cell(2,6).value == usid:#(2,6)是发起者的ID,只有发起者可以开始飞花令。sheet.cell(1,5).value = 1await fhbegin.send('飞花令即将开始,本次主题:'+sheet.cell(1,7).value)atlist = f'[CQ:at,qq={sheet.cell(2,6).value}]'atlist1 = '从' + atlist + '你那儿,开始!'for i in range(3,sheet.max_row+1):atlist = atlist + f'[CQ:at,qq={sheet.cell(i,6).value}]'#按照顺序一次@每一个人atlist = '顺序:' + atlisttime2 = time.time()sheet.append(['group',grname,time2,'',-1,sheet.cell(2,6).value])#群,群号,时间,飞花令内容(等待参与者说出再添加),状态:-1未作答且尚未超时,0超时没说出淘汰,1说对,这个人的IDf0.save('D:/QQbot文件/计时文件-飞花令.xlsx')await fhbegin.send(Message(atlist1))#随后@第一个人开始await fhbegin.send(Message(atlist))breakelse:await fhbegin.send('你不是发起者,无权限开始!')else:await fhbegin.send('只有你一个人参加,不能开始!')if not success or event.user_id==1540689041:await fhbegin.send('当前本群无飞花令正在等待,不能开始!')feihua = on_startswith({'#','#'},priority=74)#以‘#’开头为飞花令识别关键词@feihua.handle()
async def shici(bot: Bot, event: GroupMessageEvent, state: T_State):global dict2f0 = openpyxl.load_workbook('D:/QQbot文件/计时文件-飞花令.xlsx')#如果没有这个文件,需要先创建一个grname = event.group_idusid = event.user_idmsg = str(event.message).replace('#','').replace('#','').strip()try:sheet = f0[dict2[grname]]#根据dict2确定大开哪个表格success = Falseif usid == sheet.cell(sheet.max_row,6).value:#当前最后一个人总是保持当前要进行飞花令的人。success = Truepanding = await fhpanding(msg,grname) #使用函数判定这句诗句是否合规if not panding:#如果说对了,判定=arc=falseshiju = msg.replace(',','').replace('。','').replace('、','')sheet.cell(sheet.max_row,5).value = 1#已经说对,状态更改为1sheet.cell(sheet.max_row,4).value = msg#已经说对,将诗句存档sheet.cell(sheet.max_row,7).value = shijustatus_code = sheet.cell(1,5).valuefor i in range(2,20):if sheet.cell(i,4).value == '参加' and sheet.cell(i,5).value == status_code:#找到当前是谁if sheet.cell(status_code+2,4).value == '参加':status_code += 1else:status_code = 1while sheet.cell(status_code+1,5).value<0:#跳过被淘汰的人,因为如果还有人说对诗句,说明场上至少还有两个人,不会陷入无限循环status_code += 1if sheet.cell(status_code+1,4).value != '参加':status_code = 1sheet.cell(1,5).value = status_code#更改飞花令状态为下一顺位。atid = sheet.cell(status_code+1,6).valuemsg = f'[CQ:at,qq={atid}]' + '该你了'await feihua.send(Message(msg))sheet.append(['group',grname,time.time(),'',-1,atid])#下一轮计时开始sheet.cell(1,5).value = status_codef0.save('D:/QQbot文件/计时文件-飞花令.xlsx')breakelse:await feihua.send(panding)if not success:await feihua.send('请勿干扰飞花秩序。')except CQHttpError and KeyError:if event.group_id not in [957383234,965324969,762756338]:await feihua.send('这是一条报错消息')passasync def fhpanding(msg,grname):global dict2f0 = openpyxl.load_workbook('D:/QQbot文件/计时文件-飞花令.xlsx')#如果没有这个文件,需要先创建一个sheet = f0[dict2[grname]]b = await gjzxq(sheet.cell(1,7).value)#如果是特殊飞花令,将得到所有判定字,如果是普通飞花令,将得到一个只有1个元素的列表a,msg2 = 0,''shiju = msg.replace(',','').replace('。','').replace('、','')success = Falseif b == '叠字':#两个比较特殊的情况,叠字和重复出现但不相邻的字for i in range(len(msg)-1):if msg[i] == msg[i+1]:diezi = msg[i] + msg[i+1]success = Truefor row in range(4,sheet.max_row+1):#叠字的规则中还有一条:已经说过的叠字不能再说if not sheet.cell(row,4).value:passelif diezi in sheet.cell(row,4).value:success = Falsebreakbreakelif b == '重复':for i in range(len(msg)):for j in range(len(msg)):if i-j > 1 and msg[i] == msg[j]:#不相邻且相同chongfu = msg[i]diezi = msg[i] + msg[j]success = Truefor row in range(4,sheet.max_row+1):if not sheet.cell(row,4).value:passelif chongfu in sheet.cell(row,4).value and diezi not in sheet.cell(row,4).value:#有关键字但没有重复出现,如果将关键字去掉后少了两个字以上,说明重复了。a = len(sheet.cell(row,4).value)b = len(sheet.cell(row,4).value.replace('chongfu',''))if a-b >1:success = Falsebreakbreakif success:breakelse:if len(b) == 1:#单关键字,只要在,就判定合规if b[0] in msg:success = Trueelif len(b) == 2:#双关键字,两个都在,才能判定合规for i in b[1]:if i in msg:success = Truemsg2 = msg.replace(i,'')if b[1]!=b[0] and len(msg)-len(msg2)>1:msg2 = msg2 + ibreakif success:success2 = Falsefor j in b[0]:if j in msg2:success2 = Truebreakif not success2:success = Falseelif len(b) == 3: #一个关键字+另外两个关键字任选一个for i in b[0]:if i in msg:success = Truemsg2 = msg.replace('i','')breakif success:success2 = Falsefor j in b[1]:if j in msg2:success2 = Truebreakif not success2:for i in b[2]:if i in msg2:success2 = Trueif not success2:success = Falseelse:for i in b:#多个关键词任选其一的情况,只需要一个在就行if i[0] in msg:success = Truebreakif not success:arc = '没有关键字或在叠字飞花令中关键字重复,请在剩余时间内说出正确诗句!'else:if b != '重复' and b != '叠字':for i in range(4,sheet.max_row+1):#判断诗句有无说过。比如说过了‘天若有情天亦老,人间正道是沧桑’,可以说‘衰兰送客咸阳道,天若有情天亦老’,但不可以只说‘天若有情天亦老’,反之亦然。if not sheet.cell(i,7).value:passelif sheet.cell(i,7).value in shiju or shiju in sheet.cell(i,7).value:arc = '说过了,请在剩余时间内说其它诗句!'success = Falsebreakif success:if len(shiju) < 5 or len(shiju) > 20 or len(shiju)==4 and ',' in msg[:4]:#判定诗句长度是否符合规范arc = ('字数错误,请在剩余时间内补全或删简!')success = Falseelse:#重头戏,通过古诗文网搜索判断诗句是否正确headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}arc = requests.get('https://so.gushiwen.cn/search.aspx?value='+msg + '&valuej=' + msg[0],headers=headers)htm = BeautifulSoup(arc.text,'html.parser')try:cd = htm.find('textarea')cdtext = cd.textexcept AttributeError:#这个是防止一些诗句有两个版本导致搜索结果界面显示不同cd = htm.find('head')cdtext = cd.textcdtext=cdtext.split("——")[0]a = 0for i in shiju:if i in cdtext:a = a + 1cdtext1 = cdtext.replace(shiju[:2],'').replace(shiju[2:5],'')if a != len(shiju) or cdtext==cdtext1:success = Falseelif a == len(shiju):#如果诗句和结果完全匹配,判断诗句是否完整判定方法是最后一个字后面是不是标点符号。success = Falsefor i2 in range(len(cdtext)):if cdtext[i2] == shiju[-1] and cdtext[i2+1] in [',','。','!','?','、',';',',','?',';','》','”']:success = Truebreakif not success:arc = '诗句不完整或不正确,请在剩余时间内调整答案!'if success:arc = Falsereturn arc#只有没有说对arc才有值,说对了arc=falserequire('nonebot_plugin_apscheduler').scheduler@scheduler.scheduled_job('interval', seconds = 5)
async def co4():global dict3,dict2f0 = openpyxl.load_workbook('D:/QQbot文件/计时文件-飞花令.xlsx')#如果没有这个文件,需要先创建一个bot = nonebot.get_bots()['3635837386']listsheet =f0.sheetnameslist2 = []for i in listsheet:sheet = f0[i]if sheet.cell(1,5).value != 0:dict3[sheet.cell(1,2).value] = 1dict2[sheet.cell(1,2).value] = ilist2.append(sheet.cell(1,2).value)kys = list(dict2.keys())for ky in kys:if ky not in list2:del dict2[ky]del dict3[ky]for ix in range(len(listsheet)):fui = -1 - ixsheet =f0[listsheet[fui]]a5b = sheet.cell(sheet.max_row,3).valuea5a = str(sheet.cell(sheet.max_row,2).value)a5d = sheet.cell(sheet.max_row,5).valuestatus_code = sheet.cell(1,5).valuetimeline = time.time()if status_code == -1:if timeline - sheet.cell(1,3).value > 600:sheet.cell(1,5).value = 0await bot.call_api('send_group_msg',**{'group_id':a5a,'message':'由于10分钟未开始,飞花令结束,如果还有人想玩请重新发送‘发 飞花令x’开局。'})dict3[sheet.cell(1,2).value] = 0dict2[sheet.cell(1,2).value] = 0f0.save('D:/QQbot文件/计时文件-飞花令.xlsx')elif a5d == 0:passelif status_code > 0:if timeline - a5b > 29.3 and timeline - a5b < 35:await bot.call_api('send_group_msg',**{'group_id':a5a,'message':f'[CQ:at,qq={sheet.cell(sheet.max_row,6).value}]还有30秒'})elif timeline - a5b > 49.3 and timeline - a5b < 55:await bot.call_api('send_group_msg',**{'group_id':a5a,'message':f'[CQ:at,qq={sheet.cell(sheet.max_row,6).value}]还有10秒'})elif timeline - a5b > 60:await bot.call_api('send_group_msg',**{'group_id':a5a,'message':f'[CQ:at,qq={sheet.cell(sheet.max_row,6).value}]时间到,'})sheet.cell(sheet.max_row,5).value = 0grname = sheet.cell(1,2).valuestatus_code,sc2 = sheet.cell(1,5).value,sheet.cell(1,5).valueval,alv = -1,0for lines in range(2,20):if sheet.cell(lines,4).value == '参加' and sheet.cell(lines,5).value<=val:val = sheet.cell(lines,5).value-1elif sheet.cell(lines,4).value == '参加' and sheet.cell(lines,5).value > 0:alv += 1if status_code < lines-1 and sheet.cell(lines,5).value>0:sheet.cell(1,5).value = sheet.cell(lines,5).valuestatus_code = 21elif sheet.cell(lines,4).value != '参加':breaksheet.cell(sc2+1,5).value = valif alv <= 2:sheet.cell(1,5).value =0f0.save('D:/QQbot文件/计时文件-飞花令.xlsx')reply = await fhjiesuan(grname)del dict3[grname]del dict2[grname]await bot.call_api('send_group_msg',**{'group_id':a5a,'message':f'{reply}'})else:if status_code == 21:atid = sheet.cell(sheet.cell(1,5).value+1,6).valuestatus_code = sheet.cell(sheet.cell(1,5).value+1,5).valueelse:for iy in range(2,sc2):if sheet.cell(iy,5).value > 0:sheet.cell(1,5).value = sheet.cell(iy,5).valueatid = sheet.cell(iy,6).valuestatus_code = sheet.cell(iy,5).valuebreakmsg = f'[CQ:at,qq={atid}]' + '该你了'await bot.call_api('send_group_msg',**{'group_id':a5a,'message':msg})sheet.append(['group',sheet.cell(1,2).value,time.time(),'',-1,atid])sheet.cell(1,5).value = status_codef0.save('D:/QQbot文件/计时文件-飞花令.xlsx')breakasync def fhjiesuan(grname):global dict2,f0sheet0 = f0[dict2[grname]]list1,dict1,dict4 = [],{},{}#list1:排名,dict1,名次对应的人,dict2,人对应的分数msg = '本局飞花令结束!排名如下:'for i in range(2,20):if sheet0.cell(i,4).value == '参加':list1.append(sheet0.cell(i,5).value)#先把负数排名放进来,最后一个人没有负数排名dict1[sheet0.cell(i,5).value] = sheet0.cell(i,6).valuedict4[sheet0.cell(i,6).value] = 0else:breaklist1.sort()#排序,由于只有数字,自然会排成-x,-x+1…………,正数排名的那个人(这个人的名次应该是-len(list1))dict1[-len(list1)] = dict1[list1[-1]]#将dict1里的正数排名的那个人改成负数排名del dict1[list1[-1]]list1[-1] = -len(list1)#把list里的正数排名改成负数list1.sort()a = 0for i in range(4,sheet0.max_row+1):#根据正文的第5列的数据计算每个人的诗句总数if sheet0.cell(i,4).value != '参加' and sheet0.cell(i,5).value==1:a = a + 1dict4[sheet0.cell(i,6).value] = dict4[sheet0.cell(i,6).value] + 1for i in list1:msg = msg + '\n第' + str(i+1+len(list1)) + '名:' + f'[CQ:at,qq={dict4[dict1[i]]}]' + ':' + str(dict4[dict1[i]]) + '分'return msg

nonebot2插件之主持飞花令相关推荐

  1. nonebot2插件之主持双音节猜成语

    本插件针对的是使用nonebot2+go-CQHttp为框架的QQ机器人.具体搭建方法可以参考 川川菜鸟 的<qq机器人小白教程系列> 双音节猜成语是来自<中国成语大会>中的一 ...

  2. NoneBot2插件——打印系统状态

    使用Python编写 NoneBot2插件 显示系统CPU.磁盘.内存的占用状态. sys_states 插件目录,__pycache__文件无需创建. init.py文件 on_command:消息 ...

  3. python编程练习:10000位的圆周率飞花令

    一.目标 利用爬虫收集足够多的古诗词,筛选诗词中含有数字的句子后,再按照圆周率中的数字顺序对这些诗词进行排序.最后形成下图所示的统计结果: 二.步骤及代码 2.1 爬虫获取古诗词 import url ...

  4. [Python] 利用 Python 制作“飞花令”小工具

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒) 若公众号内转载请联系公众号:早起Python 介绍:飞花令是古时候人bai们经常玩一种"行酒令" ...

  5. python爬虫后进行诗词接龙_飞花令今天看了诗词大会特别有感触,还上了热搜,史上最长飞花令...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 飞花令 今天看了诗词大会特别有感触,还上了热搜,史上最长飞花令.接的圆周率,接到小数点后边第204位!真的很佩服各位的诗词储量.故此开了本帖,依葫芦画瓢, ...

  6. 记我的第一个APP-简易版飞花令

    这学期在老师的引导下,开始接触了AS,并尝试了编写了自己的第一个APP.虽然比较简单,但很有纪念意义. 一开始不怎么会用AS嘛,于是自己就在eclipse里写了一个控制台类型的. import jav ...

  7. Android app 飞花令

    飞花令App开发 APP效果图 过程 自己的第一个APP,也是第一个项目.APP的界面组件有textview(输出区).editview(输入区). button,每个组件有个id,java程序通过i ...

  8. nonebot2插件——百度贴吧攻略插件

    文章目录 前言 一.网址分析 二.获取 1.引入库 2.网页分析 总结 前言 对nonebot2机器人感兴趣,又不知道如何编写插件的可以看过来,或者对贴吧攻略感兴趣的也可以看过来,插件下载在总结一栏. ...

  9. NoneBot2插件——进群欢迎

    参考:https://v2.nonebot.dev/api/plugin.html GroupDecreaseNoticeEvent:群成员减少事件 GroupIncreaseNoticeEvent: ...

  10. 【生活现场】从诗词大会飞花令到elasticsearch原理解析

    随着央视诗词大会的热播,小史开始对诗词感兴趣,最喜欢的就是飞花令的环节. 但是由于小史很久没有背过诗词了,飞一个字很难说出一句,很多之前很熟悉的诗句也想不起来. [倒排索引] 吕老师:但是我让你说出带 ...

最新文章

  1. 为ASP.NET控件添加常用的JavaScript操作
  2. 深度学习最新方法:随机加权平均,击败了当前最先进的Snapshot Ensembling
  3. python3基础语法-Python3 - 基础语法
  4. hdu---5455---fang fang
  5. boost::spirit模块使用 phoenix 进行实际表达式评估的语法和语义操作的测试程序
  6. python中exception类的_Python自定义一个异常类的方法
  7. ACM Robot Motion
  8. python大文件排序_Python如何实现大文件排序?Python大文件排序的实现方法
  9. 固定资产管理员计算机应用,浅谈计算机在固定资产管理中应用.doc
  10. Java编写ASCII码转换
  11. 液晶显示器背光测试软件,液晶屏背光灯驱动板故障检测方法_维修技术
  12. 云计算、雾计算、边缘计算、移动边缘计算和自动驾驶的关系
  13. 关于es cpu安装黑苹果,并实现变频
  14. 进入IT行业,你后悔过吗?
  15. 概要设计说明书的书写
  16. skyeye linux qt,Ubuntu 16.04上安装SkyEye及测试
  17. Android开发--WIFI输入密码Dialog的实现
  18. xiaomi5小米5手机刷原生安卓实测稳定可靠方法,附下载全套刷机软件卡刷rom
  19. 深度学习 | BN层原理浅谈
  20. Mac搭建Flink集群

热门文章

  1. android锁屏壁纸设置,安卓锁屏壁纸怎么换 安卓锁屏壁纸设置教程
  2. 校友故事|我在科大感受理工科“严谨的浪漫主义”
  3. DeR-ViT(CVPR2022)
  4. 北京大学肖臻老师《区块链技术与应用》公开课-ETH
  5. DCM 与CCM模式
  6. 国产低代码开发平台,这5个值得一试
  7. 四川水泥杂志四川水泥杂志社四川水泥编辑部2022年第11期目录
  8. 垃圾分类小程序拍照识别垃圾分类微信小程序开发源码
  9. 有关vista系统的激活工具
  10. 解决Windows10 14393版本迅雷崩溃问题