LINUX.ORG.RU

Экранирование маркдауна для телеграма

 ,


0

1

Телеграм бот на питоне.

Контент генерирует GPT chat, выдает его в каком то маркдауне очень похожем на телеграмовский.

Отправляется с парсером = 'markdown'.

Иногда в тексте появляется что то что вызывает ошибку парсера.

Я в таком случае пытаюсь исправить но явно делаю это не правильно, получается переэкранирование, текст проходит через парсер но в нем появляется много лишних символов \. Я просто не знаю что конкретно не нравится парсеру Ж(

Может есть у кого готовое решение.

def escape_markdown(text):
    """функция для экранирования символов перед отправкой в маркдауне телеграма"""
    pattern = r"([_*\[\]()~|`])"
    return re.sub(pattern, r"\\\1", text)

★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Итого, с нас функция, которая делает тождественное преобразование, но на секретном вводе вместо этого должна выдать неизвестно какой вывод? Это тебе, милок, в октябре приходить надо.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Итого, с нас функция, которая делает тождественное преобразование, но на секретном вводе вместо этого должна выдать неизвестно какой вывод? Это тебе, милок, в октябре приходить надо.

не понял тебя милок. если у тебя есть телеграм боты выдающие произвольный текст в чат то должны быть функции для его подготовки

theurs ★★
() автор топика
Ответ на: комментарий от theurs

Телепаты в отпуске, милок. Если не напишешь даже примера проблемного текста, то куковать тебе до их возвращения.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)

А библиотеку для телеграма какую-нибудь используете? Обычно в них есть хелпер для этого.

https://pythontelegramrobot.readthedocs.io/en/latest/telegram.utils.helpers.html#telegram.utils.helpers.escape_markdown

Ну или можно подсмотреть реализацию.

https://github.com/python-telegram-bot/python-telegram-bot/blob/master/telegram/helpers.py#L44

alois
()
Ответ на: комментарий от alois

хелпер есть но он тоже делает переэкранирование в этом случае. что то в последнее время не было такого глюка. будем подождать

если кто хочет посмотреть потестить то оно лежит здесь https://github.com/theurs/tb1

тестовый бот работает https://t.me/kun4sun_bot

theurs ★★
() автор топика
Ответ на: комментарий от theurs

Валидный маркдаун с точки зрения неизвестной тулзы 1 не потребляется неизвестной тулзой 2 по секретным причинам? И я сейчас типа должен выкатить общее решение? А люди-то идиоты, commonmarkи придумывают, а можно - то было просто на ЛОРе спросить и бам, готовое решение на питоне.

t184256 ★★★★★
()
Ответ на: комментарий от theurs

как разрезать на части текст с маркдауном так что бы не сломать мардаун

Достаточно посмотреть, как это сделано в телеге - отдельно плейн текст, отдельно entities - список позиций с-по и типом разметки для этой подстроки.

vvn_black ★★★★★
()
Ответ на: комментарий от theurs

сообщение которое не смогло пройти через парсер=markdown

не вижу в нем ничего такого что могло бы сломать парсер

Для отправки сообщения в личное сообщение тому, кто написал сообщение в общий чат, нужно использовать метод `send_message` с chat_id юзера, который можно получить из объекта `message` с помощью `message.from_user.id`. Пример кода на Python:

```python
import telebot

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(content_types=['text'])
def handle_text_message(message):
    chat_id = message.from_user.id
    text = message.text
    bot.send_message(chat_id, f"Ответ на ваше сообщение: {text}")

bot.polling(none_stop=True)
```

Бот отправляет сообщение в личный чат с юзером, который отправил сообщение в общий чат.

theurs ★★
() автор топика

Я так понял что с маркдауном ничего не получится. Даже найти не могу все теги которые у меня бы сработали. С хтмл всё работает.

Надо как то сконвертировать маркдауны от GPTchat и Bing AI, в хтмл для телеграма (или хоть в какой-нибудь), чем это можно сделать в питоне?

Отличаются немного, спойлер разный.

[12-06-2023 23:10:03] [GPTChat]: Конечно, вот пример:
**жирный**
*наклонный*
<u>подчеркнутый</u>
~~перечеркнутый~~
`одной ширины`
```python
print("Hello, World!")
```
|||спойлер (скрытый текст)|||
[ссылка](https://www.google.com/) с подписью


[12-06-2023 23:12:31] [BingAI]: Здравствуйте, это Bing. Я могу показать вам примеры текста, отформатированного по вашему запросу. Вот они:
- **Жирный**
- *Наклонный*
- <u>Подчеркнутый</u>
- ~~Перечеркнутый~~
- `Одной ширины`
- ```python
# Код на языке Python
def hello():
    print("Привет, мир!")
```
- >!Спойлер (скрытый текст)!<
- [Ссылка с подписью](https://www.bing.com)

Что-то еще я могу для вас сделать? 😊

theurs ★★
() автор топика
Ответ на: комментарий от theurs

если использовать https://pypi.org/project/Markdown/

то перечеркнутый не конвертируется вообще. спойлеры оба тоже

код у GPT с мусором(неправильно сделан) а у бинга вообще не определился

    html = markdown.markdown(help)
    html = html.replace('<p>', '')
    html = html.replace('</p>', '')
    html = html.replace('<h1>', '')
    html = html.replace('</h1>', '')


[12-06-2023 23:10:03] [GPTChat]: Конечно, вот пример:
<strong>жирный</strong>
<em>наклонный</em>
<u>подчеркнутый</u>
~~перечеркнутый~~
<code>одной ширины</code>
<code>python
print("Hello, World!")</code>
|||спойлер (скрытый текст)|||
<a href="https://www.google.com/">ссылка</a> с подписью

[12-06-2023 23:12:31] [BingAI]: Здравствуйте, это Bing. Я могу показать вам примеры текста, отформатированного по вашему запросу. Вот они:
- <strong>Жирный</strong>
- <em>Наклонный</em>
- <u>Подчеркнутый</u>
- ~~Перечеркнутый~~
- <code>Одной ширины</code>
- ```python
Код на языке Python
def hello():
    print("Привет, мир!")
```
- &gt;!Спойлер (скрытый текст)!&lt;
- <a href="https://www.bing.com">Ссылка с подписью</a>
Что-то еще я могу для вас сделать? 😊

theurs ★★
() автор топика
Ответ на: комментарий от theurs

почти написал конвертер из этих маркдаунов в хтмл. не получается только заменить символы <>&'" на их безопасные аналоги так что бы не испортить разрешенные теги

def html(text: str) -> str:
    """конвертирует маркдаун который генерируют gpt chat и bing ai в html коды телеграма"""

    html = re.sub(r'\*\*(.*?)\*\*', r'<b>\1</b>', html)
    html = re.sub(r'\*(.*?)\*', r'<i>\1</i>', html)
    html = re.sub(r'\~\~(.*?)\~\~', r'<s>\1</s>', html)

    code_pattern = r"```([a-z]+)\n([\s\S]+?)\n```"
    replacement = r"<pre language='\1'>\2</pre>"
    html = re.sub(code_pattern, replacement, html)

    spoiler_pattern = r"\|\|\|([\s\S]*?)\|\|\|"
    replacement = r'<span class="tg-spoiler">\1</span>'
    html = re.sub(spoiler_pattern, replacement, html)

    html = re.sub(r'>!(.*?)!<', r'<span class="tg-spoiler">\1</span>', html)

    html = re.sub(r'\`(.*?)\`', r'<code>\1</code>', html)

    regex = re.compile(r'\[([^\]]+)\]\((https?://[^\)]+)\)')
    html = regex.sub(r'<a href="\2">\1</a>', html)

    return html

theurs ★★
() автор топика