'send a poll in telethon telegram bot
How can i send a poll? I am trying the following code but it returns no error and the poll is not sent:
from typing import Optional
from telethon.sync import TelegramClient
from telethon.tl.types import *
from telethon.tl.functions.messages import *
def _build_poll(question: str, *answers: str, closed: Optional[bool] = None,
id: int = 0) -> InputMediaPoll:
"""Build a poll object."""
return InputMediaPoll(Poll(
id=id, question=question, answers=[
PollAnswer(text=i, option=bytes([idx]))
for idx, i in enumerate(answers)
],
closed=closed
))
poll = _build_poll(f"Question", "Answer 1", "Answer 2", "Answer 3")
message = client.send_message(-325188743, file=poll)
Is there any better way to submit a poll with telethon?
Solution 1:[1]
To send polls you need to construct the poll media object with the raw API types found in https://tl.telethon.dev/.
In your case, you need an example of sending would be to send a InputMediaPoll
as the example shows:
await client.send_message('@username',file=types.InputMediaPoll(
poll=types.Poll(
id=..., # type: long (random id)
question=..., # type: string (the question)
answers=... # type: list of PollAnswer (up to 10 answers)
)
))
With actual values:
from telethon.tl.types import InputMediaPoll, Poll, PollAnswer
await client.send_message("telethonofftopic",file=InputMediaPoll(
poll=Poll(
id=53453159,
question="Is it 2020?",
answers=[PollAnswer('Yes', b'1'), PollAnswer('No', b'2')]
)
))
Solution 2:[2]
This function creates a poll on quiz mode meaning there is only one correct answer, the functions gets the following arguments:
group which is the group id or the channel id () where you want to send the quiz. In order to obtain the group id / channel id, open telegram web and turn to the old version of telegram web click on the group/channel, in the url of the web page copy for example in the url -> "https://web.telegram.org/?legacy=1#/im?p=@IntiriorChannel" the IntiriorChannel part,
if it is private group copy the number in the url for example https://web.telegram.org/?legacy=1#/im?p=s1504616337_1547258548617074964 the id is 1504616337.
the answers argument suppose to be a list of possible answers(you can have between 1 to 10 answers) for instance ["10", "20", "30", "40", "50"].
the question argument is the question you want to be asked in the quiz
the correct_answer argument is the index+1 of the correct answer in the list of answers, for instance the correct answer is "10", then the correct_answer argument is 1, or if the answer is "40" then the correct_answer argument is 4.
from telethon.tl.types import Poll, PollAnswer, PollAnswerVoters,PollResults, MessageMediaPoll
from telethon import TelegramClient
client = TelegramClient("SessionBot", "api_id", "api_hash").start(bot_token="bot token")
async def build_quiz_poll(group: str, answers: list, question:str, correct_answer: int) -> None:
""" Create poll in quiz mode """
await client.send_message(group, file=MessageMediaPoll(
poll=Poll(
id=random.randint(0, 100_000),
question=question,
answers=[PollAnswer(text=option, option=bytes([i])) for i, option in
enumerate(answers, start=1)],
quiz=True
)
results=PollResults(
results=[PollAnswerVoters(option=bytes([correct_answer]),
voters=200_000, correct=True)],
)
))
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Lonami |
Solution 2 |