что это такое, как найти, как пользоваться
Всем привет, дорогие читатели моего блога! Сегодня я расскажу вам о том, что представляют собой боты в Телеграм, а ещё опишу функционал, разновидности. Покажу, как их искать и использовать.
Что такое боты в Телеграм и зачем они нужны
Боты дают возможность избавиться от рутины и помогают при ведении групп. По сути они – маленькие помощники. Ну а вся работа осуществляется в чате, через который отдаются команды на выполнение.
Главная цель ботов — это дать ответы на необходимые вопросы пользователя в пределах заданной программы. Они позволяют экономить огромное количество времени и снимают часть работы с админов пабликов.
В 2020 году боты в Телеграм умеют:
- развлекать пользователя;
- обучать;
- помогать искать информацию;
- помогать в чтении и скачивании текстовых файлов;
- дают возможность просматривать видео;
- дают возможность прослушивать аудио;
- напоминают пользователю о предстоящих мероприятиях;
- участвуют в групповых чатах;
- помогают договариваться о встречах;
- дают возможность комментировать статьи.
Кроме вышеуказанных, существует еще множество дополнительных функций, но эти наиболее часто используемые.
Главное преимущество ботов в том, что они не требуют установки на устройство, а работают непосредственно в Телеграм.
Вам может быть интересно — «Как создать чат-бота или бота для канала в Телеграм?».
Виды ботов и что они умеют
В Телеграме существует огромное количество различных помощников. Отличить их от обычных пользователей можно по надписи «bot» в названии. Ну а бывают они следующих видов:
Являются простой имитацией собеседника, разговаривая на необходимую пользователю тематику. Часто имитируют консультантов с заготовленными заранее ответами. Зачастую банки и крупные магазины используют таких ботов вместо операторов Call-центра.
Основная цель — информирование о мероприятиях или каких-то событиях, новостях. Самое простое использование такого бота — это отправка сообщений пользователю о курсах валют, последних новостях, информации о предстоящих мероприятиях в городе и т.д.
Позволяют играть в разные игры. Главное отличие от сетевых игрушек из тех же социальных сетей в том, что они имеют текстовую основу, без графики и анимации.
Используются преимущественно онлайн-сервисами. Помогают разобраться в функционале и работе.
- Комбинированные
В реальности большинство ботов использует комбинированные механики и сочетают в себе несколько видов. С помощью одного такого можно как с успехом обучаться, так и быть информированным о различных тематических мероприятиях.
Вам может быть интересно — «Как добавить стикеры в Telegram?».
Как найти бота
На самом деле эта задача не такая уж и сложная. Если сравнивать с 2017 годом, то тогда для поиска ботов нужно было приложить уйму усилий. Сейчас же все делается буквально в пару кликов.
Как и где найти
Существует 2 два способа, как найти ботов в Телеграм:
- в мессенджере, введя название в строке поиска;
- поиск ботов в специальных каталогах и подборках.
По первому пункту, думаю, вы и сами сможете разобраться. Строка поиска находится прямо над списком контактов, а чтобы вы слишком не парились с названиями, ниже я перечислю самых популярных помощников и их функционал.
Что касается подборок, то найти их можно на специальных сайтах. К примеру, вот один из популярнейших каталогов ботов, каналов и чатов (слева есть меню, в котором можете открыть требуемую вкладку с подборкой ботов). В нем все разделено по категориям, поэтому найти нужного не составит большого труда.
Кстати, один важный момент. Обычно для поиска советуют использовать @StoreBot, но от этого лучше воздержаться. Причина проста, он не реагирует на команды. Если в 2017 году он действительно работал и помогал, то сейчас либо сломан, либо просто давно не обновлялся и поэтому бесполезен.
Популярные боты
А теперь давайте рассмотрим самых полезных ботов из различных тематик. Уверен, вам обязательно приглянется хотя бы один из них:
WeathersBot – присылает прогноз погоды. Нужно только задать страну, город и по желанию настроить функцию автоматического ежедневного оповещения.
FleepBot – позволяет делать отложенные посты. Кроме того он умеет:
- разрабатывать контент-план;
- показывать статистику дохода от рекламы;
- прайсы и их разработка;
- пространство для хранения изображений для рекламы;
- рассылка клиентам;
- техническая поддержка.
Подойдет для ведения тематических каналов и блогов.
Бот Гена – помогает осуществлять быструю продажу рекламы. Его функции:
- закрывать рекламные места на канале;
- получать входящие предложения о размещении рекламы со скидкой;
- фильтрация каналов по числу подписчиков.
Гена помогает людям занимающимся заработком на каналах.
ChatkeeperBot – выступает в качестве модератора в чатах. В его функционале много настроек:
- удалять спам;
- удалять лишние ссылки;
- банить за написание стоп-слов;
- может запрещать добавлять ботов.
Кроме этого, позволяет расшевелить заскучавшую аудиторию, рассказав анекдот.
Vk Music – позволяет находить музыку из ВК. Кроме поиска и прослушивания композиции дает возможность скачать понравившиеся треки.
Функционал бота:
- каталог популярной музыки;
- подборка новинок;
- бесплатное прослушивание.
Является отличной альтернативой аудиозаписям в ВК, особенно учитывая ограничения и необходимость приобретения подписки.
Пранк Бот – поможет качественно разыграть человека. Все шутки отсортированы по возрасту, полу и жизненным случаям.
Для работы достаточно выбрать тему разговора и ввести номер человека, которого необходимо разыграть. Дальше бот все сделает сам.
Киноман – ну тут из названия понятно, зачем он нужен. Имеет достаточно большой функционал, среди которого:
- рекомендации фильмов;
- сортировка фильмов и сериалов;
- показывает афишу кинотеатров и помогает приобретать билеты на сеанс;
- имеется коллекция игр;
- поиск кинотеатров поблизости.
Кроме того имеет большую библиотеку текстовых и аудиокниг. Достаточно запустить, ввести название книги или автора и приступить к чтению или прослушиванию.
Медуза – бот новостного издания. Позволяет получать свежие новости прямо в мессенджер. Просто запускаете и выбираете подписку.
Собственно, список самых лучших ботов окончен. Пора узнать, как ими пользоваться.
Вам может быть интересно — «Как найти канал в Телеграмм?».
Как использовать бота
А сейчас я расскажу вам о том, как пользоваться ботами. Рассмотрю общие настройки, покажу основные команды и объясню, что делать, если они не проходят.
Как пользоваться
Чтобы начать, найдите и откройте бота, после чего нажмите на кнопку «Запустить»:
Напишите команды, которые нужно выполнить. Либо, как вариант, нажмите на нужную в появившемся меню:
Запомните, команда всегда начинается со знака «/» и содержит от пяти до тридцати символов латинского алфавита или спецзнаков.
Далее все предельно просто. Бот будет просить вас выполнить то или иное действие, задать первоначальные настройки (вроде времени публикации оповещений), либо сразу начнет выполнение команды.
Общие команды
К счастья для нас все боты так или иначе имеют общие, стандартные команды, которыми можно воспользоваться. Одно плохо, их очень мало. Ну а если быть совсем точным, то, по сути, всего три:
- /start — запускает приложение;
- /help — помощь в работе с приложением;
- /settings — меню настроек;
Некоторые помощники понимают эти команды на русском языке.
Что делать, если бот не отвечает на команды
Главная проблема в сбоях при работе с ботами — это проблемы с серверами Телеграм. Из-за этого происходят зависания и отказы при выполнении команд. Чтобы исправить ситуацию, достаточно просто подождать, пока системные администраторы все починят.
Еще одна возможная причина отсутствия реакции на команды — это ошибка в написании кода. Здесь уже необходимо разбираться создателю бота. Увы, но по другому тут никак не помочь.
Последняя причина — это ввод команды, которую бот банально не распознает или не знает. Здесь поможет гугл или ввод команды «/».
Заключение
Ну что же, теперь и вы знаете, что такое боты в Телеграм. Более того, легко сможете найти и запустить понравившейся. У меня же на этом все. Подписывайтесь и до встречи в следующих статьях! Удачи!
Аналитика для Telegram-ботов, написанных на Python / Хабр
На данный момент бум на создание телеграмм-ботов начал сходить, но тема их создания не теряет актуальности. Написано множество библиотек для облегчение взаимодействия с Telegram Bot API, но после создания бота я так и не нашёл скрипта(библиотеки) для получения статистики бота. Поэтому решил написать скрипт для всех ботов на Python. Статистику будем получать, логируя действия пользователей и обрабатывая логи в удобный вид.
Требования для среды
Для использования скрипта нужно установить следующие библиотеки:
pip install datetime
pip install pandas
Как внедрить аналитику в своего бота?
Скачайте с репозитория py-скрипт под свою ОС и data.csv файл. Разместите их в папке, где лежит ваш бот.
После подключения используемых вами библиотек в файле с телом бота добавьте строчку:
import tg_analytic
После команд бота добавьте:
tg_analytic.statistics(<id пользователя>, <команда>)
Если вы используете библиотеку telebot, то это должно выглядеть следующим образом:
Также, чтобы получать статистику прямо из бота, нужно добавить в message_handler(content_types=[‘text’]):
if message.text[:(длина ключевого слова)] == '<ключевое слово>':
st = message.text.split(' ')
if 'txt' in st or 'тхт' in st:
tg_analytic.analysis(st,message.chat.id)
with open('%s.txt' %message.chat.id ,'r',encoding='UTF-8') as file:
bot.send_document(message.chat.id,file)
tg_analytic.remove(message.chat.id)
else:
messages = tg_analytic.analysis(st,message.chat.id)
bot.send_message(message.chat.id, messages)
Ключевое слово нужно придумать и вписать для того, чтобы только вы могли просматривать статистику вашего бота. В репозитории хранится также телеграм-бот с уже внедрённой аналитикой, чтобы вы могли ознакомиться как подключить её на примере.
Какие команды использовать для получение статистики?
К примеру ключевое слово будет «статистика»:
if message.text[:10] == 'статистика' or message.text[:10] == 'Cтатистика':
st = message.text.split(' ')
if 'txt' in st or 'тхт' in st:
tg_analytic.analysis(st,message.chat.id)
with open('%s.txt' %message.chat.id ,'r',encoding='UTF-8') as file:
bot.send_document(message.chat.id,file)
tg_analytic.remove(message.chat.id)
else:
messages = tg_analytic.analysis(st,message.chat.id)
bot.send_message(message.chat.id, messages)
Тело команды боту выглядит следующим образом:
статистика <количество дней> <параметры запроса*>>
* — Есть команды: «пользователи», «команды» и «тхт». Можно использовать одновременно. «Пользователи» даёт статистику по людям за необходимое вам количество дней. «Команды» даёт статистику по командам за необходимое вам количество дней. При указание txt, вы получите файл, в ином случае ответ в телеграмм.
Пример использования команд
Cтатистика 2 пользователи команды
Cтатистика 2 команды
Статистика 2 пользователи команды тхт
Из чего состоит скрипт?
В целом, если вас не интересует работа скрипта, то уже на этом этапе можете закончить чтение статьи и начать внедрение в своего бота.
Первая часть скрипта — это логирование действий пользователей. Я принял решение сохранять только дату, id пользователя и используемую им команду:
def statistics(user_id, command):
data = datetime.datetime.today().strftime("%Y-%m-%d")
with open('data.csv', 'a', newline="", encoding='UTF-8') as fil:
wr = csv.writer(fil, delimiter=';')
wr.writerow([data, user_id, command])
Вторая часть — это обработка данных по запросу и вывод необходимой статистики. Мы считываем данные из csv в Pandas группируем по пользователям и командам:
season = int(bid[1])
#Считывание данных в Dataframe
df = pd.read_csv('data.csv', delimiter=';', encoding='utf8')
#Получение количества всех пользователей и дней
number_of_users = len(df['id'].unique())
number_of_days = len(df['data'].unique())
#Узнаём о количестве пользователей в опредёленные дни
df_user = df.groupby(['data', 'id']).count().reset_index().groupby('data').count().reset_index()
list_of_dates_in_df_user = list(df_user['data'])
list_of_number_of_user_in_df_user = list(df_user['id'])
list_of_dates_in_df_user = list_of_dates_in_df_user[-season:]
list_of_number_of_user_in_df_user = list_of_number_of_user_in_df_user[-season:]
#Узнаем о количестве использованых команд по дням
df_command = df.groupby(['data', 'command']).count().reset_index()
unique_commands = df['command'].unique()
commands_in_each_day = []
list_of_dates_in_df_command = list(df_command['data'])
list_of_number_of_user_in_df_command = list(df_command['id'])
list_of_name_of_command_in_df_command = list(df_command['command'])
commands_in_this_day = dict()
for i in range(len(list_of_dates_in_df_command)):
commands_in_this_day[list_of_name_of_command_in_df_command[i]] = list_of_number_of_user_in_df_command[i]
if i + 1 >= len(list_of_dates_in_df_command) or list_of_dates_in_df_command[i] != list_of_dates_in_df_command[i + 1]:
commands_in_each_day.append(commands_in_this_day)
commands_in_this_day = dict()
commands_in_each_day = commands_in_each_day[-season:]
Ответ пользователю составляется на основе данных из предыдущего шага:
message_to_user = 'Статистика использования бота за %s %s: \n' % (season, day_type.get(season, 'дней'))
message_to_user += 'Всего статистика собрана за %s %s: \n' % (number_of_days, day_type.get(season, 'дней'))
if season > number_of_days:
season = number_of_days
message_to_user += 'Указанное вами количество дней больше,чем имеется\n' \
'Будет выведена статистика за максимальное возможное время\n'
if 'пользователи' in bid:
message_to_user += 'За всё время бота использовало: ' + '%s' % number_of_users \
+ ' %s ' % users_type.get(number_of_users, 'пользователей') + '\n' \
'Пользователей за последние %s %s: \n' % (season, day_type.get(season, 'дней'))
for days, number, comm_day in zip(list_of_dates_in_df_user, list_of_number_of_user_in_df_user,
commands_in_each_day):
message_to_user += 'Дата:%s Количество:%d Из них новых:%s\n' % (days, number, comm_day.get('/start', 0))
if 'команды' in bid:
message_to_user += 'Статистика команд за последние %s %s: \n' %
(season,day_type.get(season, 'дней'))
for days, commands in zip(list_of_dates_in_df_user, commands_in_each_day):
message_to_user += 'Дата:%s\n' % days
for i in unique_commands:
if i in commands:
message_to_user += '%s - %s раз\n' % (i, commands.get(i))
else:
message_to_user += '%s - 0 раз\n' % i
В конце, после составления ответного сообщения, мы проверяем запрос пользователя на наличее команды «тхт», чтобы решить в каком формате ответить:
if 'txt' in bid or 'тхт' in bid:
with open('%s.txt' % user_id, 'w', encoding='UTF-8') as fil:
fil.write(message_to_user)
fil.close()
else:
return message_to_user
Заключение
Скрипт оттестирован и работает в нормальном режиме.
Ключевое слово: «статистика».
Приятного использования!
Создание и хостинг телеграм бота. От А до Я / Хабр
Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на python3, я не нашёл инструкций, где показан путь от первой строчки кода до деплоинга бота (по крайней мере все методы, что я видел, немного устарели). В этой статье я хочу показать процесс создания бота от написания BotFather-у до деплоинга бота на Heroku.
Статья получилась длинной, советую пробежаться глазами по содержанию и кликнуть по интересующему вас пункту.
P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.
Для начала стоит определиться, что же будет делать наш бот. Я решил написать банального простого бота, кторый будет парсить и выдавать нам заголовки с Хабра.
И так, начнём же.
BotFather
Для начала нам надо зарегистрировать нашего бота в Telegram. Для этого:
В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.
Пишем /newbot. Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.
P.S. Оно должно заканчиваться на Bot/bot
Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather
Дальше добавим ему пару команд: пропишем /setcommands и одним сообщением, т.к. /setcommands не добавляет команды, а задаёт их с нуля, пошлём ему команды.
all - спарсить заголовки с вкладки "ВСЁ ПОДРЯД"
top - спарсить заголовки с вкладки "ЛУЧШЕЕ"
На этом работа с BotFather закончилась, перейдём к следующей части.
Установка и настройка pipenv. Первый запуск.
Для начала создадим файл, в котором будет основной код бота bot.py. Если бот большой, то сразу создавайте файлы, куда вы вынесете функции, классы и т.д, иначе читаемость кода стремится к нулю. Я добавлю parser.py
Установим pipenv, если его конечно ещё нет.
Для Windows:
pip install pipenv
Для Linux:
sudo pip3 install pipenv
Установим pipenv в папку проекта.
pipenv install
Установим интересующие нас библиотеки. Я буду работать с PyTelegramBotAPI. Также для парсинга добавим BeautifulSoup4.
pipenv install PyTelegramBotAPI
pipenv install beautifulsoup4
Начинаем писать код!
Открываем bot.py, импортируем библиотеки и создаём главные переменные.
import telebot
import parser
#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)
Запустим бота. Посмотри наличие ошибок.Как запустить?Для Windows:
python bot.py
Для Linux:
python3 bot.py
Если ошибок не появилось, то продолжим.
Хэндлеры. Отвечаем на команды и сообщения
Пришло время научить бота отвечать нам. Возможно даже сделать его ответы полезными.
Основы взаимодействия. Ответ на команды
Для взаимодействия с пользователем, т.е. для ответа на его команды и сообщения используются хэндлеры.
Начнём с самого простого: ответим на команды /start и /go
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с Хабра')
bot.polling()
Сейчас разберёмся что это и как это работает. Передаём в message_handler параметр commands равный массиву со строками — командами, на которые он будет отвечать описанным ниже образом. (На все эти команды он ответит одинаково). Далее используем send_message, в него записываем id чата (его можно достать из message.chat.id), в который отправить сообщение и, собственно, само сообщение. Нельзя забыть написать bot.polling() в конце кода, иначе бот сразу же выключиться. Почему так мы узнаем позже.
Теперь можно запустить бота и написать ему /start или /go и он ответит.
P.S. Сообщение может быть не только строкой, а, в принципе, чем угодно.
P.S.S. Что за message?Это json объект, хранящий информацию об отправителе, чате, и самом сообщении.
{
'content_type': 'text',
'message_id': 5,
'from_user':
{
'id': 333960329,
'first_name': 'Nybkox',
'username': 'nybkox',
'last_name': None
},
'date': 1520186598,
'chat':
{
'type': 'private',
'last_name': None,
'first_name': 'Nybkox',
'username': 'nybkox',
'id': 333960329,
'title': None,
'all_members_are_administrators': None
},
'forward_from_chat': None,
'forward_from': None,
'forward_date': None,
'reply_to_message': None,
'edit_date': None,
'text': '/start',
'entities': [<telebot.types.MessageEntity object at 0x7f3061f42710>],
'audio': None,
'document': None,
'photo': None,
'sticker': None,
'video': None,
'voice': None,
'caption': None,
'contact': None,
'location': None,
'venue': None,
'new_chat_member': None,
'left_chat_member': None,
'new_chat_title': None,
'new_chat_photo': None,
'delete_chat_photo': None,
'group_chat_created': None,
'supergroup_chat_created': None,
'channel_chat_created': None,
'migrate_to_chat_id': None,
'migrate_from_chat_id': None,
'pinned_message': None
}
Основы взаимодействия. Ответ на текстовые сообщения.
Теперь обработаем текстовые сообщения бота. Самое важное что нам нужно знать это то, что текст сообщения храниться в message.text и то, что, чтобы обрабатывать текст в message_handler нужно передавать content_types=[‘text’].
Добавим вот такой код.
@bot.message_handler(content_types=['text'])
def text_handler(message):
text = message.text.lower()
chat_id = message.chat.id
if text == "привет":
bot.send_message(chat_id, 'Привет, я бот - парсер хабра.')
elif text == "как дела?":
bot.send_message(chat_id, 'Хорошо, а у тебя?')
else:
bot.send_message(chat_id, 'Простите, я вам не понял :(')
Тут мы довабили пару переменных: вынесли текст сообщения (в нижнем регистре, чтобы не было лишних проблем с теми кто пишет капсом, заборчиком и т.д.) в переменную text, вынесли message.chat.id в отдельную переменную, чтобы каждый раз не обращаться к message. Также мы построили небольшое ветвление, для ответа на определённые сообщения, а также ответ на случай непонятного боту сообщения.Итоговый код
import bs4
import parser
#main variables
TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA"
bot = telebot.TeleBot(TOKEN)
#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с хабра')
@bot.message_handler(content_types=['text'])
def text_handler(message):
text = message.text.lower()
chat_id = message.chat.id
if text == "привет":
bot.send_message(chat_id, 'Привет, я бот - парсер хабра.')
elif text == "как дела?":
bot.send_message(chat_id, 'Хорошо, а у тебя?')
else:
bot.send_message(chat_id, 'Простите, я вас не понял :(')
bot.polling()
Основы взаимодействия. Ответ на картинки, документы, аудио и прочие.
Для ответа на картинки, стикеры, документы, аудио и т.д. нужно всего лишь поменять content_types=[‘text’].
Рассмотрим пример с картинкой, добавив этот код.
@bot.message_handler(content_types=['photo'])
def text_handler(message):
chat_id = message.chat.id
bot.send_message(chat_id, 'Красиво.')
Все типы контента:
text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message
Строим цепочку ответов.
Пришло время закончить с элементарными действиями и начать что-то серьёзное. Попробуем построить цепочку ответов. Для этого нам понадобиться register_next_step_handler(). Создадим простой пример, на котором и разберёмся как работает register_next_step_handler().
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
chat_id = message.chat.id
text = message.text
msg = bot.send_message(chat_id, 'Сколько вам лет?')
bot.register_next_step_handler(msg, askAge)
def askAge(message):
chat_id = message.chat.id
text = message.text
if not text.isdigit():
msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.')
bot.register_next_step_handler(msg, askAge) #askSource
return
msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.')
И так, в первой функции добавился bot.register_next_step_handler(msg, askAge), в него мы передаём сообщение, которые хотим послать, и следующий щаг, к которому перейти после ответа пользователя.
Во второй функции всё поинтересней, здесь идёт проверка ввёл ли пользователь число, и, если нет, то функция рекурсивно вызывает сама себя, с сообщением «Возраст должен быть числом, введите ещё раз.». Если пользователь ввёл всё верно, то он получает ответ.
Но, есть тут проблема. Можно повторно вызвать команду /go или /start, и начнётся бардак.
Пофиксить это несложно, добавим переменную для проверки состояния выполнения скрипта.
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
global isRunning
if not isRunning:
chat_id = message.chat.id
text = message.text
msg = bot.send_message(chat_id, 'Сколько вам лет?')
bot.register_next_step_handler(msg, askAge) #askSource
isRunning = True
def askAge(message):
chat_id = message.chat.id
text = message.text
if not text.isdigit():
msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.')
bot.register_next_step_handler(msg, askAge) #askSource
return
msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.')
isRunning = False
С построением простых цепочек мы разобрались, пойдём дальше.
Добавляем парсер в цепочку.
Для начала нужен сам парсер. Обратим внимание на то, что во вкладках «Лучшее» и «Всё подряд» есть дополнительные фильтры: сутки, неделя, месяц и ≥10, ≥25, ≥50, ≥100 соответственно.
Парсер конечно можно написать и в 1 функцию, но я разобью на 2, так будет проще читать код.Парсер.
import urllib.request
from bs4 import BeautifulSoup
def getTitlesFromAll(amount, rating='all'):
output = ''
for i in range(1, amount+1):
try:
if rating == 'all':
html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read()
else:
html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read()
except urllib.error.HTTPError:
print('Error 404 Not Found')
break
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all('a', class_ = 'post__title_link')
for i in title:
i = i.get_text()
output += ('- "'+i+'",\n')
return output
def getTitlesFromTop(amount, age='daily'):
output = ''
for i in range(1, amount+1):
try:
html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read()
except urllib.error.HTTPError:
print('Error 404 Not Found')
break
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all('a', class_ = 'post__title_link')
for i in title:
i = i.get_text()
output += ('- "'+i+'",\n')
return output
По итогу парсер возвращает нам строку с заголовками статей, основываясь на наших запросах.
Пробуем, используя полученные знания, написать бота связанного с парсером. Я решил создать отдельный класс (это скорее всего неправильный метод, но это уже относится к питону, а не к основной теме статьи), и в объекте этого класса хранить изменяемые данные.
Итоговый код:
bot.py
import telebot
import bs4
from Task import Task
import parser
#main variables
TOKEN = '509706011:AAF7ghlYpqS5n7uF8kN0VGDCaaHnxfZxofg'
bot = telebot.TeleBot(TOKEN)
task = Task()
#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
if not task.isRunning:
chat_id = message.chat.id
msg = bot.send_message(chat_id, 'Откуда парсить?')
bot.register_next_step_handler(msg, askSource)
task.isRunning = True
def askSource(message):
chat_id = message.chat.id
text = message.text.lower()
if text in task.names[0]:
task.mySource = 'top'
msg = bot.send_message(chat_id, 'За какой временной промежуток?')
bot.register_next_step_handler(msg, askAge)
elif text in task.names[1]:
task.mySource = 'all'
msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?')
bot.register_next_step_handler(msg, askRating)
else:
msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.')
bot.register_next_step_handler(msg, askSource)
return
def askAge(message):
chat_id = message.chat.id
text = message.text.lower()
filters = task.filters[0]
if text not in filters:
msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.')
bot.register_next_step_handler(msg, askAge)
return
task.myFilter = task.filters_code_names[0][filters.index(text)]
msg = bot.send_message(chat_id, 'Сколько страниц парсить?')
bot.register_next_step_handler(msg, askAmount)
def askRating(message):
chat_id = message.chat.id
text = message.text.lower()
filters = task.filters[1]
if text not in filters:
msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.')
bot.register_next_step_handler(msg, askRating)
return
task.myFilter = task.filters_code_names[1][filters.index(text)]
msg = bot.send_message(chat_id, 'Сколько страниц парсить?')
bot.register_next_step_handler(msg, askAmount)
def askAmount(message):
chat_id = message.chat.id
text = message.text.lower()
if not text.isdigit():
msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.')
bot.register_next_step_handler(msg, askAmount)
return
if int(text) < 1 or int(text) > 11:
msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <11. Введите корректно.')
bot.register_next_step_handler(msg, askAmount)
return
task.isRunning = False
output = ''
if task.mySource == 'top':
output = parser.getTitlesFromTop(int(text), task.myFilter)
else:
output = parser.getTitlesFromAll(int(text), task.myFilter)
msg = bot.send_message(chat_id, output)
bot.polling(none_stop=True)
Тут добавился none_stop=True)
к bot.polling
, из-за этого бот не будет падать при каждой ошибке.
Task.py
class Task():
isRunning = False
names = [
['лучшие', 'лучшее', 'топ'],
['всё', 'всё подряд', 'all']
]
filters = [
['сутки', 'неделя', 'месяц'],
['без порога', '10', '25', '50', '100']
]
filters_code_names = [
['daily', 'weekly', 'monthly'],
['all', 'top10', 'top25', 'top50', 'top100']
]
mySource = ''
myFilter = ''
def __init__(self):
return
parser.py
import urllib.request
from bs4 import BeautifulSoup
def getTitlesFromAll(amount, rating='all'):
output = ''
for i in range(1, amount+1):
try:
if rating == 'all':
html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read()
else:
html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read()
except urllib.error.HTTPError:
print('Error 404 Not Found')
break
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all('a', class_ = 'post__title_link')
for i in title:
i = i.get_text()
output += ('- "'+i+'",\n')
return output
def getTitlesFromTop(amount, age='daily'):
output = ''
for i in range(1, amount+1):
try:
html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read()
except urllib.error.HTTPError:
print('Error 404 Not Found')
break
soup = BeautifulSoup(html, 'html.parser')
title = soup.find_all('a', class_ = 'post__title_link')
for i in title:
i = i.get_text()
output += ('- "'+i+'",\n')
return output
Теория. Методы взаимодействия с ботом.
Мы используем long polling для получения данных о сообщениях от бота.
bot.polling(none_stop=True)
Есть же вариант использовать в корне другой метод — вебхуки. Так бот сам будет отправлять нам данные о получении сообщения и т.д. Но этот метод сложнее в настройке, и, для простого показательного бота я решил его не использовать.
Также в дополнительных материалах будут ссылки на всё, что использовалось и о чём говорилось.
Маркапы. Добавляем клавиатуры для быстрого ответа.
Наконец основной код дописан. Теперь можно передохнуть и написать маркапы. Я думаю вы неоднократно видели их, но всё же, приложу скриншот. [SCREENSHOT]
Я выведу маркапы в отдельный файл — markups.py.
В написании маркапов нет ничего сложного. Нужно лишь создать маркап, указать пару параметров, создать пару кнопок и добавить их в маркап, далее просто указываем reply_markup=markup
в send_message
.
Примерmarkups.py
from telebot import types
source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
source_markup_btn1 = types.KeyboardButton('Лучшие')
source_markup_btn2 = types.KeyboardButton('Всё подряд')
source_markup.add(source_markup_btn1, source_markup_btn2)
В параметры маркапа указываем ширину строки и изменение размеров кнопок, иначе они огромны.Можно конечно заполнять отдельно каждую строк.
markup = types.ReplyKeyboardMarkup()
itembtna = types.KeyboardButton('a')
itembtnv = types.KeyboardButton('v')
itembtnc = types.KeyboardButton('c')
itembtnd = types.KeyboardButton('d')
itembtne = types.KeyboardButton('e')
markup.row(itembtna, itembtnv)
markup.row(itembtnc, itembtnd, itembtne)
bot.py
def start_handler(message):
if not task.isRunning:
chat_id = message.chat.id
msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup)
bot.register_next_step_handler(msg, askSource)
task.isRunning = True
Применим полученные знания к нашему боту.Итоговый кодmarkups.py
from telebot import types
start_markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
start_markup_btn1 = types.KeyboardButton('/start')
start_markup.add(start_markup_btn1)
source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
source_markup_btn1 = types.KeyboardButton('Лучшие')
source_markup_btn2 = types.KeyboardButton('Всё подряд')
source_markup.add(source_markup_btn1, source_markup_btn2)
age_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
age_markup_btn1 = types.KeyboardButton('Сутки')
age_markup_btn2 = types.KeyboardButton('неделя')
age_markup_btn3 = types.KeyboardButton('Месяц')
age_markup.add(age_markup_btn1, age_markup_btn2, age_markup_btn3)
rating_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
rating_markup_btn1 = types.KeyboardButton('Без порога')
rating_markup_btn2 = types.KeyboardButton('10')
rating_markup_btn3 = types.KeyboardButton('25')
rating_markup_btn4 = types.KeyboardButton('50')
rating_markup_btn5 = types.KeyboardButton('100')
rating_markup.row(rating_markup_btn1, rating_markup_btn2)
rating_markup.row(rating_markup_btn3, rating_markup_btn4, rating_markup_btn5)
amount_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
amount_markup_btn1 = types.KeyboardButton('1')
amount_markup_btn2 = types.KeyboardButton('3')
amount_markup_btn3 = types.KeyboardButton('5')
amount_markup.add(amount_markup_btn1, amount_markup_btn2, amount_markup_btn3)
bot.py
import telebot
import bs4
from Task import Task
import parser
import markups as m
#main variables
TOKEN = '509706011:AAF7aaaaaaaaaaaaaaaaaaaAAAaaAAaAaAAAaa'
bot = telebot.TeleBot(TOKEN)
task = Task()
#handlers
@bot.message_handler(commands=['start', 'go'])
def start_handler(message):
if not task.isRunning:
chat_id = message.chat.id
msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup)
bot.register_next_step_handler(msg, askSource)
task.isRunning = True
def askSource(message):
chat_id = message.chat.id
text = message.text.lower()
if text in task.names[0]:
task.mySource = 'top'
msg = bot.send_message(chat_id, 'За какой временной промежуток?', reply_markup=m.age_markup)
bot.register_next_step_handler(msg, askAge)
elif text in task.names[1]:
task.mySource = 'all'
msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?', reply_markup=m.rating_markup)
bot.register_next_step_handler(msg, askRating)
else:
msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.')
bot.register_next_step_handler(msg, askSource)
return
def askAge(message):
chat_id = message.chat.id
text = message.text.lower()
filters = task.filters[0]
if text not in filters:
msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.')
bot.register_next_step_handler(msg, askAge)
return
task.myFilter = task.filters_code_names[0][filters.index(text)]
msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup)
bot.register_next_step_handler(msg, askAmount)
def askRating(message):
chat_id = message.chat.id
text = message.text.lower()
filters = task.filters[1]
if text not in filters:
msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.')
bot.register_next_step_handler(msg, askRating)
return
task.myFilter = task.filters_code_names[1][filters.index(text)]
msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup)
bot.register_next_step_handler(msg, askAmount)
def askAmount(message):
chat_id = message.chat.id
text = message.text.lower()
if not text.isdigit():
msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.')
bot.register_next_step_handler(msg, askAmount)
return
if int(text) < 1 or int(text) > 5:
msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <6. Введите корректно.')
bot.register_next_step_handler(msg, askAmount)
return
task.isRunning = False
print(task.mySource + " | " + task.myFilter + ' | ' + text) #
output = ''
if task.mySource == 'top':
output = parser.getTitlesFromTop(int(text), task.myFilter)
else:
output = parser.getTitlesFromAll(int(text), task.myFilter)
msg = bot.send_message(chat_id, output, reply_markup=m.start_markup)
bot.polling(none_stop=True)
Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.
Деплоим бота на Heroku.
Для начала надо зарегистрироваться на Хероку и на Гитхабе.
Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара)
Сейчас нам нужен Procfile (Procfile.windows для windows). Создаём его и записываем в него bot: python3 bot.py
Теперь удаляем TOKEN из bot.py, здесь он не нужен, ведь мы будем загружать этот файл на гитхаб. Через тот же терминале, что использовали для запуска бота, заливаем файлы на гитхаб. (Предворительно удалите папку __pycache__).
echo "# HabrParser_Bot" >> README.md
git init
git add .
git add *
git commit -m "Initial Commit" -a
git remote add origin origin https://github.com/name/botname.git #Указываем свою ссылку
git push -u origin master
Гит просит логин и пароль, спокойно вводим и преступаем к деплоингу бота на хероку. Пишем всё в том же терминале.
Теперь возвращаем TOKEN в bot.py, здесь он нужен, ведь мы будем загружать этот файл на хероку.
heroku login #Вводим email и пароль
heroku create --region eu habrparserbot #Не забываемпоменять имя приложения
#P.S. в имени могут быть только буквы в нижнем регитсре, цифры и тире.
heroku addons:create heroku-redis:hobby-dev -a habrparserbot #И снова меняем имя!
heroku buildpacks:set heroku/python
git push heroku master
heroku ps:scale bot=1 # запускаем бота
heroku logs --tail #включаем логи
Чтобы выключить бота
heroku ps:stop bot
И, не забываем перед залитием на гитхаб и удалить TOKEN из нашего bot.py. Ведь нам не нужно, чтобы кто-то им пользовался. Можно конечно воспользоваться .gitignore и вынести токены в отдельный фай.
Поздравляю!
Работа окончена, бот работает удалённо.
Ссылки
Конечный код бота на гитхабе
API для управления ботом
Про деплоинг
Про pipenv
Большой гайд, возможно кому-то пригодится
Заключение
Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т.д.) — пишите.UPDATES
UPD1
- Добавлены якори в содержание.
- Изменён алгоритм залития кода на гитхаб и хероку.
- Убрана версия PyTelegramBotAPI, т.к. теперь хероку работает нормально с новыми версиями.
Как я сделал телеграм-бота, который сообщает, что надеть по погоде — Интернет на TJ
И привел туда 65 000 пользователей без затрат на рекламу и навыков программирования.
Идея бота возникла не только на почве банального «пойти налегке и замерзнуть вечером или носить весь день c собой куртку», но и еще по двум причинам:
1) в течение дня температуре свойственно меняться, а выбор в одежде иногда приходится делать всего раз в день
утром +3, днем +8, а вечером +4
2) зачастую остаются незамеченными ветер и влажность, которые по итогу значительно влияют на то, как ощущается температура
видно, что ощущаемая температура отличается от фактической
А поскольку конечная цель — это все-таки выбор одежды, то я решил спрятать цифры и выдавать пользователю сразу советы по вещам.
Не имея за душой ни строчки кода, собирать бота я полез на конструктор botmother, в котором есть возможность делать простые API-запросы, например к погодным сервисам и получать всю необходимую информацию. Схема работы бота выглядит так:
1) бот запрашивает данные погоды в выбранном пользователем городе
2) рассчитывает температуру «по ощущениям» для каждого часа
3) определяет средние значения для утра, полудня и вечера
4) по ним подбирает одежду из каталога, составленного на основе собственных наблюдений
5) присылает сообщение с прогнозом одежды
Пользователь видит только:
Вид бота изнутри:
php — как отловить ошибку в телеграм-боте?
Переполнение стека
- Около
Товары
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
Зарегистрироваться
.
Как создать чат-бота Telegram
Чат-бот — это автоматизированный многофункциональный помощник, который может принимать отправленные и отправленные инициированные сообщения, а с помощью SendPulse ваш бот может сохранять информацию в виде переменных для дальнейшего использования.
Следуйте пошаговой инструкции, чтобы создать своего первого чат-бота для мессенджера Telegram, или подключите существующего к SendPulse для дальнейшей настройки.
Если у вас уже есть бот, пропустите первый абзац и посмотрите следующий раздел.
Как создать нового бота для Telegram
Откройте мессенджер Telegram, войдите в свою учетную запись или создайте новую.
Шаг 1. Введите @Botfather во вкладке поиска и выберите этого бота.
Обратите внимание, у официальных ботов Telegram рядом с их именем есть синяя галочка
Нажмите «Пуск», чтобы активировать бота BotFather.
В ответ вы получите список команд для управления ботами.
Шаг 2 . Выберите или введите команду / newbot
и отправьте ее.
Шаг 3. Выберите имя для своего бота — ваши подписчики увидят его в разговоре. И выберите логин для своего бота — бота можно будет найти в поиске по логину. Имя пользователя должно быть уникальным и заканчиваться словом «бот».
После того, как вы выбрали подходящее имя для своего бота — бот создан.Вы получите сообщение со ссылкой на вашего бота t.me/
Для подключения бота к SendPulse необходим токен. Скопируйте значение своего токена и найдите дополнительную информацию о подключении бота к SendPulse в последнем разделе этой статьи.
Как найти токен для существующего бота
Шаг 1. Перейдите к боту @BotFather и отправьте команду / token
.
Вы увидите кнопки со всеми созданными вами ботами.
Шаг 2. Выберите тот, для которого вам нужен токен, чтобы вы могли подключить его к Sendpulse.
Скопируйте значение токена.
Как подключить бота к SendPulse
Перейдите в раздел «Чат-боты» в своей учетной записи SendPulse. Если вы впервые заходите на эту страницу и не подключили чат-ботов, нажмите кнопку «Подключить каналы».Если вы уже подключали ботов раньше — перейдите на вкладку «Основные» и нажмите кнопку «Управление ботами».
Затем выберите Telegram и нажмите кнопку «Включить Telegram».
Введите свой токен от нужного бота и нажмите «Подключиться».
В следующем окне нажмите кнопку «Подписаться».
Вы будете перенаправлены в приложение Telegram, нажмите кнопку «Пуск», и вы будете подписаны на своего бота.
Поздравляем! Вы успешно добавили своего чат-бота в SendPulse.
Вы можете выбрать своего бота и начать создавать приветственные и инициируемые потоки или массовые кампании.
Обратите внимание, существующие подписчики не импортируются в аудиторию вашего чат-бота SendPulse. После подключения бота вы можете собирать подписчиков с помощью виджета сайта или напрямую делиться ссылкой на своего бота t.me/
Подключите своего бота Telegram
Последнее обновление: 2020-04-17
.
Научитесь создавать своего первого бота в Telegram с Python
Представьте себе, есть бот для сообщений, который отправит вам случайное изображение милой собаки, когда вы захотите, звучит круто, правда? Давай сделаем!
В этом руководстве мы будем использовать Python 3, python-telegram-bot, и общедоступный API RandomDog .
В конце этого урока у вас будет бот для снятия стресса, который будет отправлять вам милые изображения собак каждый раз, когда вам это нужно, ура!
Начало работы
Прежде чем мы начнем писать программу, нам нужно сгенерировать токен для нашего бота.Токен необходим для доступа к Telegram API и установки необходимых зависимостей.
1. Создайте нового бота в BotFather
Если вы хотите создать бота в Telegram, вы должны сначала «зарегистрировать» своего бота перед его использованием. Когда мы «зарегистрируем» нашего бота, мы получим токен для доступа к Telegram API.
Перейдите в BotFather (если вы откроете его на рабочем столе, убедитесь, что у вас установлено приложение Telegram), затем создайте нового бота, отправив команду / newbot
. Следуйте инструкциям, пока не получите имя пользователя и токен для своего бота.Вы можете перейти к своему боту, перейдя по этому URL: https://telegram.me/YOUR_BOT_USERNAME
, и ваш токен должен выглядеть так.
704418931: AAEtcZ *************
2. Установите библиотеку
Поскольку мы собираемся использовать библиотеку для этого руководства, установите ее с помощью этой команды.
pip3 install python-telegram-bot
Если библиотека успешно установлена, то все готово.
Напишите программу
Сделаем нашего первого бота.Этот бот должен возвращать изображение собаки, когда мы отправляем команду / bop
. Для этого мы можем использовать общедоступный API из RandomDog , который поможет нам генерировать случайные изображения собак.
Рабочий процесс нашего бота очень прост:
доступ к API -> получение URL-адреса изображения -> отправка изображения
1. Импортируйте библиотеки
Сначала импортируйте все необходимые библиотеки.
из telegram.ext import Updater, CommandHandler
запросы на импорт
импорт ре
2.Получите доступ к API и получите URL изображения
Давайте создадим функцию для получения URL. Используя библиотеку запросов, мы можем получить доступ к API и получить данные json.
content = requests.get ('https://random.dog/woof.json') .js
.
Как работать с несколькими пользователями Telegram-бота на C #?
Переполнение стека
- Около
Товары
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.