에러 예시
에러예시
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',
)