Search code examples
pythontelegramtelegram-bottelegram-apipyrogram

Split message telegram bot pyrogram


I have written an code to copy messages from source to destination chats used pyrogram python library. Code work fine, but its making absolute copy of messages from source chat.

Example of my code:

#!/usr/bin/env python3
from pyrogram import Client
from pyrogram import filters

# ~~~~~~ CONFIG ~~~~~~~~ #
ACCOUNT = "@account"
PHONE_NR = 'number'

API_ID = APIID
API_HASH = "APIHASH"

app = Client( ACCOUNT, phone_number=PHONE_NR, api_id=API_ID, api_hash=API_HASH )

### CHAT ID

# Variables
SOURCE_CHAT_A = chat_id
TARGET_CHAT_A = chat_id
# ~~~~~~~~~~~~~~~~~~~~~~ #

# Commands
@app.on_message(filters.chat(SOURCE_CHAT_A))
def copy_to_channel(client, message):
    message.copy(  chat_id=TARGET_CHAT_A  ) 

app.run()

Is it possible to split message in pieces and print big messages from source chat as few small messages in destination chat?

For example, if it is message from source chat:

Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 

Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage  

Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 

Than in destination chat will come 3 separated messages:

Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage  
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 
Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage Testmessage 

My python level is absolutely not high enough, im sitting already a week with that problem and cant found a solution. Thanks for any type of help :)


Solution

  • Say you want to split on the double newline characters, you could do it like this:

    @app.on_message(filters.chat(SOURCE_CHAT_A))
    def copy_to_channel(client, message):
        # split message text on double newlines
        messages = message.text.split("\n\n")
        # send each message to the target chat
        for message in messages:
            client.send_message(TARGET_CHAT_A, message)
    

    Or to split the message on 300 characters you can use string slicing. Loop on a range that increments with 300 to get the starting index of each batch, then send the sliced string:

    @app.on_message(filters.chat(SOURCE_CHAT_A))
    def copy_to_channel(client, message):
        # split message into batches of 300 characters
        for i in range(0, len(message.text), 300):
            client.send_message(
                chat_id=SOURCE_CHAT_B,
                text=message.text[i:i+300]
            )