하얀설표 블로그




해결)Bad Request: can\'t parse entities: Tag "span" must have class "tg-spoiler" at byte offset 35





( 수정됨)


에러 예시

에러예시

import telepot
token = {텔레그램봇 api 토큰}
id = {메세지 수신자 chat id}
text = '텔레그램봇 메세지 보내기<span class="tg-spoiler 123">메세지\n보내기</span>'
bot = telepot.Bot(token)
bot.sendMessage(
    chat_id=id,
    text=text,
    parse_mode='html',
)

>> Traceback (most recent call last):
  File "c:\seolpyo\example.py", line 6, in <module>
    bot.sendMessage(
  File "C:\seolpyo\Lib\site-packages\telepot\__init__.py", line 513, in sendMessage
    return self._api_request('sendMessage', _rectify(p))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\Lib\site-packages\telepot\__init__.py", line 491, in _api_request
    return api.request((self._token, method, params, files), **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\Lib\site-packages\telepot\api.py", line 155, in request
    return _parse(r)
           ^^^^^^^^^
  File "C:\seolpyo\Lib\site-packages\telepot\api.py", line 150, in _parse
    raise exception.TelegramError(description, error_code, data)
telepot.exception.TelegramError: ('Bad Request: can\'t parse entities: Tag "span" must have class "tg-spoiler" at byte offset 35', 400, {'ok': False, 'error_code': 400, 'description': 'Bad Request: can\'t parse entities: Tag "span" must have class "tg-spoiler" at byte offset 35'})

해결방법

span 대신 tg-spoiler 태그를 설정하거나, span의 class를 하나만 설정한다.

설명

설명을 읽기 전에, 원활한 이해를 돕기 위해 내가 이전에 작성한 "telepot.exception.TelegramError: ('Bad Request: can\'t parse entities: Unsupported start tag "br" at byte offset 35', 400, {'ok': False, 'error_code': 400, 'description': 'Bad Request: can\'t parse entities: Unsupported start tag "br" at byte offset 35'})" 문제 해결방법을 확인하고 오길 바란다.

텔레그램 bot api에서는 span 태그를 허용한다. 그러나, span 태그를 허용하는 이유는 span의 class가 tg-spoiler일 경우를 위한 것이지, 그 외 다른 속성들을 위한 것이 아니다.
그렇기 때문에 span 태그의 class가 tg-spoiler 단일 속성이 아니라면 unescape하거나, 단일 class로 변경해줘야 한다.

이 경우 예시코드는 다음과 같이 작성할 수 있다.
예시코드를 작동한 경우 다음과 같은 메세지를 텔레그램으로 받아볼 수 있다.

<span class="tg-spoiler 123">메세지
보내기</span>메세지
보내기

import telepot
import html
import bs4
def convert_by_seolpyo(text: str):
    soup = bs4.BeautifulSoup(text, 'html.parser')
    text_by_seolpyo = ''
    for i in soup:
        if i.name in {'span'}:
            list_class = i.get_attribute_list('class')
            if list_class == ['tg-spoiler']:
                text_by_seolpyo += str(i)
            else:
                text_by_seolpyo += html.escape(str(i))
    return text_by_seolpyo
token = {텔레그램봇 api 토큰}
id = {메세지 수신자 chat id}
text = '텔레그램봇 메세지 보내기\n<span class="tg-spoiler 123">메세지\n보내기</span>\n<span class="tg-spoiler">메세지\n보내기</span>'
bot = telepot.Bot(token)
bot.sendMessage(
    chat_id=id,
    text=convert_by_seolpyo(text),
    parse_mode='html',
)


공감 : 0







white.seolpyo.com