Пишем ему /start и получаем список всех его команд.
Первая и главная - /newbot - отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя - в конце оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.
Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение.
Не забудьте проверить полученный токен с помощью ссылки api.telegram.org/bot
Telegram позволяет не делать выгрузку сообщений вручную, а поставить webHook, и тогда они сами будут присылать каждое сообщение. Для Python, чтобы не заморачиваться с cgi и потоками, удобно использовать какой-нибудь реактор, поэтому я для реализации выбрал tornado.web. (для GAE удобно использовать связку Python2+Flask)
Каркас бота:
URL = "https://api.telegram.org/bot%s/" % BOT_TOKEN
MyURL = "https://example.com/hook"
api = requests.Session()
application = tornado.web.Application([
(r"/", Handler),
])
if __name__ == "__main__":
signal.signal(signal.SIGTERM, signal_term_handler)
try:
set_hook = api.get(URL + "setWebhook?url=%s" % MyURL)
if set_hook.status_code != 200:
logging.error("Can"t set hook: %s. Quit." % set_hook.text)
exit(1)
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
except KeyboardInterrupt:
signal_term_handler(signal.SIGTERM, None)
Здесь мы при запуске бота устанавливаем вебхук на наш адрес и отлавливаем сигнал выхода, чтобы вернуть поведение с ручной выгрузкой событий.
Приложение торнадо для обработки запросов принимает класс tornado.web.RequestHandler, в котором и будет логика бота.
Class Handler(tornado.web.RequestHandler):
def post(self):
try:
logging.debug("Got request: %s" % self.request.body)
update = tornado.escape.json_decode(self.request.body)
message = update["message"]
text = message.get("text")
if text:
logging.info("MESSAGE\t%s\t%s" % (message["chat"]["id"], text))
if text == "/":
command, *arguments = text.split(" ", 1)
response = CMD.get(command, not_found)(arguments, message)
logging.info("REPLY\t%s\t%s" % (message["chat"]["id"], response))
send_reply(response)
except Exception as e:
logging.warning(str(e))
Здесь CMD - словарь доступных команд, а send_reply - функция отправки ответа, которая на вход принимает уже сформированный объект Message .
Собственно, её код довольно прост:
Def send_reply(response): if "text" in response: api.post(URL + "sendMessage", data=response)
Теперь, когда вся логика бота описана можно начать придумывать ему команды.
Def help_message(arguments, message): response = {"chat_id": message["chat"]["id"]} result = ["Hey, %s!" % message["from"].get("first_name"), "\rI can accept only these commands:"] for command in CMD: result.append(command) response["text"] = "\n\t".join(result) return response
Структура message["from"] - это объект типа User , она предоставляет боту информацию как id пользователя, так и его имя. Для ответов же полезнее использовать message["chat"]["id"] - в случае личного общения там будет User, а в случае чата - id чата. В противном случае можно получить ситуацию, когда пользователь пишет в чат, а бот отвечает в личку.
Команда /start без параметров предназначена для вывода информации о боте, а с параметрами - для идентификации. Полезно её использовать для действий, требующих авторизации.
После этого можно добавить какую-нибудь свою команду, например, /base64:
Def base64_decode(arguments, message): response = {"chat_id": message["chat"]["id"]} try: response["text"] = b64decode(" ".join(arguments).encode("utf8")) except: response["text"] = "Can"t decode it" finally: return response
Для пользователей мобильного Telegram, будет полезно сказать @BotFather, какие команды принимает наш бот:
I: /setcommands
BotFather: Choose a bot to change the list of commands.
I: @******_bot
BotFather: OK. Send me a list of commands for your bot. Please use this format:
Command1 - Description
command2 - Another description
I:
whoisyourdaddy - Information about author
base64 - Base64 decode
BotFather: Success! Command list updated. /help
C таким описанием, если пользователь наберет /, Telegram услужливо покажет список всех доступных команд.
UPD:
Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/
Чтобы бот получал все сообщения в группах пишем @BotFather команду /setprivacy и выключаем приватность.
Для начала в Handler добавляем обработчик:
If text == "/":
...
else:
response = CMD["
А потом в список команд добавляем псевдо-речь:
RESPONSES = {
"Hello": ["Hi there!", "Hi!", "Welcome!", "Hello, {name}!"],
"Hi there": ["Hello!", "Hello, {name}!", "Hi!", "Welcome!"],
"Hi!": ["Hi there!", "Hello, {name}!", "Welcome!", "Hello!"],
"Welcome": ["Hi there!", "Hi!", "Hello!", "Hello, {name}!",],
}
def human_response(message):
leven = fuzzywuzzy.process.extract(message.get("text", ""), RESPONSES.keys(), limit=1)
response = {"chat_id": message["chat"]["id"]}
if leven < 75:
response["text"] = "I can not understand you"
else:
response["text"] = random.choice(RESPONSES.get(leven)).format_map({"name": message["from"].get("first_name", "")})
return response
Здесь эмпирическая константа 75 относительно неплохо отражает вероятность того, что пользователь всё-таки хотел сказать. А format_map - удобна для одинакового описания строк как требующих подстановки, так и без нее. Теперь бот будет отвечать на приветствия и иногда даже обращаться по имени.
Для примера расширим словарь RESPONSES:
RESPONSES["What time is it?"] = ["
И будем отлавливать текст
If response["text"] == "
Видно, что теперь структура Message уже не содержит текст, поэтому необходимо модифицировать send_reply:
Def send_reply(response):
if "sticker" in response:
api.post(URL + "sendSticker", data=response)
elif "text" in response:
api.post(URL + "sendMessage", data=response)
И все, теперь бот будет время от времени присылать стикер вместо времени:
Вспоминая , могу сказать, что теперь извращений меньше, а работа прозрачнее.
К счастью, Telegram также умеет работать и по ручному обновлению, поэтому не меняя кода можно создать еще одну службу Puller, которая будет выкачивать их и слать на локальный адрес:
While True: r = requests.get(URL + "?offset=%s" % (last + 1)) if r.status_code == 200: for message in r.json()["result"]: last = int(message["update_id"]) requests.post("http://localhost:8888/", data=json.dumps(message), headers={"Content-type": "application/json", "Accept": "text/plain"}) else: logging.warning("FAIL " + r.text) time.sleep(3)
P.S. По пункту 7 нашел удобное решение - размещение бота не у себя, а на heroku, благо все имена вида *.herokuapp.com защищены их собственным сертификатом.
UPD: Telegram улучшили Бот Апи, из-за чего, теперь не обязательно иметь отдельную функцию для отправки сообщений при установленном вебхуке, а в ответ на POST запрос можно отвечать тем же сформированным JSON с ответным сообщением, где одно из полей устанавливается как ч "method": "sendMessage" (или любой другой метод, используемый ботом).
Теги:
Делаем простого бота для публикации новостей в канал и автоматические ответы на вопросы за 6 шагов.
В закладки
Материал подготовлен при поддержке
После бурных обсуждений в ИТ-прессе по поводу эффективности чат-ботов, они заняли свою нишу в экосистеме пользователей и компаний. Например, часто проекты внедряют ботов для оповещения о каких-либо событиях, а службы поддержки используют их для того, чтобы быстро отвечать на часто задаваемые вопросы клиентов.
В этой инструкции мы рассмотрим наиболее простой способ создать бота собственными руками и объясним, как он работает.
Начнем с разработки бота, который сможет автоматически отправлять в Telegram-канал новости компании, опубликованные на сайте или в Facebook.
Бот в Telegram создается при помощи другого бота под названием BotFather . Отправляем ему команду /newbot, выбираем имя, которое будет отображаться в списке контактов, и адрес. Например, «Бот для DTF» с адресом «dtf_news_bot».
Если адрес не занят, а имя введено правильно, BotFather пришлет в ответ сообщение с токеном - «ключом» для доступа к созданному боту. Его нужно сохранить и никому не показывать.
Через BotFather также можно добавить аватарку для бота, описание и прочее.
Теперь создаём канал с любым названием и адресом, и переходим в его настройки. Всё, что требуется - добавить в список администраторов созданного нами бота - именно он будет публиковать заметки в канал.
Для поиска бота можно использовать его адрес. Например, «dtf_news_bot».
Следующий этап - научить бота отправлять новости с сайта в созданный канал. Для этого воспользуемся популярным сервисом для автоматизации IFTTT .
С его помощью можно создавать инструкции для работы бота. В нашем случае она выглядит так: каждый раз, когда в RSS-ленте сайта появляется новая запись, он должен отправлять сообщение в канал Telegram.
IFTTT расшифровывается как If This Then That
Переходим в раздел IFTTT "My Applets", нажимаем на кнопку "New Applet " и далее на ссылку "This". Находим в списке функций триггер Feed , New feed item и указываем URL-адрес нашей RSS-ленты. Например, у Wordpress-сайтов она обычно расположена по адресу example.com/feed/.
Вместо RSS-ленты можно отслеживать появление новых записей в Twitter или Facebook -аккаунте - для каждой функции в IFTTT предусмотрены отдельные модули.
Теперь переходим ко второму шагу - выбираем действие, которое будет выполняться при обнаружении новой записи в RSS. Нажимаем на "That" и ищем Maker Webhook , "Make a web request" - с помощью этого модуля можно отправлять запросы к любым сервисам. В нашем случае - к боту в Telegram.
В открывшейся форме в поле URL нужно указать ссылку https://api.telegram.org/botТОКЕН /sendMessage, подставив в неё токен, сгенерированный на первом шаге. Метод: POST, тип контента: application/json.
Body - поле для шаблона запроcа, который будет отправляться в Telegram. В нём указываем, в какой канал нужно отправить сообщение и что в нём должно быть написано:
{"chat_id":"@адрес_канала", "text":"{{EntryTitle}} {{FeedUrl}}"}
Если всё настроено верно, бот отправит сообщение из RSS-ленты в канал. У триггера в IFTTT есть задержка, поэтому сообщение, появившееся в RSS-ленте, отправится в Telegram не сразу, а спустя 30-60 минут.
В качестве условия для отправки сообщения можно выбрать любой другой сценарий, доступный на IFTTT. Например, Weather Underground умеет каждый день отправлять сообщение с прогнозом погоды на завтра. Триггер Stocks можно настроить на отправку стоимости акций при закрытии торгов.
Теперь решим более сложную задачу - научим созданного бота отвечать на сообщения пользователей. Например, присылать по команде прайс-лист, контакты или отвечать на часто задаваемые вопросы клиентов.
На этом этапе понадобится веб-хостинг и сертификат SSL, который можно получить бесплатно с помощью сервиса Let"s Encrypt.
Удобнее всего создать отдельный поддомен для бота - например, bot.example.com - и разместить на нём один файл index.php. Внутри файла размещаем код простейшего бота c сайта Telegram.
В код бота нужно внести всего два изменения:
Теперь необходимо связать Telegram и файл на сервере, чтобы запросы, отправленные боту в мессенджере, обрабатывал наш скрипт.
Для этого понадобится консоль. У разных хостинг-провайдеров она может находиться в разных разделах интерфейса управления сайтом. Кроме того, можно воспользоваться программой Terminal на macOS, введя через неё команду ssh имя_пользователя@адрес_домена .
После ввода пароля, печатаем для нашего поддомена простую команду:
php -f /var/www/bot.example.com/index.php
Nice to meet you - ответ бота на отправленное пользователем сообщением.
Ниже в коде добавляем дополнительные ответы. Например, чтобы в зависимости от отправленного слова, бот присылал необходимую информацию пользователю (как в
Репутация человека или компании в сети формируется из отзывов и мнений на форумах, блогах и других ресурсах. Отзывы бывают положительные (это когда вас хвалят), нейтральные (когда вас просто упоминают наряду с другими людьми или компаниями) и отрицательные (когда вас ругают).
Если вы дорожите своей репутацией, очень важно отслеживать в первую очередь плохие отзывы и своевременно реагировать на них. Любой плохой отзыв можно (и нужно) нейтрализовать в процессе диалога с оппонентом. Например, если о вас пишут откровенную ложь – в ответ попросите доказательства. Поскольку оппонент не сможет их предоставить, все поймут, что его слова – пустой звук. Если же пишут “горькую правду” – не бойтесь открыто признать свою вину, напишите, что вы сделали, что б не допускать таких ошибок в будущем. Это покажет вашу адекватость и повысит уважение к вашей компании/блогу в целом и к вашей персоне в частности.
Как только в индекс Google попадает новая страница, где упоминается название моего блога или мое имя, мне тут же приходит уведомление на почту.
Google индексирует страницы довольно интенсивно – большинство уведомлений приходят в течении нескольких часов после появления отзыва. Регулярность рассылки тоже настраивается – можно запросить уведомления раз в день или раз в неделю. Таким же образом можно отслеживать отзывы о своих друзьях или конкурентах, или просто новую информацию по интересующим вас темам.
До чего техника дошла.
Если человек посмотрит на фото, где женщина с книгой в руках рядом с собакой наблюдает за НЛО из окна, то он скорее всего определит возраст и настроение дамы, породу животного, что написано в книге и каким шрифтом.
В 2016 году то же самое может сделать компьютер! И в отличие от человека, еще определит место съемки и укажет на следы «наклейки» летающей тарелки.
И все это можно попробовать сделать онлайн, бесплатно и прямо сейчас!
Идем на 29a.ch/photo-forensics и с помощью кнопки Open File загружаем фотографию.
И начинаем исследовать ее инструментами на правой панели. С помощью лупы пытаемся найти плохо замаскированные следы обработки:
Анализа слоев позволяет обнаружить «заплатки»:
Не поработали ли здесь кистью-клоном:
Подробнее о том, как на фото найти следы монтажа можно узнать в обучающем видео от создателей сервиса:
Идем на Jeffry’s Exif Viewer и загружаем картинку (необработанную, сделанную на цифровую камеру или телефон). Через секунду мы знаем на каком устройство и в котором часу она сделана, а также видим место съемки на карте:
На beface.com можно узнать, что за знаменитость изображена на фотографии. Загружаем файл и ждем чуть меньше минуты:
Нажимаем на кнопку Search Wikipedia . Вскоре появится список лиц, которые похожи на загруженное:
Чтобы узнать имя человека на фотографии, необходимо навести на него мышкой. Мой опыт показал, что сервис весьма точно определяет известных людей.
В специальном разделе myfonts.com можно загрузить картинку с надписью и определить шрифт, которым она сделана. На странице с результатом отображается пять надписей-образцов максимальных похожих шрифтов (с тем же текстом, что и загруженная):
Newocr.com для тех, кто хочет качественно распознавать текст, но не хочет платить за FineReader. Загружаем скан, ждем некоторое время и радуемся результату:
Готовый текст можно скачать, скопировать в буфер обмена или перевести с помощью Google Translate.
У сервиса много аналогов, но исходя из моего опыта, newocr.com лучше всех справляется с распознаванием русского языка.
Для поиска похожих фотографий можно использовать Google . Но он пока не достаточно совершенен в решении этой задачи:
Хотя весьма неплох!
Clarifai.com умеет определять, что изображено на фотографии. Легко узнает, что на этой картинке взрослый мужчина в очках и с бородой:
Определяет породу собаки:
А вот шелковицу отличать от других плодов пока не научился:
Развлекательный сервис от Microsoft умеет определять разные ли люди на фотографиях или один и тот же человек.
Несмотря на годы и очки узнает Стива Джобса:
И отличает его от Тима Кука:
А вот совместный проект Microsoft и Оксфордского университета для анализа эмоций человека на фото.
Сервис запросто определил, что с почти 100% вероятностью женщина испытывает страх («fear»):
И знает, как выглядит счастливый человек («happiness»):
О последнем пункте нашего списка писали все кому не лень. Но вдруг кто-то не знает;-) На
Здравствуйте, дорогие читатели блога, и просто случайные посетители. Если ты забрёл сюда случайно, то скорее подпишись на блог, ведь впереди тебя ожидает море полезной информации и просто подарков!
Ну а теперь серьёзно. Вам интересно, что и где о вас пишут? Тогда Гугл нам в помощь! Хочу сегодня рассказать вам о чрезвычайно нужном и полезном сервисе Google Оповещения . Вы ещё с ним не знакомы? Тогда эта статья для вас!
Гугл не перестаёт нас радовать новыми возможностями и помощью в нашей нелёгкой работе. Так в чём же заключаются возможности, и какую помощь мы получим от Гугла, воспользовавшись этим сервисом?
У вас будет возможность отслеживать все интернет ресурсы, на которых упоминали ваш сайт или ваше имя. То есть вы живёте себе, в ус не дуя, а где то склоняют ваше имя, упоминают сайт, а вы ни сном ни духом. Это нельзя пустить на самотёк, и оставить без внимания. Если хотите узнаваемость в интернете, то нужно быть в курсе, в каком контексте упоминается ваше имя.
Пользоваться сервисом просто до неприличия. Создать оповещения (адрес сайта, Имя и Фамилия взятые в кавычки, и так далее), то есть записать те слова, по которым вы хотите увидеть результат. Затем нажимаете на созданное оповещение (название сайта, или ваше имя), и открывается список тех интернет ресурсов, где вас, или ваш сайт когда либо упоминали. Для того, что бы попасть на страницу с упоминанием о вас, достаточно кликнуть по заголовку оповещения.
Попадаются правда некоторые отчёты с вашего сайта, их можно просто игнорировать. У меня нашлось парочка полных однофамилиц, о которых тоже достаточно часто упоминается в интернете, но, кое что я нашла о себе. Всё конечно я не выложу здесь, слишком много снимков делать придётся.
То есть, несколько раз мой блог, а также имя и фамилию упомянули на разных сайтах, и в некоторых комментариях. Мне интересно было прочитать, что обо мне пишут, а вам - интересно?
Тогда воспользуйтесь помощью сервиса. И откройте для себя возможности данного сервиса. Писать больше не буду, идите, тестируйте всё сами, я думаю вы без труда во всём разберётесь.
PS. Я решила принять участие в конкурсе, и публикую баннер этого конкурса. Женщины, переходите по ссылке, и принимайте участие, пока не поздно! Этот конкурс для вас! Призы просто великолепные!
Внимание - Конкурс!
Я участвую в конкурсе «Рецепты хорошего настроения»!
Организатор проекта –