Как отправить таблицы с помощью Telegram Bot API?
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит.
Ответы 6
Вы можете использовать разметку HTML или Уценка, чтобы отправить что-то вроде в HTML. Прямо как этот пример.
или он может преобразовать таблицу в изображение.
Установите для параметра Telegram API parse_mode значение HTML. и заверните сообщение в , но помните, что API Telegram не поддерживает вложенные теги.
| Tables | Are | Cool | |----------|:-------------:|------:| | col 1 is | left-aligned | $1600 | | col 2 is | centered | $12 | | col 3 is | right-aligned | $1 |
Результат в мессенджере Telegram:
Обновлено. Как преобразовать таблицы на картинке
На маленьких экранах смартфонов будет проблема. Так что этот метод не годится. Единственный вариант — преобразовать таблицы на картинке и отправить:
- Или вы можете преобразовать HTML в изображение, используя браузер без заголовка на вашем сервере.
- Или вы можете преобразовать HTML в изображение, используя здесь внешний API сервисы
- Или вы можете преобразовать HTML в изображение более сложным способом с помощью php GD
Как преобразовать таблицу в картинку?
Я нашел эту библиотеку — TableJs — которая решает эту проблему. Отлично работает в клиентах для настольных ПК, однако клиенты Android не отображали его должным образом.
```| Symbol | Price | Change | |--------|-------|--------| | ABC | 20.85 | 1.626 | | DEF | 78.95 | 0.099 | | GHI | 23.45 | 0.192 | | JKL | 98.85 | 0.292 |```
Вам необходимо установить параметр parse_mode = ParseMode.MARKDOWN_V2, чтобы это работало.
Форматирование текста как «Моноширинный» тоже работает
Импортируйте библиотеку «prettytable» в Python для форматирования таблицы:
import prettytable as pt from telegram import ParseMode from telegram.ext import CallbackContext, Updater def send_table(update: Updater, context: CallbackContext): table = pt.PrettyTable(['Symbol', 'Price', 'Change']) table.align['Symbol'] = 'l' table.align['Price'] = 'r' table.align['Change'] = 'r' data = [ ('ABC', 20.85, 1.626), ('DEF', 78.95, 0.099), ('GHI', 23.45, 0.192), ('JKL', 98.85, 0.292), ] for symbol, price, change in data: table.add_row([symbol, f'', f'']) update.message.reply_text(f'
', parse_mode=ParseMode.HTML) # or use markdown update.message.reply_text(f'``````', parse_mode=ParseMode.MARKDOWN_V2)Вы получите сообщение вроде:
+--------+-------+--------+ | Symbol | Price | Change | +--------+-------+--------+ | ABC | 20.85 | 1.626 | | DEF | 78.95 | 0.099 | | GHI | 23.45 | 0.192 | | JKL | 98.85 | 0.292 | +--------+-------+--------+
Как отправить таблицы с помощью Telegram Bot API?
Импортируйте библиотеку "prettytable" в Python для форматирования таблицы:
import prettytable as pt from telegram import ParseMode from telegram.ext import CallbackContext, Updater def send_table(update: Updater, context: CallbackContext): table = pt.PrettyTable(['Symbol', 'Price', 'Change']) table.align['Symbol'] = 'l' table.align['Price'] = 'r' table.align['Change'] = 'r' data = [ ('ABC', 20.85, 1.626), ('DEF', 78.95, 0.099), ('GHI', 23.45, 0.192), ('JKL', 98.85, 0.292), ] for symbol, price, change in data: table.add_row([symbol, f'', f'']) update.message.reply_text(f'
', parse_mode=ParseMode.HTML) # or use markdown update.message.reply_text(f'``````', parse_mode=ParseMode.MARKDOWN_V2)Вы получите сообщение вроде:
+--------+-------+--------+ | Symbol | Price | Change | +--------+-------+--------+ | ABC | 20.85 | 1.626 | | DEF | 78.95 | 0.099 | | GHI | 23.45 | 0.192 | | JKL | 98.85 | 0.292 | +--------+-------+--------+
Вы можете использовать разметку HTML или Markdown, чтобы отправить что-то вроде в HTML. Так же, как этот пример.
Вот мое решение, использующее puppeteer для снимка экрана элемента таблицы.
Прежде всего, вам нужно сгенерировать HTML-код таблицы, вот код для генерации этого кода.
async function generateHtml(rows) < return ` thead, tfoot < background-color: #3f87a6; color: #fff; >tbody < background-color: #e4f0f5; >caption < padding: 10px; caption-side: bottom; >table < border-collapse: collapse; border: 2px solid rgb(200, 200, 200); letter-spacing: 1px; font-family: sans-serif; font-size: .8rem; >td, th < border: 1px solid rgb(190, 190, 190); padding: 5px 10px; >td
` >
Pornhub Pages Summary $ ID Progress Stucked Finished Busy И вот код для генерации rows аргумент вышеуказанной функции
async function getTheImgOfTheSummaryOfThePages() < const rows = [] for (const [index, val] of statuesOfThePages.entries()) < const row = `
$ $ $ $ $ ` rows.push(row) > const path = './summaryOfThePagesOfPornhub.png' const html = await generateHtml(rows.join('\n')) await util.takescrrenshotOnTheHtml(html, browser, path, 'table') return path >А вот код скриншота элемента table
async function takescrrenshotOnTheHtml(html, browser, pathToSave, onElement) < const page = await newPage(browser); await page.setContent(html) const element = await page.$(onElement) await element.screenshot() await page.close() >
Ну, вам просто нужно изменить заголовки таблицы и строки таблицы
Я нашел эту библиотеку - TableJs - которая решает эту проблему. Отлично работает в клиентах для настольных ПК, однако клиенты Android не отображали его должным образом.
Formatting the text as "Monospace" works too
Я написал код для создания html-таблицы Telegram из массива строк.
Просто создайте массив со строками с данными столбцов, разделенными ";" и этот код выведет готовую таблицу Telegram.
Наслаждайтесь, разберитесь с параметрами 🙂
Вы должны использовать «parse_mode» = «html» при отправке сообщения в Telegram Api.
public string BuildTelegramTable( List table_lines, string tableColumnSeparator = "|", char inputArraySeparator = ';', int maxColumnWidth = 0, bool fixedColumnWidth = false, bool autoColumnWidth = false, int minimumColumnWidth = 4, int columnPadRight = 0, int columnPadLeft = 0, bool beginEndBorders = true) < var prereadyTable = new List() < "
" >; var columnsWidth = new List(); var firstLine = table_lines[0]; var lineVector = firstLine.Split(inputArraySeparator); if (fixedColumnWidth && maxColumnWidth == 0) throw new ArgumentException("For fixedColumnWidth usage must set maxColumnWidth > 0"); else if (fixedColumnWidth && maxColumnWidth > 0) < for(var x=0;xelse < for(var x=0;x columnFullLength = line.Split(inputArraySeparator)[x].Length > columnFullLength ? line.Split(inputArraySeparator)[x].Length : columnFullLength); columnFullLength = columnFullLength < minimumColumnWidth ? minimumColumnWidth : columnFullLength; var columnWidth = columnFullLength + columnPadRight + columnPadLeft; if (maxColumnWidth >0 && columnWidth > maxColumnWidth) columnWidth = maxColumnWidth; columnsWidth.Add(columnWidth); > > foreach(var line in table_lines) < lineVector = line.Split(inputArraySeparator); var fullLine = new string[lineVector.Length+(beginEndBorders ? 2 : 0)]; if (beginEndBorders) fullLine[0] = ""; for(var x=0;x dataLength ? dataLength : columnSizeWithoutTrimSize; var columnData = clearedData.Substring(0,dataCharsToRead); columnData = columnData.PadRight(columnData.Length + columnPadRight); columnData = columnData.PadLeft(columnData.Length + columnPadLeft); var column = columnData.PadRight(columnWidth); fullLine[x+(beginEndBorders ? 1 : 0)] = column; > if (beginEndBorders) fullLine[fullLine.Length - 1] = ""; prereadyTable.Add(string.Join(tableColumnSeparator,fullLine)); > prereadyTable.Add(" "); return string.Join("\r\n",prereadyTable); >
How to send Tables with Telegram Bot API
Set the Telegram API parse_mode parameter to HTML and wrap the message in , but remember that telegram API does not support nested tags.
| Tables | Are | Cool | |----------|:-------------:|------:| | col 1 is | left-aligned | $1600 | | col 2 is | centered | $12 | | col 3 is | right-aligned | $1 |
Result in Telegram messanger:
Updated. How convert the tables in the picture
There will be a problem on the small screens of smartphones. So this method is not good. The only option is to convert the tables in the picture and so send :
- Or you can convert HTML to image using a headerless browser on your server.
- Or you can convert HTML to image using here external API services
- Or you can convert HTML to image using more difficult way by php GD
Related Solutions
Telegram Bot – how to get a group chat id
In order to get the group chat id, do as follows:
- Add the Telegram BOT to the group.
- Get the list of updates for your BOT:
https://api.telegram.org/bot/getUpdates
https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
This is a sample of the response when you add your BOT into a group.
- Use the "id" of the "chat" object to send your messages.
- (If you created the new group with the bot and you only get <"ok":true,"result":[]>, remove and add the bot again to the group)
- Private chart only works in image argoprojlabs/argocd-notifications:v1.1.0 or above.
Javascript – Send a pdf file using telegram bot api
You can specify the file name and file type by using this code:
getImage("https://your.url/yourfile.pdf", function(err, data) < if(err)< throw new Error(err); >const fileOptions = < // Explicitly specify the file name. filename: 'mypdf.pdf', // Explicitly specify the MIME type. contentType: 'application/pdf', >; bot.sendDocument(msg.chat.id, data, <>, fileOptions); >);
NOTE: You MUST provide an empty object (<>) in place of Additional Telegram query options, if you have no query options to specify. For example,
// WRONG! // 'fileOptions' will be taken as additional Telegram query options.
bot.sendAudio(chatId, data, fileOptions);
bot.sendAudio(chatId, data, <>, fileOptions);