telegram 群组监控 / 群组功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.5 KiB

import time
from telethon.tl.types import MessageEntityTextUrl, ChannelFull
from utils.upload_files import download_file
async def download_media(message, file="resources"):
"""
下载上传 媒体文件
:param message:
:param file:
:return:
"""
if file:
filename = await message.download_media(file=file) # 指定下载目录 组图会分为多个message传递
return filename
async def download_profile_photo(client, sender, file="profile"):
"""
下载用户头像
:param client:
:param sender:
:param file:
:return:
"""
if isinstance(sender, ChannelFull):
photo = sender.chat_photo
else: # UserProfilePhoto 对象 默认头像这个字段为None
photo = sender.photo
if photo:
path = await client.download_profile_photo(sender, file=file) # 下载头像
return path
async def get_messages(client, chat, message_id):
"""
获得某个群组指定id的聊天信息
:param client:
:param chat:
:param message_id:
:return:
"""
message = await client.get_messages(chat, ids=message_id)
print("message_1337!,", message)
return message
async def get_extra_linked(message):
"""
获取聊天中的超链接
:param message:
:return:
"""
entities = message.entities
message_text = message.message
other_link = []
if entities:
text_urls = [entry for entry in entities if isinstance(entry, MessageEntityTextUrl)]
for _ in text_urls:
url = _.url
text = message_text[_.offset: _.offset+_.length] # 内容可能由于某些字符导致偏移 造成只有原始文本的一部分
# logger.info(f"捕获到超链接:{text} => {url}")
other_link.append(dict(url=url, offset=_.offset, length=_.length))
return other_link
async def send_messages(client, user, messages, allow_status, file="resources"):
"""
发送消息
:param client:
:param user:
:param messages: {
"message": "", # 文本
"media_type": "",
"media_link": ""
}
:param allow_status:
:param file: 默认下载的路径
:return:
"""
result = ""
map_dict = {
"photos": ".jpg",
"videos": ".mp4",
"docs": "",
}
if messages:
content = messages.get("message")
media_type = f"send_{messages.get('media_type')}"
media_link = messages.get("media_link")
flag = 0
file_path = ""
if content and ("send_plain" in allow_status.keys()) and allow_status["send_plain"]: # 判断是否允许文本发送
flag += 1
if (media_type in allow_status.keys()) and allow_status[media_type]: # 判断是否允许媒体发送
time_stamp = str(int(time.time()))
file_type = map_dict[messages.get('media_type')] if map_dict[messages.get('media_type')] else \
media_link.split("/")[-1]
file_name = f"{file}/{time_stamp}{file_type}"
file_path = await download_file(media_link, file_name) # 先下载
flag += 2
if flag == 0:
result = "权限不支持"
elif flag == 1: # 只发文本
result = await client.send_message(user, content)
elif flag == 2: # 只发图片
result = await client.send_file(user, file_path)
elif flag == 3: # 图文发送
result = await client.send_message(user, content, file=file_path)
return result
else:
return result