-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgroup_quotation.py
121 lines (108 loc) · 4.86 KB
/
group_quotation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import base64, os, random, nonebot, hoshino, time
from io import BytesIO
from PIL import Image
from hoshino import Service, aiorequests
from hoshino.typing import CQEvent
from nonebot import on_command, CommandSession
_path = os.path.join(os.path.dirname(__file__), 'image/')
if not os.path.exists(os.path.join(os.path.dirname(__file__), 'image')):
os.mkdir(os.path.join(os.path.dirname(__file__), 'image'))
sv = Service('群友语录', help_="")
headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) ",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-cn"
}
message_type = 1 #十连发送时的消息类型 1:转发消息 0:普通消息
def render_forward_msg(msg_list: list):
forward_msg = []
for msg in msg_list:
forward_msg.append({
"type": "node",
"data": {
"name": '某不愿透露姓名的小环奈', #修改这里可以让bot转发消息时显示其他人
"uin": '2779874515',
"content": msg
}
})
return forward_msg
def get_all_img_url(event): #从消息中提取图片URL
all_url = []
for i in event["message"]:
if i["type"] == "image":
all_url.append(i["data"]["url"])
return all_url
send_times = 0 #用于计算触发上传后发送了几句不含图片语句,超过3句将自动结束上传,防止卡死
async def save_img(image_url, gid): #保存图片
global send_times
try:
if len(image_url) == 0:
send_times += 1
return '', send_times
for url in image_url:
response = await aiorequests.get(url, headers=headers)
image = Image.open(BytesIO(await response.content))
if not os.path.exists(f'{_path}{gid}'):
os.mkdir(f'{_path}{gid}')
image.save(f'{_path}{gid}/{int(time.time())}.png')
return '图片保存成功\n', send_times
except:
return '保存失败\n', send_times
@on_command('upload', only_to_me=False, aliases=('上传图片', '上传语录')) #hoshino无法这样处理就用none了
async def upload(session: CommandSession):
gid = str(session.ctx["group_id"])
session.get('', prompt='发送要上传的图片,暂不支持gif') #开始捕获该用户的所有消息
global send_times
if session.current_arg != '结束': #不是结束就继续
all_img_url = get_all_img_url(session.ctx)
msg, times = await save_img(all_img_url, gid)
if times <= 3:
session.pause(msg.strip()) #暂停等待下次捕获消息
else:
send_times = 0
await session.finish('上传结束') #超过3句不含有图片内容将自动结束上传,防止卡死
await session.send('上传结束')
@sv.on_fullmatch("群友语录", only_to_me = True) #问就是hoshino用着顺手
async def send_group_img(bot, ev):
gid = str(ev.group_id)
try:
image_list = sorted(fn for fn in os.listdir(f'{_path}{gid}') if fn.endswith('.png')) #从指定目录下获取图片列表
image = Image.open(f'{_path}{gid}/{random.choice(image_list)}') #随机取一张图片进行缓存
buf = BytesIO()
image.save(buf, format='PNG')
base64_str = f'base64://{base64.b64encode(buf.getvalue()).decode()}'
await bot.send(ev, f'[CQ:image,file={base64_str}]') #发送图片
except:
await bot.send(ev, '没有语录哦')
@sv.on_fullmatch("语录十连", only_to_me = True)
async def send_group_10(bot, ev): #和单张发送类似
gid = str(ev.group_id)
try:
image_list = sorted(fn for fn in os.listdir(f'{_path}{gid}') if fn.endswith('.png'))
if len(image_list) < 10:
await bot.send(ev, '没有这么多库存哦')
return
msg_list = []
for i in range(10):
img_name = random.choice(image_list)
image = Image.open(f'{_path}{gid}/{img_name}')
image_list.remove(img_name)
buf = BytesIO()
image.save(buf, format='PNG')
base64_str = f'base64://{base64.b64encode(buf.getvalue()).decode()}'
msg_list.append(f'[CQ:image,file={base64_str}]')
if message_type:
msg = render_forward_msg(msg_list)
await hoshino.get_bot().send_group_forward_msg(group_id=ev.group_id, messages = msg)
else:
for msg in msg_list:
await bot.send(ev, msg)
except:
await bot.send(ev, '没有语录哦')
@sv.on_fullmatch('语录数量')
async def send_nums(bot, ev):
gid = str(ev.group_id)
try:
len_ = len(sorted(fn for fn in os.listdir(f'{_path}{gid}') if fn.endswith('.png')))
except Exception as e:
len_ = 0
await bot.send(ev,f'当前本群共计上传{len_}条语录哦') #发送图片