Question
I’ve joined a certain Telegram channel with two different Telegram accounts. I run the below code to start both sessions using Pyrogram and print the received messages. However, I noticed that when a message is received on the Telegram channel, only one of the sessions prints it while the other doesn’t. When I tested using my own test Telegram channel, both sessions printed the message as expected. I’m at a loss why this problem happens with the other channel. Both accounts are subscribed to the channel, and the message is seen on both phones. What could possibly cause this behavior?
Here’s the code I’m using:
#!/usr/bin/python3 from pyrogram import Client, filters, idle from pyrogram.handlers import MessageHandler import config from pytz import timezone from datetime import datetime import requests import asyncio CHANNEL_ID = -1000123456789 def india_number_handler(client, message): message_handler('india_number', message) def uk_number_handler(client, message): message_handler('uk_number', message) def message_handler(session_name, message): if message.sender_chat is not None and message.sender_chat.id == CHANNEL_ID and message.text is not None: print(datetime.now().strftime('%d-%m-%Y-%H:%M:%S-%f') + ': ' + session_name + ' received channel message: ' + message.text, flush=True) async def main(): app_india = Client("india_number", api_id=config.getEnv("api_id"), api_hash=config.getEnv("api_hash")) app_uk = Client("uk_number", api_id=config.getEnv("api_id"), api_hash=config.getEnv("api_hash")) app_india.add_handler(MessageHandler(india_number_handler)) app_uk.add_handler(MessageHandler(uk_number_handler)) await app_india.start() await app_uk.start() await idle() await app_india.stop() await app_uk.stop() asyncio.run(main())
Answer
To address the issue where only one of your sessions receives and prints messages from a specific Telegram channel, while both accounts receive messages on the mobile app, you need to consider several factors. This can be caused by session misconfiguration, API limitations, or other unexpected behavior in the code or the Telegram API. Here’s a detailed troubleshooting guide to help you identify and resolve the issue.
Detailed Troubleshooting Guide
1. Verify Both Sessions Are Subscribed
Ensure both accounts are subscribed to the channel and have permission to receive messages. This might sound basic, but it’s essential to confirm that both accounts have the necessary permissions.
2. Check API Limits and Restrictions
Telegram imposes various API rate limits. Make sure you are not hitting any rate limits that could affect one of the accounts. Review the Telegram API documentation for details on limits and how to handle them.
3. Add Logging for Debugging
Enhance your code with additional logging to understand the flow better and catch any potential issues. Log when each session starts, when handlers are added, and any exceptions that might occur.
4. Ensure Proper Session Initialization
Make sure both sessions are correctly initialized and running. A misconfiguration in session setup might cause one session to not function correctly.
5. Verify Handler Attachment
Double-check that the handlers are properly attached to each session. Handlers must be set correctly for each client instance to ensure they can handle incoming messages.
6. Examine Channel and Message Properties
Ensure the message properties, such as sender_chat
and sender_chat.id
, are correctly checked. A mismatch or typo here can prevent messages from being correctly identified and processed.
Updated Code with Enhanced Logging
Here’s an updated version of your script with enhanced logging and error handling to help identify the issue:
#!/usr/bin/python3 from pyrogram import Client, filters, idle from pyrogram.handlers import MessageHandler import config from datetime import datetime import asyncio CHANNEL_ID = -1000123456789 def india_number_handler(client, message): message_handler('india_number', message) def uk_number_handler(client, message): message_handler('uk_number', message) def message_handler(session_name, message): if message.sender_chat is not None and message.sender_chat.id == CHANNEL_ID and message.text is not None: print(f"{datetime.now().strftime('%d-%m-%Y-%H:%M:%S-%f')}: {session_name} received channel message: {message.text}", flush=True) else: print(f"{datetime.now().strftime('%d-%m-%Y-%H:%M:%S-%f')}: {session_name} received a non-matching message", flush=True) async def main(): app_india = Client("india_number", api_id=config.getEnv("api_id"), api_hash=config.getEnv("api_hash")) app_uk = Client("uk_number", api_id=config.getEnv("api_id"), api_hash=config.getEnv("api_hash")) app_india.add_handler(MessageHandler(india_number_handler)) app_uk.add_handler(MessageHandler(uk_number_handler)) try: await app_india.start() print("India session started") except Exception as e: print(f"Failed to start India session: {e}", flush=True) try: await app_uk.start() print("UK session started") except Exception as e: print(f"Failed to start UK session: {e}", flush=True) await idle() await app_india.stop() print("India session stopped") await app_uk.stop() print("UK session stopped") asyncio.run(main())
Additional Considerations
- Server-Side Logs: Check the logs on the Telegram server to see if there are any indications of why messages might not be delivered to one of the sessions.
- Network Issues: Verify that there are no network issues affecting one of the sessions. A network issue might prevent the message from being received by one of the clients.
- Pyrogram Version: Ensure you are using the latest version of Pyrogram, as updates often include bug fixes and improvements.
Conclusion
By enhancing logging and systematically checking each part of your setup, you should be able to identify why one of your sessions isn’t receiving messages. This process ensures that your Telegram bot or client handles messages reliably across multiple sessions.