Polls 2.0: Visible Votes, Multiple Answers, and Quiz Mode
Since we first added polls for groups and channels, they’ve been used for everything from deciding where to have lunch to organizing leaderless protests. Today we’re expanding the range of possibilities with three new kinds of Telegram polls.
Visible Votes
Previously, all polls on Telegram were anonymous. With this update, you can create polls that allow everyone in the group to see who voted for what. Now you will know exactly which friends you disagree with on the matter of pineapple and pizza.
Naturally, you can still create anonymous polls to make sure nobody finds out it was you who voted for broccoli instead of cookies.
Multiple Answers
One of the best ways to settle the score is with polls that allow people to select multiple answers. Scheduling events, or choosing a playlist of songs for a party – sometimes you need more than one choice.
Our aunt who has a knack for statistics and exploring bizarre correlations kept asking for this feature – and we just couldn’t say no. (33% of developers who didn’t refuse this request were also found to be addicted to cheese.)
Quiz Mode
For the game show guru and “Who Wants To Be A Millionaire” contestant in all of us, polls now have Quiz Mode. Such polls have one correct answer and can power anything from trivia games to public service exams.
As if guessing right wasn’t sweet enough, correct answers will trigger a shower of confetti.
Creating Polls
Polls can be created in groups or channels (they feel lonely in one-on-one chats). Simply choose the “Poll” option in the attachment menu. Type in your question, add answer options, choose the settings that fit your purpose best – and you’re ready to go:
Bot API and Quiz Bot
All the new poll types are supported in today’s update to our Bot API, so bot developers can build on this new functionality.
As an example, we’ve created a Quiz Bot that lets you create multi-question quizzes and share them with others. It also lets you add text or media before questions to help create exam-style prompts with graphs and tables – or better yet, your own Know Your Meme tests.
Once your quiz is ready, you can share it to a group or channel – or invite users to answer questions privately, in a chat with the bot. To see how this works, try our demo quiz: Who is Who in the ‘Great Minds’ sticker pack.
The bot will keep tabs on how many questions users got right and how much time it took them to complete the quiz. It also keeps a global leaderboard for each quiz you create.
Message Corners
In addition to the new polls, our apps just got a new visual setting. If you find your Telegram messages too hip to be square (or round, depending on your platform), you can tweak the appearance of message bubbles in Settings:
Download Progress Counters on Android
Just like on iOS, Android users can now see exact progress counters when downloading or uploading files – if they’re in the mood to count bits and bytes.
And that’s it for today. Here’s to a good new year full of updates. Stay tuned!
January 23, 2020
The Telegram Team
Роутеры, многофайловость и структура бота¶
В этой главе мы познакомимся с новой фичей aiogram 3.x — роутерами, научимся разбивать наш код на отдельные компоненты, а также сформируем базовую структуру бота, которая пригодится в следующих главах и вообще по жизни.
Точка входа в приложение¶
Театр начинается с вешалки, а бот начинается с точки входа. Пусть это будет файл bot.py . В нём мы определим асинхронную функцию main() , в которой создадим необходимые объекты и запустим поллинг. Какие объекты являются необходимыми? Во-первых, разумеется, бот. Их может быть несколько, но об этом как-нибудь в другой раз. Во-вторых, диспетчер. Он занимается приёмом событий от Telegram и раскидыванием их по хэндлерам через фильтры и мидлвари.
import asyncio from aiogram import Bot, Dispatcher # Запуск бота async def main(): bot = Bot(token="TOKEN") dp = Dispatcher() # Запускаем бота и пропускаем все накопленные входящие # Да, этот метод можно вызвать даже если у вас поллинг await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())
Но чтобы обрабатывать сообщения, этого недостаточно, нужны ещё хэндлеры. Мы хотим их расположить в других файлах, чтобы не устраивать портянки на несколько тысяч строк. В предыдущих главах все наши хэндлеры прицеплялись к диспетчеру, но сейчас он внутри функции и мы точно не хотим делать его глобальным объектом.
Что же делать? И тут на помощь приходят.
Роутеры¶
Обратимся к официальной документации aiogram 3.x и посмотрим на следующее изображение:

- Диспетчер — корневой роутер.
- Хэндлеры цепляются к роутерам.
- Роутеры могут быть вложенными, но между ними только однонаправленная связь.
- Порядок включения (и, соответственно, проверки) роутеров явно определён.
На следующем изображении виден порядок поиска апдейтом нужного хэндлера для выполнения:

Напишем простенького бота с двумя фичами:
- Если боту отправили /start , он должен прислать вопрос и две кнопки с текстами «Да» и «Нет».
- Если боту прислали любой другой текст, стикер или гифку, он должен ответить названием типа сообщения.
Начнём с клавиатуры: создадим рядом с файлом bot.py каталог keyboards , а внутри него файл for_questions.py и напишем функцию для получения простой клавиатуры с кнопками «Да» и «Нет» в один ряд:
keyboards/for_questions.py
from aiogram.types import ReplyKeyboardMarkup from aiogram.utils.keyboard import ReplyKeyboardBuilder def get_yes_no_kb() -> ReplyKeyboardMarkup: kb = ReplyKeyboardBuilder() kb.button(text="Да") kb.button(text="Нет") kb.adjust(2) return kb.as_markup(resize_keyboard=True)
Ничего сложного, тем более, что мы клавиатуры подробно разбирали ранее. Теперь рядом с файлом bot.py создадим другой каталог handlers , а внутри него файл questions.py .
handlers/questions.py
from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message, ReplyKeyboardRemove from keyboards.for_questions import get_yes_no_kb router = Router() # [1] @router.message(Command("start")) # [2] async def cmd_start(message: Message): await message.answer( "Вы довольны своей работой?", reply_markup=get_yes_no_kb() ) @router.message(F.text.lower() == "да") async def answer_yes(message: Message): await message.answer( "Это здорово!", reply_markup=ReplyKeyboardRemove() ) @router.message(F.text.lower() == "нет") async def answer_no(message: Message): await message.answer( "Жаль. ", reply_markup=ReplyKeyboardRemove() )
Обратим внимание на пункты [1] и [2]. Во-первых, мы в файле создали свой собственный роутер уровня модуля, и далее будем цеплять его к корневому роутеру (диспетчеру). Во-вторых, хэндлеры «отпочковываются» уже от локального роутера.
Аналогичным образом сделаем второй файл с хэндлерами different_types.py , где просто будем выводить тип сообщения:
handlers/different_types.py
from aiogram import Router, F from aiogram.types import Message router = Router() @router.message(F.text) async def message_with_text(message: Message): await message.answer("Это текстовое сообщение!") @router.message(F.sticker) async def message_with_sticker(message: Message): await message.answer("Это стикер!") @router.message(F.animation) async def message_with_gif(message: Message): await message.answer("Это GIF!")
Наконец, вернёмся к нашему bot.py , импортируем файлы с роутерами и хэндлерами, и подключим их к диспетчеру:
import asyncio from aiogram import Bot, Dispatcher from handlers import questions, different_types # Запуск бота async def main(): bot = Bot(token="TOKEN") dp = Dispatcher() dp.include_routers(questions.router, different_types.router) # Альтернативный вариант регистрации роутеров по одному на строку # dp.include_router(questions.router) # dp.include_router(different_types.router) # Запускаем бота и пропускаем все накопленные входящие # Да, этот метод можно вызвать даже если у вас поллинг await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())
Мы просто импортируем файлы из каталога handlers/ и подключаем роутеры из этих файлов к диспетчеру. И здесь снова важен порядок импортов! Если мы поменяем местами регистрацию роутеров, то на команду /start бот будет отвечать фразой «Это текстовое сообщение!», поскольку функция message_with_text() первой успешно пройдёт все фильтры. Но о самих фильтрах мы поговорим чуть позже, а пока рассмотрим ещё один вопрос.
Итог¶
У нас получилось аккуратно разделить бота по разным файлам, не нарушая его работу. Примерное дерево файлов и каталогов получилось следующим (здесь сознательно пропущены некоторые несущественные для примера файлы):
├── bot.py ├── handlers │ ├── different_types.py │ └── questions.py ├── keyboards │ └── for_questions.py
В дальнейшем мы будем придерживаться такой структуры, плюс добавятся новые каталоги для фильтров, мидлварей, файлов для работы с базами данных и т.д.
В Telegram обновили функцию опросов и запустили Quiz Bot

Мессенджер Telegram выпустил крупное обновление для Android и iOS. Ряд обновлений коснулся функции опросов.
Опросы получили опцию видимых голосов. Теперь в своем канале можно продемонстрировать, кто и за какой вариант проголосовал, а также появилась возможность дать больше одного ответа. При этом функция анонимных опросов сохранена.

В Bot API добавлен режим викторины и для демонстрации его возможностей запущен Quiz Bot, который позволяет создавать опросы с множеством вопросов, изображениями и дополнительным текстом. Бот будет отслеживать, сколько времени пользователи тратят на опрос и сколько правильных ответов они дают. Он также сохранит глобальный список лидеров для каждого теста.

В приложении появились также новые визуальные настройки. Углы сообщений можно округлять и наоборот.
Кроме того, пользователи Android теперь могут видеть точные счетчики прогресса при загрузке файлов.

- «TelegramBot инструкция по созданию базового функционала для бота. (Часть 1)»
- «TelegramBot. Базовый функционал. Мухи отдельно, котлеты отдельно. (Часть 2)»
- «TelegramBot. Базовый функционал. Стикеры и смайлы. (Часть 3)»
- «Telegram-бот для управления инфраструктурой»
- «Как я делал поисковик для Telegram»
Telegram добавил новый инструмент для проведения опросов Статьи редакции
В Telegram появился инструмент для проведения анонимных опросов. Такой опрос выглядит как обычное сообщение — его можно переслать в другой чат или канал для повышения охвата, а также закрепить в беседе.
38K открытий
96 комментариев
Написать комментарий.
Это конечно круто.
Но когда они сделают разделения на группы, контакты и страницы блин.
Развернуть ветку
когда они сделают разделения на группы, контакты и страницы
пусть еще стену вернут!
Развернуть ветку
И ботов! Дико бесит, что все боты в перемешку с чатами
Развернуть ветку
Еще в разработке, но скоро будет можно пользоваться.
Egram — Telegram client for Desktop
Развернуть ветку
3 комментария
Ура, я не один такой, кому это нужно.
Развернуть ветку
1 комментарий
Именно по этой причине пользуюсь Plus Messenger
Развернуть ветку
10 комментариев
В официальном клиенте этого не будет никогда. Как вы ни поймёте, что это сознательная позиция Дурова, направленная на повышение активности и охвата, а как следствие — траффика.
Нужны вкладки — иранские форки к вашим услугам.
Развернуть ветку
Рекомендую такой вот кривенький способ:
1. Регистрируем ещё один аккаунт телеги и добавляем его в приложение — такая возможность есть.
2. В основном аккаунте оставляем только важные чаты и переписки, во второй добавляем весь мусор, типа каналов, и выключаем уведомления.
3. Вы великолепны!
Развернуть ветку
Да пусть больше 5 избранных каналов сначала хотя бы сделают!!1
Развернуть ветку
2 комментария
Плюсую дважды! Иранские разработчики реализовали это на iOS ещё пару лет назад. Кривенько, но всё же! Жду такого разделения с дня появления каналов, а потом и ботов.
Развернуть ветку
Блин, не хватает отложенный постинг и добавление кнопок как в ControllerBot. Давайте, Телеграмм, я знаю, что вы это читаете 😉
Развернуть ветку
Еще реально не хватает вкладок разделяющих людей, чаты, каналы и ботов, что есть во всех альтернативных клиентах.
Ну и ленту бы заодно сделали.
Развернуть ветку
7 комментариев
Господи, христа ради, добавьте разделение групп, людей, каналов. Такая каша сейчас 🙁
Развернуть ветку
Постепенно телега включает функции полезных ботов.
Неплохо, если сами еще реализуют, например, преобразование голосового сообщения в текстовое
Развернуть ветку
Аккаунт удален
Развернуть ветку
9 комментариев
Што? На всех андроидах и айфонах есть кнопка. Незаменимо просто. Офигеть ты до сих пор не знал?
Развернуть ветку
9 комментариев
«Живее всех живых»!
Да Вотсап просто г***о гниющее, перед постоянно развивающимся ТГ
Развернуть ветку
Жаль что у меня нет канала про телеграм, чтобы я дал здесь на него ссылку -_-
1. Разделение сообщений, каналов и чатов вряд ли будет выгодно телеграму, т.к. рухнут охваты у этих пабликов, все это скажется на активности и в принципе росте телеграм экосистемы.
Тестировали же подобное разделение когда-то, на десктоп версии мак-ос.
Видимо все таки решили не захотели «снова получить ебучий вк».
2. По поводу открытия каждого канала, чтобы прочесть пост.
Не знаю, как на андроид, но на айфонах можно посмотреть превью последнего сообщения, нажав пальцем на канал и подержав несколько секунд (см. скрин).
3. Отложенный постинг тоже появится в скором времени. Вот увидите, скриньте.
PS: я просто заебался читать одинаковые комментарии под данной статьей про «когда разделят каналы, верните стену, т.е. ленту. 1»