Простейший голосовой помощник. Часть 2. Внедрение в telegram

После блокировки мессенджера в России, многие пользователи столкнулись с тем, что не открывается ссылка на Телеграм. По сути, когда Вы пытаетесь перейти на t.me или telegram.me, браузер просто отказывается загружать сайт. То же самое происходит и когда Вы пытаетесь перейти по ссылке на Телеграм-канал, в чат или к боту. Но если проблема доступа легко решается при помощи VPN-клиентов и правильных настроек прокси, о которых можно почитать и скачать здесь, то со ссылками намного сложнее. В этой статье мы расскажем о том, почему ссылка вида t.me больше не работает, как теперь по ней перейти и как давать ссылки на контент в мессенджере.

Но стоит помнить, что такое происходит исключительно, когда Вы переходите в Телеграм с внешнего источника. Например, если ссылка размещена на любом стороннем сайте — в социальных сетях (Вконтакте, Инстаграм, и т.д.), в каталогах каналов, чатов и ботов, и прочее. При попытке открыть такой линк, находясь в самом мессенджере, проблемы не возникает.

Почему не работает ссылка на Телеграм t.me?

Как Вы уже могли заметить, это начало происходить как раз после того, как мессенджер в России окончательно заблокировали. Кроме того, в прочих странах ссылки на него работают без проблем. Поэтому вывод очевиден — ссылка в Телеграм не открывается из-за действий Роскомнадзора. Как это работает?

По сути, у мессенджера есть свой набор url-адресов — t.me, telegram.me и прочее. Когда нужно перейти в конкретный канал, чат и бота, или открыть профиль пользователя — к этим url добавляется еще и логин этого же канала, чата, бота или пользователя. В итоге, это выглядит так: https://t.me/durov. Но Роскомнадзор добился полной блокировки ссылок вида t.me и telegram.me, по которым человек и может перейти в мессенджер. Из-за этого, не будет работать ни один линк с таким url.

С недавнего времени, ссылку на Телеграм удалили еще и из поисковой выдачи Яндекса. То есть, когда Вы будете искать мессенджер в этом поисковике, все, что он выдаст — статьи, сайты-каталоги и прочее. Правда, ссылку на веб-версию Телеграм Яндекс все еще показывает, и по ней даже можно перейти.

Поисковая выдача Яндекса, по запросу «Телеграм»

Но вот в мессенджере уже давно настроен прокси, благодаря чему он и продолжает работать. По этой же причине, нормально функционируют и ссылки внутри Телеграма. Однако если Вы переходите по ссылке вида t.me из стороннего ресурса (например, со стороннего сайта или мессенджера), то блокировка срабатывает — и перехода не происходит. Это сильно усложнило жизнь обычным людям, которые делятся ссылками на свои аккаунты или контент. А продвигать свои каналы и ботов хотелось бы не только внутри мессенджера. Но, благо, с этим можно бороться. И сейчас мы расскажем как именно.

Читайте также:  Решение матрицы правилом треугольника

Как перейти по ссылке в Telegram?

Запомните: ссылки вида t.meссылка или telegram.meссылка не работают, и работать не будут, пока блокировка не будет снята. А для перехода в мессенджер из внешних источников, сейчас используются специальные ссылки, которые перенаправляют Вас на нужную страницу в Телеграме, но при этом не попадают под действие блокировки.

Итак, мы выяснили, почему линки на мессенджер не работают. Но делиться своим контентом на сторонних сайтах все еще нужно, особенно если Вы блоггер или пытаетесь раскрутить свой канал. А теперь пришло время рассказать о том, как открыть Телеграм по ссылке. А все достаточно просто — просто необходимо заменить стандартную ссылку на одну из работающих. В чем, собственно, состоит проблема ссылок вида t.me — они попросту больше не функционируют так, как нужно. Поэтому, если Вы, допустим, размещаете ссылку на чат в Телеграм, которая выглядит как t.meлогин, то пользователи, которые находятся на территории РФ попросту не смогут по ней перейти. Однако способ обойти эту блокировку есть, и он достаточно простой.

А именно — теперь придется заменить стандартную ссылку на Телеграм t.me на другую, одну из работающих. Сейчас их созданием занимается множество сервисов, но мы расскажем только о самых качественных и, главное, бесплатных. И, конечно, мы расскажем о том, как сделать рабочую ссылку на Телеграм.

Как сделать рабочую ссылку на Telegram: на канал, чат, бота, профиль

Что это значит — «работающая ссылка»? Дело в том, что раз нельзя перейти на t.me и telegram.me, то стоит воспользоваться url, которые еще не заблокированы, так как это не официальные ссылки на мессенджер. Но они отлично работают. Сейчас множество сервисов предоставляют свои услуги по созданию работающих ссылок на Телеграм. По сути, это функционирует, как обычная переадресация.

Для того, чтобы ссылка на Телеграм-канал, чат или бота заработала, необходимо просто заменить стандартную t.meссылка на одну из этих:

t-do.ruссылка

t.elegram.ruссылка

teleg.runссылка

tele.clickссылка

tg.telepult.pro/ссылка

Теперь давайте попробуем протестировать эти ссылки. Для этого, мы будем использовать официальный Телеграм-канал создателя мессенджера – Павла Дурова (это чтобы Вы не обвиняли нас в рекламе) — Durov’s Channel. Попробуйте сначала перейти по обычной ссылке: https://t.me/durov.

Читайте также:  Как нумеровать ячейки в excel

На самом деле, их огромное множество. Мы лишь предоставляем самые популярные и уже точно проверенные ссылки. Существуют даже сервисы, которые способны конвертировать стандартную ссылку, которую блокирует Роскомнадзор, на работающую. Все, что Вам нужно — всего лишь ввести обычный линк на свой канал, профиль или чат, после чего Вы получите сконвертированный, полностью функционирующий адрес.

Мессенджер Телеграм постоянно старается усовершенствовать свой функционал и предложить пользователям что-то новое и полезное. Поэтому он создал возможность общаться группами. Да не просто по 10 человек как на других платформах. Сообщества в Телеграм могут быть огромными: до 200 человек. И конечно же полезными. Поэтому ниже мы расскажем, как зайти в чат Телеграма по ссылке и можно ли попасть в закрытое сообщество.

Как найти чат в Телеграме и зайти в него?

На данный момент цифра групповых бесед в Telegram намного опережает каналы. И просто так искать нужный можно долго. Поэтому существует поисковая строка и следующий алгоритм действий:

  1. Откройте приложение на телефоне.
  2. В разделе «Чаты» проведи пальцем по экрану сверху вниз, чтобы появился «Поиск».
  3. Начните вводить название группы. Например, «Здоровое питание». В строке можно вводить как буквы, так и цифры.
  4. Просмотрите появившиеся результаты.

Если поиск ничего не дает, то вам будет предложено конкретизировать свой запрос, указав такие параметры, как тему группы и ее категорию. Когда вы нашли нужную группу в Информации о ней выберите «Стать участником». Администратор рассмотрим вашу заявку, и если пожелает, то удовлетворит ее.

Что касается общедоступного канала, то для подписки на его новости нет необходимости ждать решения руководства. Нужно просто нажать на кнопку «Подписаться», и вам станут доступны все новости проекта.

Инструкция, как войти в чат по ссылке

Для быстрого поиска нужной информации существуют ссылки. Имея точный адрес «места положения» группы вам не придется блуждать и искать ее. Если у вас нет линка, но есть знакомый в этой группе, попросите его отправить «координаты». Важно, чтобы у него были права администратора. В противном случае генерация ссылки на беседу ему будет недоступна. Теперь простой перейдите по высланному приглашению.

Как зайти в закрытый чат в Телеграме

Закрытый или секретный диалог в Телеге — это его особенная фишка. Ее преимущества в том, что все данные надежно хранятся и не могут быть взломаны, так как не хранятся на сервере и сразу же удаляются после отправки сообщения (можно настроить таймер удаления). Но это еще не все. Вся отправленная информация подвергается шифрованию. Расшифровать послание не могут даже сотрудники мессенджера. А при попытке сделать скриншот, уведомление о действие будет отправлено собеседнику.

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

Читайте также:  Что такое универсальный ноутбук

Читайте также все про закрытые каналы в Телеграм в специальном материале.

Как же можно попасть в такой чат? Только если пользователь захочет общаться с вами в таком режиме. Для создания закрытого общения нужно в простом диалоге зайти в информацию и выбрать кнопку «Начать секретный чат». Другу придет уведомление о том, что вы приглашаете его в такую беседу. Когда друг примет приглашение, в окошке диалога высветиться надпись «Вы создали секретный чат с…». Если человек захочет с вами вести секретный диалог, то уведомление об этом поступит вам.

Заключение

Возможность общаться большими группами позволила Telegram обойти своих конкурентов. Теперь не придется ломать голову как вместить 30 человек в один диалог. Чтобы искать интересные мини-сообщества, используйте поисковую строку. И ждите, когда администратор пригласит или отклонит вашу заявку.

Здравствуйте друзья! Сегодня столкнулся с проблемой, связанной с мессенджером Telegram и решил поделится с вами.

Копирую адрес канала Telegram (любой), вставляю в адресную строку браузера и нажимаю Enter.

Вижу вот такое окно.

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

Но я нашел два варианта решения проблемы, связанной с блокировкой некоторых сайтов.

Первый способ

Первый способ – цитирую полностью.

“Как давать ссылки на каналы и профили Telegram после блокировки t.me

Сервис t-do.ru поможет справиться с проблемой.

После блокировки Telegram в России перестали работать внешние ссылки на каналы и профили вида t.me/lifehackerru. При попытке перейти по ссылке без включённого VPN или прокси появляется страница «Не удалось получить доступ к сайту».

Чтобы не потерять аудиторию из соц. сетей и других внешних источников, используйте адрес t-do.ru. Можно конвертировать ссылку на этой странице или отредактировать адрес вручную. Например, t-do.ru/lifehackerru.

У сервиса есть поддержка постов. Можно создавать ссылки на отдельные записи, как было при использовании.”

Видите, все просто, нужно поменять t.me на t-do.ru.

Пример моего канала.

Как надо — https://t-do.ru/sergey_burdin

Если вам лень переписывать вручную, перейдите на сайт http://t-do.ru/ и конвертируйте там.

Вставьте Url канала или любой адрес, начинающегося с t.me (без https://) и нажмите кнопку Convert.

Второй способ

Второй способ еще проще, хотя проще некуда.

С уважением Сергей Бурдин.

Ставьте плюсик, если информация была полезной!

Интенсив «Научитесь собирать информацию с сайтов с помощью парсера на Python» tproger.ru События и курсы на tproger.ru

Ну вот и всё, простенький бот в Телеграмме на языке Python готов.

Docker

Сейчас мало кто не слышал про Docker, но если вдруг не слышали — вот хорошая статья. Для нашего проекта потребуется самый простой Dockerfile:

FROM python:3.8  # set work directory  WORKDIR /usr/src/app/  # copy project  COPY . /usr/src/app/  # install dependencies  RUN pip install --user aiogram  # run app  CMD ["python", "bot.py"]

Каталог проекта должны при этом содержать следующие файлы:

  • bot.py;
  • Dockerfile.

Для локальных тестов достаточно установить Docker (linux, mac, windows), после чего в папке проекта собрать и запустить контейнер с помощью команд:

docker build -t my_app  docker run -d my_app  

my_app — это просто название нашего контейнера, вместо которого можно использовать другое имя.

-d — специальный флаг, который запускает контейнер в фоне и позволяет дальше работать в терминале. Это называется detached mode.

Деплой на AWS

Прежде всего нам понадобится аккаунт на Docker Hub. Это аналог GitHub, только не с исходниками кода, а с уже созданными контейнерами. Работа с Docker Hub выглядит достаточно просто:

  1. Локально или с помощью пайплайнов собрали контейнер.
  2. Загрузили его на докер хаб.
  3. В любом удобном месте скачали его. Это может быть локальная машина, VPS сервер или облачный провайдер по типу AWS.
  4. Запустили.

Пройдёмся по этим шагам. Везде, где указано , надо вставлять свой юзернейм, использованный при регистрации на докерхабе. Если это ваша первая публикация на докерхаб, для начала потребуется залогиниться с помощью docker login.

Билдим контейнер:

docker build -t /my_app

Загружаем его на докерхаб:

docker push /my_app

Для проверки успешности загрузки можете запустить контейнер из Docker Hub с помощью команды:

docker run -d /my_app

Далее загрузим наш контейнер в AWS Elastic Beanstalk. Для этого потребуется аккаунт на AWS. Если его нет, необходимо зарегистрироваться. Вас попросят ввести данные карты для верификации, но переживать не стоит, ведь мы воспользуемся бесплатным годовым триалом. Чтобы поиграться, этого более чем достаточно, а вот если вы захотите вывести проект в продакшен, следует перейти на VPS — это даст больше контроля и гибкости.

  • Переходим в Elastic Beanstalk, на вкладку Applications, и создаём новое приложение:
  • Называем приложение, теги оставляем пустыми:
  • Создаём для приложения environment:
  • Выбираем Worker environment:
  • В качестве платформы выбираем Docker:
  • В пункте Application code нужно загрузить JSON-файл с конфигурацией Docker-образа. Сам файл:
Dockerrun.aws.json  {   "AWSEBDockerrunVersion": "1",   "Image": {     "Name": "/my_app",     "Update": "true"   },  "Ports": [   {     "ContainerPort": 5000,     "HostPort": 8000   }  ]  }  
  • Создаём окружение:
  • AWS начинает создавать окружение, просто ждём завершения процесса:
  • Если всё прошло успешно, вы увидите индикатор успешного запуска приложения:

Проверяем работу нашего Telegram bot:

Успех!

Заключение

Поздравляем! Теперь вы знаете, как писать роботов для Telegram на Python.

Бота можно дополнять другими функциями, например, добавить отправку файлов, опрос или клавиатуру.

Кстати, в телеграмме есть аж целых два типа клавиатур:

  1. Классическая RelpyKeyboardMarkup, у которой кнопки располагаются под полем ввода сообщения:
  2. Более современная InlineKeyboardMarkup, которая привязывается к конкретному сообщению:

Но и это полностью рабочий Телеграм-бот на Python: дополните словарём, и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.

В «настоящих проектах» не обойтись без базы данных. Тут на помощь приходит docker-compose, который позволяет объединить несколько контейнеров в один сервис. Таким образом, например, можно создать приложение и положить его в контейнер, а базу данных, как отдельный сервис, поместить в другой контейнер, и с помощью docker-compose наладить между ними связь.

Также для более серьёзной разработки лучше использовать выделенный виртуальный сервер (VPS): он даёт гораздо больше гибкости и свободы, чем тот же AWS. А самое главное, он более приближён к «боевой» разработке. Схема работы тут будет даже проще, чем с AWS: вам просто нужно установить Docker, спуллить образ с Docker Hub и запустить его.

В этой статье мы реали­зуем прос­той, но край­не полез­ный про­ект на Python — бота для Telegram. Боты — это неболь­шие скрип­ты, которые могут вза­имо­дей­ство­вать с API, что­бы получать сооб­щения от поль­зовате­ля и отправ­лять информа­цию в раз­ные чаты и каналы.

Python для новичков

Ес­ли ты сов­сем не ори­енти­руешь­ся в Python, то отличным началом будет проч­тение трех ввод­ных ста­тей, которые я пуб­ликовал в «Хакере» этим летом, либо посеще­ние кур­са «Python для нович­ков», который я нач­ну вес­ти для читате­лей «Хакера» уже сов­сем ско­ро — 30 нояб­ря.

  • Python с абсо­лют­ного нуля. Учим­ся кодить без скуч­ных кни­жек
  • Python с абсо­лют­ного нуля. Учим­ся работать со стро­ками, фай­лами и интерне­том
  • Python с абсо­лют­ного нуля. Работа­ем с ОС, изу­чаем регуляр­ные выраже­ния и фун­кции

Что­бы соз­дать бота, нам нуж­но дать ему наз­вание, адрес и получить токен — стро­ку, которая будет однознач­но иден­тифици­ровать нашего бота для сер­веров Telegram. Зай­дем в Telegram под сво­им акка­унтом и откро­ем «отца всех ботов», BotFather.

Жмем кноп­ку «Запус­тить» (или отпра­вим / start), в ответ BotFather приш­лет нам спи­сок дос­тупных команд:

  • / newbot — соз­дать нового бота;
  • / mybots — редак­тировать ваших ботов;
  • / setname — сме­нить имя бота;
  • / setdescription — изме­нить опи­сание бота;
  • / setabouttext — изме­нить информа­цию о боте;
  • / setuserpic — изме­нить фото ава­тар­ки бота;
  • / setcommands — изме­нить спи­сок команд бота;
  • / deletebot — уда­лить бота.

От­пра­вим бате‑боту коман­ду / newbot, что­бы соз­дать нового бота. В ответ он поп­росит ввес­ти имя будуще­го бота, его мож­но писать на рус­ском. Пос­ле вво­да име­ни нуж­но будет отпра­вить адрес бота, при­чем он дол­жен закан­чивать­ся на сло­во bot. Нап­ример, xakepbot или xakep_bot. Если адрес будет уже кем‑то занят, BotFather нач­нет изви­нять­ся и про­сить при­думать что‑нибудь дру­гое.

Ког­да мы наконец най­дем сво­бод­ный и кра­сивый адрес для нашего бота, в ответ получим сооб­щение, в котором пос­ле фра­зы Use this token to access the HTTP API будет написа­на стро­ка из букв и цифр — это и есть необ­ходимый нам токен. Сох­раним ее где‑нибудь на сво­ем компь­юте­ре, что­бы потом исполь­зовать в скрип­те бота.

Для вза­имо­дей­ствия с Telegram API есть нес­коль­ко готовых модулей. Самый прос­той из них — Telebot. Что­бы уста­новить его, набери

pip install pytelegrambotapi

В Linux, воз­можно, понадо­бит­ся написать pip3 вмес­то pip, что­бы ука­зать, что мы хотим работать с треть­ей вер­сией Python.

Эхо-бот

Для начала реали­зуем так называ­емо­го эхо‑бота. Он будет получать от поль­зовате­ля тек­сто­вое сооб­щение и воз­вра­щать его.

import telebot # Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather') # Функция, обрабатывающая команду /start@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, на связи. Напиши мне что-нибудь )') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): bot.send_message(message.chat.id, 'Вы написали: ' + message.text) # Запускаем ботаbot.polling(none_stop=True, interval=0)

За­пус­кай скрипт и ищи в поис­ке Telegram сво­его бота по адре­су, который ты при­думал ранее. Запус­каем бота кноп­кой «Запус­тить» (Start) или коман­дой / start и можем убе­дить­ся в том, что он работа­ет и воз­вра­щает сооб­щения.

При­мер работы эхо‑бота

Wikipedia-бот

Да­вай научим нашего бота не прос­то отсы­лать сооб­щения обратно, а чему‑нибудь поин­терес­нее. Нап­ример, по вве­ден­ному сло­ву давать статью на Википе­дии. Здесь нам поможет модуль Wikipedia:

pip install wikipedia

Го­товим код.

import telebot, wikipedia, re # Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather') # Устанавливаем русский язык в Wikipediawikipedia.set_lang("ru") # Чистим текст статьи в Wikipedia и ограничиваем его тысячей символовdef getwiki(s): try: ny = wikipedia.page(s) # Получаем первую тысячу символов wikitext=ny.content[:1000] # Разделяем по точкам wikimas=wikitext.split('.') # Отбрасываем всЕ после последней точки wikimas = wikimas[:-1] # Создаем пустую переменную для текста wikitext2 = '' # Проходимся по строкам, где нет знаков «равно» (то есть все, кроме заголовков) for x in wikimas: if not('==' in x): # Если в строке осталось больше трех символов, добавляем ее к нашей переменной и возвращаем утерянные при разделении строк точки на место if(len((x.strip()))>3): wikitext2=wikitext2+x+'.' else: break # Теперь при помощи регулярных выражений убираем разметку wikitext2=re.sub('([^()]*)', '', wikitext2) wikitext2=re.sub('([^()]*)', '', wikitext2) wikitext2=re.sub('{[^{}]*}', '', wikitext2) # Возвращаем текстовую строку return wikitext2 # Обрабатываем исключение, которое мог вернуть модуль wikipedia при запросе except Exception as e: return энциклопедии нет информации об этом' # Функция, обрабатывающая команду /start@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, 'Отправьте мне любое слово, и я найду его значение на Wikipedia') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): bot.send_message(message.chat.id, getwiki(message.text)) # Запускаем ботаbot.polling(none_stop=True, interval=0)

При­мер работы Wikipedia-бота

Другие статьи в выпуске:

Xakep #272. Приручаем WinAFL

  • Содержание выпуска
  • Подписка на «Хакер»-70%

www

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

Бот с двумя виртуальными кнопками

Во мно­гих Telegram-ботах для выбора каких‑то дей­ствий исполь­зуют­ся так называ­емые вир­туаль­ные кноп­ки. Давай поп­робу­ем сде­лать себе такие же!

Пред­положим, что у нас есть два фай­ла facts. txt и thinks. txt, которые содер­жат спи­сок инте­рес­ных фак­тов и поговор­ки. На каж­дой стро­ке фай­лов находит­ся по одно­му фак­ту или поговор­ке.

Сде­лаем бота, в котором будут две кноп­ки: «Фак­ты» и «Поговор­ки». Если нажать любую, бот отпра­вит поль­зовате­лю соот­ветс­тву­ющее сооб­щение.

info

Ес­ли ты будешь исполь­зовать для это­го бота тот же токен, что и для пре­дыду­щего, то, что­бы уви­деть кноп­ки, переза­пус­ти бота коман­дой / start.

import telebotimport randomfrom telebot import types # Загружаем список интересных фактовf = open('data/facts.txt', 'r', encoding='UTF-8')facts = f.read().split('n')f.close() # Загружаем список поговорокf = open('data/thinks.txt', 'r', encoding='UTF-8')thinks = f.read().split('n')f.close() # Создаем ботаbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather') # Команда start@bot.message_handler(commands=["start"])def start(m, res=False): # Добавляем две кнопки markup=types.ReplyKeyboardMarkup(resize_keyboard=True) item1=types.KeyboardButton("Факт") item2=types.KeyboardButton("Поговорка") markup.add(item1) markup.add(item2) bot.send_message(m.chat.id, 'Нажми: nФакт для получения интересного фактаnПоговорка для получения мудрой цитаты ', reply_markup=markup) # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): # Если юзер прислал 1, выдаем ему случайный факт if message.text.strip() == 'Факт' : answer = random.choice(facts) # Если юзер прислал 2, выдаем умную мысль elif message.text.strip() == 'Поговорка': answer = random.choice(thinks) # Отсылаем юзеру сообщение в его чат bot.send_message(message.chat.id, answer) # Запускаем ботаbot.polling(none_stop=True, interval=0)

При­мер работы бота, зна­юще­го фак­ты и поговор­ки

Бот, ведущий Telegram-канал с анекдотами

Пре­дыду­щие боты посыла­ли юзе­ру сооб­щения тог­да, ког­да получа­ли от него коман­ды или фра­зы. Но что, если нам нужен бот, который будет пери­оди­чес­ки и в авто­мати­чес­ком режиме пос­тить что‑то в наш канал?

Да­вай сде­лаем бота, который получа­ет спи­сок анек­дотов из фай­ла и каж­дый час пос­тит в канал один из этих анек­дотов. Для это­го нам нуж­но соз­дать свой канал в Telegram, добавить в под­писчи­ки канала нашего бота и наз­начить его адми­нис­тра­тором канала с пра­вом пуб­ликовать сооб­щения.

Файл с анек­дотами дол­жен лежать в пап­ке data рядом со скрип­том бота.

import telebotimport time # Токен, который выдает @botfatherbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather')# Адрес телеграм-канала, начинается с @CHANNEL_NAME = '@адрес_твоего_канала' # Загружаем список шутокf = open('data/fun.txt', 'r', encoding='UTF-8')jokes = f.read().split('n')f.close() # Пока не закончатся шутки, посылаем их в каналfor joke in jokes: bot.send_message(CHANNEL_NAME, joke) # Делаем паузу в один час time.sleep(3600) bot.send_message(CHANNEL_NAME, "Анекдоты закончились :-(")

При­мер работы бота, ведуще­го канал с анек­дотами

Чат-бот «Маша»

Те­перь давай сде­лаем прос­тей­шего чат‑бота, который будет бол­тать с поль­зовате­лем. Для это­го мы под­готовим файл boltun. txt, содер­жащий стро­ки с воп­росами (в начале таких строк пос­тавим мет­ку u:) и отве­тами на них в сле­дующей стро­ке.

u: как зовутМаша меня зовут!u: сколько тебе летМне уже 18, честно-честно!

Файл boltun. txt помес­тим в пап­ку data рядом со скрип­том бота. Для поис­ка похожих воп­росов исполь­зуем модуль fuzzywuzzy, который поз­воля­ет срав­нивать, нас­коль­ко похожи меж­ду собой две стро­ки. Естес­твен­но, спер­ва этот модуль нуж­но уста­новить:

pip install fuzzywuzzypip install python-Levenshtein

Ни­же при­веден исходный код бота. Пос­ле его запус­ка напиши боту «При­вет» и поп­робуй с ним пооб­щать­ся. Естес­твен­но, это не искусс­твен­ный интеллект и набор его отве­тов огра­ничен фра­зами из фай­ла boltun. txt.

import telebotimport osfrom fuzzywuzzy import fuzz # Создаем бота, пишем свой токенbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather') # Загружаем список фраз и ответов в массивmas=[]if os.path.exists('data/boltun.txt'): f=open('data/boltun.txt', 'r', encoding='UTF-8') for x in f: if(len(x.strip()) > 2): mas.append(x.strip().lower()) f.close() # С помощью fuzzywuzzy вычисляем наиболее похожую фразу и выдаем в качестве ответа следующий элемент спискаdef answer(text): try: text=text.lower().strip() if os.path.exists('data/boltun.txt'): a = 0 n = 0 nn = 0 for q in mas: if('u: ' in q): # С помощью fuzzywuzzy получаем, насколько похожи две строки aa=(fuzz.token_sort_ratio(q.replace('u: ',''), text)) if(aa > a and aa!= a): a = aa nn = n n = n + 1 s = mas[nn + 1] return s else: return 'Ошибка' except: return 'Ошибка' # Команда «Старт»@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, на связи. Напиши мне Привет )') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): # Запись логов f=open('data/' + str(message.chat.id) + '_log.txt', 'a', encoding='UTF-8') s=answer(message.text) f.write('u: ' + message.text + 'n' + s +'n') f.close() # Отправка ответа bot.send_message(message.chat.id, s) # Запускаем ботаbot.polling(none_stop=True, interval=0)

При­мер работы чат‑бота

Выводы

Мы написа­ли пять прос­тых ботов, на при­мере которых научи­лись при­нимать и отправ­лять сооб­щения, делать кноп­ки и понимать неточ­ные зап­росы.

В сле­дующей статье мы рас­смот­рим работу с Telegram-ботами более под­робно: научим­ся делать ботов, работа­ющих через веб‑хуки, при­нимать опла­ту от поль­зовате­лей и вза­имо­дей­ство­вать с базой дан­ных SQLite.

Так­же при­зываю тебя не откла­дывать и записы­вать­ся на курс «Python для нович­ков», где мы от прос­тей­ших понятий перей­дем к соз­данию пер­вых инте­рес­ных про­ектов. Стар­туем уже сов­сем ско­ро!

Курс по Python

Курс «Python с нуля» нап­равлен на изу­чение основ и базовых кон­цепций прог­рамми­рова­ния. Пос­ле него ты смо­жешь лег­ко углу­бить­ся в любую из ИТ‑сфер: веб‑раз­работ­ку, ана­лиз дан­ных, безопас­ность при­ложе­ний и так далее. Про­дол­житель­ность кур­са — два кален­дарных месяца. Уро­ки будут про­водить­ся два раза в неделю (втор­ник и чет­верг, ори­енти­ровоч­но в 17:00 по Мос­кве), каж­дый по одно­му ака­деми­чес­кому часу. Пери­оди­чес­ки будут выдавать­ся домаш­ние задания.

За­писать­ся на курс

← Ранее Интерпол сообщил об аресте 1000 человек, связанных с киберпреступностью Далее → HTB Intelligence. Пентестим Active Directory от MSA до KDC

Введение

В начале апреля 2016 года вышло первое по-настоящему крупное обновление API для ботов. Изменений довольно много, поэтому материал я разобью на несколько частей. Сегодня поговорим об inline-кнопках и редактировании сообщений, а затем обсудим новые инлайн-режимы вместе со специальными кнопками для отправки геолокации и номера телефона.

Новые возможности

Начнём с двух важных изменений:

  1. Каждая кнопка, будь то обычная или инлайн, это теперь самостоятельный объект KeyboardButton или InlineKeyboardButton, не забудьте обновить своих ботов!
  2. В Inline-режиме все текстовые поля теперь представлены отдельными объектами InputMessageContent, которые, в свою очередь могут быть аж 4-х типов (подробности тут).

URL-кнопки

Итак, инлайн-кнопки. Что это такое? Это специальные объекты, которые “цепляются” к конкретным сообщениям и распространяют своё действие, в общем случае, только на них. Делятся такие кнопки на три типа: URL-кнопки, Callback-кнопки и Switch-кнопки. Самыми простыми являются кнопки-ссылки (URL). Как видно из названия, их цель – просто перекидывать пользователей по определенным веб-адресам. Давайте сразу напишем обработчик, который будет на любое сообщение отвечать каким-либо текстом и предложением перейти, например, на Яндекс.

@bot.message_handler(content_types=["text"]) def default_test(message):     keyboard = types.InlineKeyboardMarkup()     url_button = types.InlineKeyboardButton(text="Перейти на Яндекс", url="https://ya.ru")     keyboard.add(url_button)     bot.send_message(message.chat.id, "Привет! Нажми на кнопку и перейди в поисковик.", reply_markup=keyboard) 

Инлайн-клавиатура представляет собой объект InlineKeyboardMarkup, а каждая инлайн-кнопка – это объект InlineKeyboardButton. Чтобы получилась URL-кнопка, нужно указать значения параметров text (текст на кнопке) и url (валидный веб-адрес). В результате бот пришлет нам такое сообщение (см. рис.). В целях обеспечения безопасности, перед переходом по URL-кнопкам появляется всплывающее окно, в котором видна ссылка целиком.

URL-кнопка

Callback-кнопки и редактирование сообщений

Прежде, чем мы перейдем к другим кнопкам, давайте познакомимся с функциями редактирования сообщений, коих тоже три: editMessageText (редактирование текста), editMessageCaption (редактирование подписи к медиа) и editMessageReplyMarkup (редактирование инлайн-клавиатуры). В рамках этого урока рассмотрим только первую функцию, остальные работают аналогично и предлагаются для самостоятельного изучения. Чтобы отредактировать сообщение, нам надо знать, про какое именно идёт речь. В случае, если оно было отправлено самим ботом, идентификаторами служит связка chat_id + message_id. Но если сообщение было отправлено в инлайн-режиме, то ориентироваться надо по параметру inline_message_id.

И вот теперь вернемся к нашим баранам кнопкам. На очереди – Callback. Это, на мой взгляд, самая крутая фича нового обновления. Колбэк-кнопки позволяют выполнять произвольные действия по их нажатию. Всё зависит от того, какие параметры каждая кнопка в себе несёт. Соответственно, все нажатия будут приводить к отправке боту объекта CallbackQuery, содержащему поле data, в котором написана некоторая строка, заложенная в кнопку, а также либо объект Message, если сообщение отправлено ботом в обычном режиме, либо поле inline_message_id, если сообщение отправлено в инлайн-режиме.

Приведу пример, после которого все вопросы должны отпасть: пусть, например, если сообщение отправлено ботом в обычном режиме, то нажатие на кнопку заменит текст сообщения на “Пыщь”, если в инлайн – то “Бдыщь”. При этом в обоих случаях значение callback_data будет равно test. Что для этого нужно сделать: во-первых, написать простейший хэндлер для всех входящих сообщений, во-вторых, написать простейший хэндлер для инлайн-сообщений, в-третьих, написать простейший хэндлер для колбэка, который определит, из какого режима пришло сообщение.

# Обычный режим @bot.message_handler(content_types=["text"]) def any_msg(message):     keyboard = types.InlineKeyboardMarkup()     callback_button = types.InlineKeyboardButton(text="Нажми меня", callback_data="test")     keyboard.add(callback_button)     bot.send_message(message.chat.id, "Я – сообщение из обычного режима", reply_markup=keyboard)   # Инлайн-режим с непустым запросом @bot.inline_handler(lambda query: len(query.query) > 0) def query_text(query):     kb = types.InlineKeyboardMarkup()     # Добавляем колбэк-кнопку с содержимым "test"     kb.add(types.InlineKeyboardButton(text="Нажми меня", callback_data="test"))     results = []     single_msg = types.InlineQueryResultArticle(         id="1", title="Press me",         input_message_content=types.InputTextMessageContent(message_text="Я – сообщение из инлайн-режима"),         reply_markup=kb     )     results.append(single_msg)     bot.answer_inline_query(query.id, results)   # В большинстве случаев целесообразно разбить этот хэндлер на несколько маленьких @bot.callback_query_handler(func=lambda call: True) def callback_inline(call):     # Если сообщение из чата с ботом     if call.message:         if call.data == "test":             bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Пыщь")     # Если сообщение из инлайн-режима     elif call.inline_message_id:         if call.data == "test":             bot.edit_message_text(inline_message_id=call.inline_message_id, text="Бдыщь")  if __name__ == '__main__':     bot.infinity_polling() 

Запускаем бота, отправляем инлайн-сообщение, которое, в свою очередь, вызовет обычное:

Нажмем на обе кнопки, результат правильный:

После проверки

Таким образом, callback-кнопки – это очень мощный инструмент для взаимодействия пользователей с ботом, а редактирование сообщений дополнительно помогает в этом. Более того, нажатие на колбэк-кнопку может дополнительно тригернуть либо уведомление в верхней части экрана, либо всплывающее окно. Покажу первый вариант. Пускай помимо изменения сообщения на “Пыщь”, аналогичное слово показывается уведомлением. Для этого перепишем первое if-условие в хендлере колбэков:

if call.message:     if call.data == "test":         bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Пыщь")         bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text="Пыщь!") 

Результат – на скриншоте. Попробуйте, кстати, изменить аргумент show_alert на True и посмотрите, что получится.

Всплывающее уведомление

Switch-кнопки

Наконец, остался последний тип кнопок – Switch (переключатель). Они нужны, чаще всего, для обучения пользователей работе с ботом в инлайн-режиме. Чтобы активировать сделать кнопку такого типа, нужно указать аргумент switch_inline_query либо пустой, либо с каким-либо текстом. В последнем случае этот текст будет сразу подставлен в поле ввода, например, для показа демонстрации инлайна. Как вообще работает такая кнопка? При нажатии на неё Telegram предложит выбрать чат, после чего подставит в поле ввода ник вашего бота и (если есть), текст, указанный вами в аргументе switch_inline_query. Давайте попробуем так сделать. Добавим кнопку, которая будет перенаправлять пользователя в какой-либо чат и предлагать в инлайн-режиме запрос “Telegram”. Код всего хендлера выглядит вот так:

@bot.message_handler(content_types=["text"]) def any_msg(message):     keyboard = types.InlineKeyboardMarkup()     switch_button = types.InlineKeyboardButton(text="Нажми меня", switch_inline_query="Telegram")     keyboard.add(switch_button)     bot.send_message(message.chat.id, "Я – сообщение из обычного режима", reply_markup=keyboard) 

Теперь, если мы нажмем на кнопку и выберем чат, вот что получится:

Результат

Итак, в этом уроке мы познакомились с новыми кнопками в Telegram Bot API, научились переписывать историю редактировать сообщения и отправлять небольшие уведомления по нажатию. В следующий раз продолжим изучать новые возможности для ботов. А исходники к этому уроку можно найти в этом репозитории.

← Урок №7 Урок №9 →

Мессенджеры *Python * Из песочницы Добрый день уважаемые читатели, давайте рассмотрим, какие основные типы встроенных кнопок предлагают чат-боты telegram и в чем их особенности. Статья будет полезна всем, кто хочет разобраться в возможностях взаимодействия с пользователями telegram в версии bot API 2.0. Для обзора возможностей нам понадобится установить 3 целых 2 десятых Python`a и пару ложек pyTelegramBotAPI. Особенности настройки и регистрации чат-бота мы рассматривать не будем, т.к. есть множество статей на эту тему. И так, что же такое встроенные кнопки(клавиатура) в мессенджере Telegram? Это кнопки которые выводятся во внутренней области чата и привязываются к конкретному сообщению. Они жестко связаны с сообщением(если удалить сообщение, внутренние кнопки так же удаляются вместе с ним.). Они дают возможность динамически видоизменять его. В данный момент есть три типа встроенных кнопок:

URL-кнопки

image Для создания кнопки используется тип InlineKeyboardMarkup, давайте создадим кнопку «Наш сайт»:

@bot.message_handler(commands = ['url']) def url(message):     markup = types.InlineKeyboardMarkup()     btn_my_site= types.InlineKeyboardButton(text='Наш сайт', url='https://habrahabr.ru')     markup.add(btn_my_site)     bot.send_message(message.chat.id, "Нажми на кнопку и перейди на наш сайт.", reply_markup = markup) 

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

Switch-кнопки

Этот тип кнопок предназначен для перенаправления пользователя в какой либо чат, с последующей активацией (встроенного) inline-режима общения с ботом. Данный режим можно активировать вручную: в чате, вводим: “@название бота”, но switch-кнопки позволяют это сделать автоматически (помогая знакомиться с inline-режимом новичкам). Для того что-бы создать подобный переключатель, необходимо указать аргумент switch_inline_query либо пустой, либо с каким-либо текстом.

@bot.message_handler(commands = ['switch']) def switch(message):     markup = types.InlineKeyboardMarkup()     switch_button = types.InlineKeyboardButton(text='Try', switch_inline_query="Telegram")     markup.add(switch_button)     bot.send_message(message.chat.id, "Выбрать чат", reply_markup = markup) 

Теперь, если мы нажмем на кнопку и выберем чат, вот что получится: Шаг 1: image Нажимаем на кнопку. Шаг 2: image Выбираем чат. Шаг 3: image Активировался встроенный inline-режим.

Callback-кнопки

Ну и наконец самое интересное — это кнопки с обратной связью: позволяют динамически обновлять сообщение/встроенные кнопки (не засоряя при этом ленту), а так же отображать уведомление в верху чат-бота или модальном окне. Например, их можно использовать для просмотра длинного сообщения, аналогично пагинации страниц на сайтах, или например сделать календарь. Я не стану изобретать велосипед, а через поиск по GitHub, найду готовую библиотеку calendar-telegram. Выполнив указанные инструкции, получаем готовый календарь, который можно динамически изменять по нажатию на соответствующие кнопки: image

@bot.message_handler(commands=['calendar']) def get_calendar(message):     now = datetime.datetime.now() #Текущая дата     chat_id = message.chat.id     date = (now.year,now.month)     current_shown_dates[chat_id] = date #Сохраним текущую дату в словарь     markup = create_calendar(now.year,now.month)     bot.send_message(message.chat.id, "Пожалйста, выберите дату", reply_markup=markup)

Так же можно добавить уведомление по нажатию на дату, для этого достаточно указать сообщение в ответе:

bot.answer_callback_query(call.id, text="Дата выбрана")

image (Пример в десктопной версии) image (Пример в мобильной версии) Если изменить show_alert на True, то мы получим модальное окно:

bot.answer_callback_query(call.id, show_alert=True, text="Дата выбрана")

image

Заключение

По последним данным, в нашумевшем мессенджере Telegram регистрируются больше 600к пользователей ежедневно. Именно поэтому важно подхватить тренд и разобраться с его основными особенностями, т.к. различные методы взаимодействия с ботами существенно облегчает жизнь разработчиков и пользователей. Cпасибо за Ваш интерес к данной теме.

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий