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.

118 lines
3.5 KiB

8 months ago
  1. import time
  2. from telethon.tl.types import MessageEntityTextUrl, ChannelFull
  3. from utils.upload_files import download_file
  4. async def download_media(message, file="resources"):
  5. """
  6. :param message:
  7. :param file:
  8. :return:
  9. """
  10. if file:
  11. filename = await message.download_media(file=file) # 指定下载目录 组图会分为多个message传递
  12. return filename
  13. async def download_profile_photo(client, sender, file="profile"):
  14. """
  15. :param client:
  16. :param sender:
  17. :param file:
  18. :return:
  19. """
  20. if isinstance(sender, ChannelFull):
  21. photo = sender.chat_photo
  22. else: # UserProfilePhoto 对象 默认头像这个字段为None
  23. photo = sender.photo
  24. if photo:
  25. path = await client.download_profile_photo(sender, file=file) # 下载头像
  26. return path
  27. async def get_messages(client, chat, message_id):
  28. """
  29. id的聊天信息
  30. :param client:
  31. :param chat:
  32. :param message_id:
  33. :return:
  34. """
  35. message = await client.get_messages(chat, ids=message_id)
  36. print("message_1337!,", message)
  37. return message
  38. async def get_extra_linked(message):
  39. """
  40. :param message:
  41. :return:
  42. """
  43. entities = message.entities
  44. message_text = message.message
  45. other_link = []
  46. if entities:
  47. text_urls = [entry for entry in entities if isinstance(entry, MessageEntityTextUrl)]
  48. for _ in text_urls:
  49. url = _.url
  50. text = message_text[_.offset: _.offset+_.length] # 内容可能由于某些字符导致偏移 造成只有原始文本的一部分
  51. # logger.info(f"捕获到超链接:{text} => {url}")
  52. other_link.append(dict(url=url, offset=_.offset, length=_.length))
  53. return other_link
  54. async def send_messages(client, user, messages, allow_status, file="resources"):
  55. """
  56. :param client:
  57. :param user:
  58. :param messages: {
  59. "message": "", # 文本
  60. "media_type": "",
  61. "media_link": ""
  62. }
  63. :param allow_status:
  64. :param file:
  65. :return:
  66. """
  67. result = ""
  68. map_dict = {
  69. "photos": ".jpg",
  70. "videos": ".mp4",
  71. "docs": "",
  72. }
  73. if messages:
  74. content = messages.get("message")
  75. media_type = f"send_{messages.get('media_type')}"
  76. media_link = messages.get("media_link")
  77. flag = 0
  78. file_path = ""
  79. if content and ("send_plain" in allow_status.keys()) and allow_status["send_plain"]: # 判断是否允许文本发送
  80. flag += 1
  81. if (media_type in allow_status.keys()) and allow_status[media_type]: # 判断是否允许媒体发送
  82. time_stamp = str(int(time.time()))
  83. file_type = map_dict[messages.get('media_type')] if map_dict[messages.get('media_type')] else \
  84. media_link.split("/")[-1]
  85. file_name = f"{file}/{time_stamp}{file_type}"
  86. file_path = await download_file(media_link, file_name) # 先下载
  87. flag += 2
  88. if flag == 0:
  89. result = "权限不支持"
  90. elif flag == 1: # 只发文本
  91. result = await client.send_message(user, content)
  92. elif flag == 2: # 只发图片
  93. result = await client.send_file(user, file_path)
  94. elif flag == 3: # 图文发送
  95. result = await client.send_message(user, content, file=file_path)
  96. return result
  97. else:
  98. return result