Update with combined scraping and forwarding
This commit is contained in:
committed by
GitHub
parent
9082136d6e
commit
f118e50940
@@ -306,7 +306,7 @@ class OptimizedTelegramScraper:
|
|||||||
|
|
||||||
if rule.forward_mode == "forward":
|
if rule.forward_mode == "forward":
|
||||||
await self.client.forward_messages(dest_entity, message)
|
await self.client.forward_messages(dest_entity, message)
|
||||||
print(f" ↪️ Forwarded message {message.id}")
|
print(f" Forwarded message {message.id}")
|
||||||
else:
|
else:
|
||||||
source_name = self.state.get('channel_names', {}).get(rule.source_channel, '')
|
source_name = self.state.get('channel_names', {}).get(rule.source_channel, '')
|
||||||
if source_channel_id:
|
if source_channel_id:
|
||||||
@@ -329,15 +329,15 @@ class OptimizedTelegramScraper:
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await self.client.send_message(dest_entity, copy_text)
|
await self.client.send_message(dest_entity, copy_text)
|
||||||
print(f" 📋 Copied message {message.id}")
|
print(f" Copied message {message.id}")
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except FloodWaitError as e:
|
except FloodWaitError as e:
|
||||||
print(f" ⏳ Rate limited, waiting {e.seconds}s...")
|
print(f" Rate limited, waiting {e.seconds}s...")
|
||||||
await asyncio.sleep(e.seconds)
|
await asyncio.sleep(e.seconds)
|
||||||
return await self.forward_message(message, rule, source_channel_id)
|
return await self.forward_message(message, rule, source_channel_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f" ❌ Failed to forward message {message.id}: {e}")
|
print(f" Failed to forward message {message.id}: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def setup_forwarding_handler(self):
|
async def setup_forwarding_handler(self):
|
||||||
@@ -385,7 +385,7 @@ class OptimizedTelegramScraper:
|
|||||||
if self.should_forward_message(message, rule):
|
if self.should_forward_message(message, rule):
|
||||||
source_name = self.state.get('channel_names', {}).get(rule.source_channel, rule.source_channel)
|
source_name = self.state.get('channel_names', {}).get(rule.source_channel, rule.source_channel)
|
||||||
dest_name = self.state.get('channel_names', {}).get(rule.destination_channel, rule.destination_channel)
|
dest_name = self.state.get('channel_names', {}).get(rule.destination_channel, rule.destination_channel)
|
||||||
print(f"\n📨 New message in {source_name} → forwarding to {dest_name}")
|
print(f"\n[{time.strftime('%H:%M:%S')}] New message in {source_name} -> forwarding to {dest_name}")
|
||||||
await self.forward_message(message, rule, chat_id)
|
await self.forward_message(message, rule, chat_id)
|
||||||
|
|
||||||
self.forwarding_handler = forwarding_handler
|
self.forwarding_handler = forwarding_handler
|
||||||
@@ -404,7 +404,7 @@ class OptimizedTelegramScraper:
|
|||||||
rules = self.get_forwarding_rules()
|
rules = self.get_forwarding_rules()
|
||||||
enabled_rules = [r for r in rules if r.enabled]
|
enabled_rules = [r for r in rules if r.enabled]
|
||||||
|
|
||||||
print(f"\n🚀 Forwarding service started!")
|
print(f"\nForwarding service started!")
|
||||||
print(f" Monitoring {len(enabled_rules)} rule(s)")
|
print(f" Monitoring {len(enabled_rules)} rule(s)")
|
||||||
print(" Press Ctrl+C to stop\n")
|
print(" Press Ctrl+C to stop\n")
|
||||||
|
|
||||||
@@ -416,22 +416,22 @@ class OptimizedTelegramScraper:
|
|||||||
if rule.forward_images: content_types.append("images")
|
if rule.forward_images: content_types.append("images")
|
||||||
if rule.forward_videos: content_types.append("videos")
|
if rule.forward_videos: content_types.append("videos")
|
||||||
if rule.forward_documents: content_types.append("documents")
|
if rule.forward_documents: content_types.append("documents")
|
||||||
print(f" • {source_name} → {dest_name}")
|
print(f" - {source_name} -> {dest_name}")
|
||||||
print(f" Mode: {rule.forward_mode} | Content: {', '.join(content_types)}")
|
print(f" Mode: {rule.forward_mode} | Content: {', '.join(content_types)}")
|
||||||
|
|
||||||
print("\n👀 Watching for new messages...\n")
|
print("\nWatching for new messages...\n")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await self.client.run_until_disconnected()
|
await self.client.run_until_disconnected()
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
pass
|
pass
|
||||||
except ConnectionError:
|
except ConnectionError:
|
||||||
print("\n⚠️ Connection lost. Returning to menu...")
|
print("\nConnection lost. Returning to menu...")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"\n⚠️ Forwarding stopped: {e}")
|
print(f"\nForwarding stopped: {e}")
|
||||||
finally:
|
finally:
|
||||||
self.forwarding_active = False
|
self.forwarding_active = False
|
||||||
print("\n⏹️ Forwarding service stopped")
|
print("\nForwarding service stopped")
|
||||||
|
|
||||||
async def manage_forwarding_rules(self):
|
async def manage_forwarding_rules(self):
|
||||||
while True:
|
while True:
|
||||||
@@ -959,6 +959,85 @@ class OptimizedTelegramScraper:
|
|||||||
finally:
|
finally:
|
||||||
self.continuous_scraping_active = False
|
self.continuous_scraping_active = False
|
||||||
|
|
||||||
|
async def continuous_scraping_with_forwarding(self):
|
||||||
|
self.continuous_scraping_active = True
|
||||||
|
self.forwarding_active = True
|
||||||
|
|
||||||
|
if not self.client.is_connected():
|
||||||
|
await self.client.connect()
|
||||||
|
|
||||||
|
rules = self.get_forwarding_rules()
|
||||||
|
enabled_rules = [r for r in rules if r.enabled]
|
||||||
|
forwarding_enabled = False
|
||||||
|
|
||||||
|
if enabled_rules:
|
||||||
|
forwarding_enabled = await self.setup_forwarding_handler()
|
||||||
|
|
||||||
|
print("\n" + "="*50)
|
||||||
|
print(" CONTINUOUS SCRAPING + FORWARDING SERVICE")
|
||||||
|
print("="*50)
|
||||||
|
|
||||||
|
if self.state['channels']:
|
||||||
|
print(f"\nScraping {len(self.state['channels'])} channel(s) every 60 seconds")
|
||||||
|
for channel in self.state['channels']:
|
||||||
|
channel_name = self.state.get('channel_names', {}).get(channel, 'Unknown')
|
||||||
|
print(f" - {channel_name} ({channel})")
|
||||||
|
else:
|
||||||
|
print("\nNo channels configured for scraping")
|
||||||
|
|
||||||
|
if forwarding_enabled:
|
||||||
|
print(f"\nForwarding {len(enabled_rules)} rule(s):")
|
||||||
|
for rule in enabled_rules:
|
||||||
|
source_name = self.state.get('channel_names', {}).get(rule.source_channel, rule.source_channel)
|
||||||
|
dest_name = self.state.get('channel_names', {}).get(rule.destination_channel, rule.destination_channel)
|
||||||
|
content_types = []
|
||||||
|
if rule.forward_text: content_types.append("T")
|
||||||
|
if rule.forward_images: content_types.append("I")
|
||||||
|
if rule.forward_videos: content_types.append("V")
|
||||||
|
if rule.forward_documents: content_types.append("D")
|
||||||
|
print(f" - {source_name} -> {dest_name} [{'/'.join(content_types)}]")
|
||||||
|
else:
|
||||||
|
print("\nNo forwarding rules enabled")
|
||||||
|
|
||||||
|
print("\n" + "="*50)
|
||||||
|
print("Press Ctrl+C to stop")
|
||||||
|
print("="*50 + "\n")
|
||||||
|
|
||||||
|
try:
|
||||||
|
async def scraping_loop():
|
||||||
|
while self.continuous_scraping_active:
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
for channel in list(self.state['channels'].keys()):
|
||||||
|
if not self.continuous_scraping_active:
|
||||||
|
break
|
||||||
|
channel_name = self.state.get('channel_names', {}).get(channel, 'Unknown')
|
||||||
|
print(f"\n[{time.strftime('%H:%M:%S')}] Checking: {channel_name}")
|
||||||
|
await self.scrape_channel(channel, self.state['channels'][channel])
|
||||||
|
|
||||||
|
if self.continuous_scraping_active:
|
||||||
|
elapsed = time.time() - start_time
|
||||||
|
sleep_time = max(0, 60 - elapsed)
|
||||||
|
if sleep_time > 0:
|
||||||
|
next_check = time.strftime('%H:%M:%S', time.localtime(time.time() + sleep_time))
|
||||||
|
print(f"\nNext scrape cycle at {next_check}")
|
||||||
|
await asyncio.sleep(sleep_time)
|
||||||
|
|
||||||
|
scraping_task = asyncio.create_task(scraping_loop())
|
||||||
|
|
||||||
|
await self.client.run_until_disconnected()
|
||||||
|
|
||||||
|
except asyncio.CancelledError:
|
||||||
|
pass
|
||||||
|
except ConnectionError:
|
||||||
|
print("\nConnection lost")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"\nService stopped: {e}")
|
||||||
|
finally:
|
||||||
|
self.continuous_scraping_active = False
|
||||||
|
self.forwarding_active = False
|
||||||
|
print("\nCombined service stopped")
|
||||||
|
|
||||||
def get_export_filename(self, channel: str):
|
def get_export_filename(self, channel: str):
|
||||||
username = self.state.get('channel_names', {}).get(channel, 'no_username')
|
username = self.state.get('channel_names', {}).get(channel, 'no_username')
|
||||||
return f"{channel}_{username}"
|
return f"{channel}_{username}"
|
||||||
@@ -1246,6 +1325,7 @@ class OptimizedTelegramScraper:
|
|||||||
print("="*40)
|
print("="*40)
|
||||||
print("[S] Scrape channels")
|
print("[S] Scrape channels")
|
||||||
print("[C] Continuous scraping")
|
print("[C] Continuous scraping")
|
||||||
|
print("[B] Combined scrape + forward")
|
||||||
print(f"[M] Media scraping: {'ON' if self.state['scrape_media'] else 'OFF'}")
|
print(f"[M] Media scraping: {'ON' if self.state['scrape_media'] else 'OFF'}")
|
||||||
print("[L] List & add channels")
|
print("[L] List & add channels")
|
||||||
print("[R] Remove channels")
|
print("[R] Remove channels")
|
||||||
@@ -1311,6 +1391,18 @@ class OptimizedTelegramScraper:
|
|||||||
await task
|
await task
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
elif choice == 'b':
|
||||||
|
if not self.state['channels'] and not any(r.get('enabled', True) for r in self.state.get('forwarding_rules', [])):
|
||||||
|
print("❌ No channels to scrape and no forwarding rules enabled.")
|
||||||
|
print(" Add channels with [L] or configure forwarding with [W] first.")
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
await self.continuous_scraping_with_forwarding()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
self.continuous_scraping_active = False
|
||||||
|
self.forwarding_active = False
|
||||||
|
print("\nStopping combined service...")
|
||||||
|
|
||||||
elif choice == 'e':
|
elif choice == 'e':
|
||||||
await self.export_data()
|
await self.export_data()
|
||||||
|
|||||||
Reference in New Issue
Block a user