ashkan
ashkan

Reputation: 580

Send long message in telegram bot python

I have a telegram bot and I want to send a message
in which the error message will be returned to me

my code is :

            path = 'C:\\Bot\\Log\\aaa\\*.log' 
            files = glob.glob(path) 
            nlines= 0
            data = "Servers :  \n"
            for name in files: 
                    with open(name) as f:
                        for line in f  :
                            nlines += 1
                            if (line.find("Total") >= 0):
                                data += line
                                for i in range(5):
                                    data += next(f)
                                data += f'\n{emoji.emojize(":blue_heart:")} ----------------------------------------------------{emoji.emojize(":blue_heart:")}\n'    
                            if (line.find("Source") >= 0):
                                data += line

            query.edit_message_text(
                text=f"{data}",
                reply_markup=build_keyboard(number_list),
                  
            )

my error is :

telegram.error.BadRequest: Message_too_long   

According to this code model, how can I send my message to the bot?

Upvotes: 7

Views: 9752

Answers (4)

abdelgha4
abdelgha4

Reputation: 431

Starting from py3.12, you can use itertools.batched:

for msg_batch in itertools.batched(long_message, 4096):
    bot.send_message(message.chat.id, msg_batch) 

Upvotes: 2

Tal Folkman
Tal Folkman

Reputation: 2561

its still an open issue, but you can split your request for 4089 chars per send

you have 2 options:

if len(info) > 4096:
    for x in range(0, len(info), 4096):
        bot.send_message(message.chat.id, info[x:x+4096])
    else:
        bot.send_message(message.chat.id, info)

or

msgs = [message[i:i + 4096] for i in range(0, len(message), 4096)]
for text in msgs:
     update.message.reply_text(text=text)

Upvotes: 8

Hamid
Hamid

Reputation: 249

This code may works :

if len(info) > 4096:
    for x in range(0, len(info), 4096):
        bot.send_message(message.chat.id, info[x:x+4096])
    else:
        bot.send_message(message.chat.id, info)

Upvotes: 1

aafre
aafre

Reputation: 53

Since Telegram has limit of 4096 chars per message, one way to work around will be to break your message down into 4096 chars and then send it, and repeat till the end.

You can begin with something like:

def slice(val, start=1, stop=None):
    return val[start:stop]


limit = 4096
chars_arr = list(long_message)
length = len(chars_arr)
print(f"Long message length: {length} and limit is {limit}")

# Iterate for batches of 4096
print("".join(slice(chars_arr, 0, 4096)))

Upvotes: 0

Related Questions