wangdang commited on
Commit
beddd73
·
verified ·
1 Parent(s): 515334c

Update forwarder.py

Browse files
Files changed (1) hide show
  1. forwarder.py +37 -19
forwarder.py CHANGED
@@ -40,25 +40,20 @@ async def save_last_ids(last_ids):
40
  json.dump(last_ids, f)
41
 
42
  def extract_slugs_from_text(text):
43
- """从文本中提取所有可能的 slug (32位十六进制)"""
44
  if not text:
45
  return []
46
- # 匹配 hdhive.com 的资源链接
47
  hdhive_pattern = r"https?://hdhive\.com/resource/(?:[^/]+/)?([a-f0-9]{32})"
48
  matches = re.findall(hdhive_pattern, text, re.IGNORECASE)
49
  if matches:
50
  return matches
51
- # 匹配任何 32 位十六进制字符串
52
  plain_pattern = r"\b([a-f0-9]{32})\b"
53
  matches = re.findall(plain_pattern, text, re.IGNORECASE)
54
  return matches
55
 
56
  def get_first_slug_from_message(message):
57
- """从消息中提取第一个 slug,并打印调试信息"""
58
  preview = message.text[:200] if message.text else "[无文本]"
59
  print(f"消息 {message.id} 内容预览: {preview}")
60
 
61
- # 1. 从消息实体中的链接 URL 提取
62
  if message.entities:
63
  print(f" 消息包含 {len(message.entities)} 个实体")
64
  for idx, entity in enumerate(message.entities):
@@ -66,12 +61,10 @@ def get_first_slug_from_message(message):
66
  print(f" 实体 {idx}: 类型 {entity_type}")
67
  entity_text = message.text[entity.offset:entity.offset+entity.length] if message.text else ""
68
  print(f" 实体文本: '{entity_text}'")
69
- # 获取 URL (MessageEntityTextUrl 有 url 属性,MessageEntityUrl 有 url 属性吗?)
70
  url = None
71
  if hasattr(entity, 'url'):
72
  url = entity.url
73
  elif entity_type == 'MessageEntityUrl':
74
- # 对于 MessageEntityUrl,url 就是实体文本本身
75
  url = entity_text
76
  if url:
77
  print(f" 实体 URL: {url}")
@@ -79,7 +72,6 @@ def get_first_slug_from_message(message):
79
  if slugs:
80
  print(f" 从实体提取到 slug: {slugs[0]}")
81
  return slugs[0]
82
- # 2. 从消息纯文本中提取
83
  if message.text:
84
  slugs = extract_slugs_from_text(message.text)
85
  if slugs:
@@ -114,15 +106,13 @@ def get_direct_link(slug):
114
  return None
115
 
116
  def replace_links_in_text(text, slug, direct_link):
117
- """将文本中所有出现的该 slug 对应的完整链接替换为直链"""
118
  if not text:
119
  return text
120
- # 匹配包含该 slug 的完整链接(包含 /resource/.../slug 形式)
121
- pattern = rf"(https?://hdhive\.com/resource/(?:[^/]+/)?{slug}|{slug})"
122
  return re.sub(pattern, direct_link, text, flags=re.IGNORECASE)
123
 
124
  async def send_modified_message(client, dest_entity, original_msg):
125
- # 跳过服务消息
126
  if isinstance(original_msg, MessageService):
127
  print(f"跳过服务消息 {original_msg.id}")
128
  return
@@ -140,17 +130,46 @@ async def send_modified_message(client, dest_entity, original_msg):
140
  print(f"直接转发消息 {original_msg.id}(解锁失败)")
141
  return
142
 
143
- # 有直链,需要替换文本
144
  if original_msg.text:
145
  new_text = replace_links_in_text(original_msg.text, slug, direct_link)
146
  if original_msg.media:
147
- # 发送替换后的文本,同时转发原消息(带媒体)
148
- await client.send_message(dest_entity, new_text)
149
- await client.forward_messages(dest_entity, original_msg)
150
- print(f"已发送替换文本并转发带媒体的原消息 {original_msg.id}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  else:
152
  await client.send_message(dest_entity, new_text)
153
- print(f"已发送替换后的消息 {original_msg.id}")
154
  else:
155
  await client.forward_messages(dest_entity, original_msg)
156
  print(f"直接转发无文本消息 {original_msg.id}")
@@ -259,7 +278,6 @@ async def main():
259
 
260
  for entity in source_entities:
261
  try:
262
- # 尝试实时监听(需要是公开频道或机器人有权限)
263
  await client.get_permissions(entity)
264
  @client.on(events.NewMessage(chats=entity))
265
  async def handler(event, dest=dest_entity):
 
40
  json.dump(last_ids, f)
41
 
42
  def extract_slugs_from_text(text):
 
43
  if not text:
44
  return []
 
45
  hdhive_pattern = r"https?://hdhive\.com/resource/(?:[^/]+/)?([a-f0-9]{32})"
46
  matches = re.findall(hdhive_pattern, text, re.IGNORECASE)
47
  if matches:
48
  return matches
 
49
  plain_pattern = r"\b([a-f0-9]{32})\b"
50
  matches = re.findall(plain_pattern, text, re.IGNORECASE)
51
  return matches
52
 
53
  def get_first_slug_from_message(message):
 
54
  preview = message.text[:200] if message.text else "[无文本]"
55
  print(f"消息 {message.id} 内容预览: {preview}")
56
 
 
57
  if message.entities:
58
  print(f" 消息包含 {len(message.entities)} 个实体")
59
  for idx, entity in enumerate(message.entities):
 
61
  print(f" 实体 {idx}: 类型 {entity_type}")
62
  entity_text = message.text[entity.offset:entity.offset+entity.length] if message.text else ""
63
  print(f" 实体文本: '{entity_text}'")
 
64
  url = None
65
  if hasattr(entity, 'url'):
66
  url = entity.url
67
  elif entity_type == 'MessageEntityUrl':
 
68
  url = entity_text
69
  if url:
70
  print(f" 实体 URL: {url}")
 
72
  if slugs:
73
  print(f" 从实体提取到 slug: {slugs[0]}")
74
  return slugs[0]
 
75
  if message.text:
76
  slugs = extract_slugs_from_text(message.text)
77
  if slugs:
 
106
  return None
107
 
108
  def replace_links_in_text(text, slug, direct_link):
 
109
  if not text:
110
  return text
111
+ # 匹配完整的 HDHive 链接
112
+ pattern = rf"(https?://hdhive\.com/resource/(?:[^/]+/)?{slug})"
113
  return re.sub(pattern, direct_link, text, flags=re.IGNORECASE)
114
 
115
  async def send_modified_message(client, dest_entity, original_msg):
 
116
  if isinstance(original_msg, MessageService):
117
  print(f"跳过服务消息 {original_msg.id}")
118
  return
 
130
  print(f"直接转发消息 {original_msg.id}(解锁失败)")
131
  return
132
 
 
133
  if original_msg.text:
134
  new_text = replace_links_in_text(original_msg.text, slug, direct_link)
135
  if original_msg.media:
136
+ try:
137
+ # 下载原图片
138
+ file_data = await client.download_media(original_msg.media, bytes)
139
+ # 获取原文件名或生成一个
140
+ file_name = None
141
+ if hasattr(original_msg.media, 'document') and original_msg.media.document:
142
+ attrs = original_msg.media.document.attributes
143
+ for attr in attrs:
144
+ if hasattr(attr, 'file_name') and attr.file_name:
145
+ file_name = attr.file_name
146
+ break
147
+ if not file_name:
148
+ ext = "jpg"
149
+ if hasattr(original_msg.media, 'photo'):
150
+ ext = "jpg"
151
+ elif hasattr(original_msg.media, 'document') and original_msg.media.document:
152
+ mime = original_msg.media.document.mime_type
153
+ if mime == 'image/png':
154
+ ext = 'png'
155
+ elif mime == 'video/mp4':
156
+ ext = 'mp4'
157
+ file_name = f"image_{original_msg.id}.{ext}"
158
+
159
+ await client.send_file(
160
+ dest_entity,
161
+ file_data,
162
+ caption=new_text,
163
+ force_document=False,
164
+ file_name=file_name
165
+ )
166
+ print(f"已发送替换后的消息(带图片) {original_msg.id}")
167
+ except Exception as e:
168
+ print(f"图片处理失败: {e},发送纯文本")
169
+ await client.send_message(dest_entity, new_text)
170
  else:
171
  await client.send_message(dest_entity, new_text)
172
+ print(f"已发送替换后的文本消息 {original_msg.id}")
173
  else:
174
  await client.forward_messages(dest_entity, original_msg)
175
  print(f"直接转发无文本消息 {original_msg.id}")
 
278
 
279
  for entity in source_entities:
280
  try:
 
281
  await client.get_permissions(entity)
282
  @client.on(events.NewMessage(chats=entity))
283
  async def handler(event, dest=dest_entity):