Оффтоп Daria Khokhlova
4 309

Письмо в редакцию: История создания «Главбургера» — бота для Telegram, который ищет бургерные поблизости

В редакцию ЦП пришло письмо от Дмитрия Сонько, руководителя команды разработки в компании Luuk, в котором он рассказал о процессе создания собственного бота для мессенджера Telegram под названием «Главбургер». Бот умеет находить бургерные неподалёку и ранжировать их по удалённости.

Привет читателям ЦП. На фоне всё большей популярности ботов для Telegram, я хочу рассказать про своё творение. «Главбургер» — telegram.me/GlavburgerBot — бот, который показывает, где неподалёку можно отведать бургеров.

Не так давно у меня была идея сделать агрегатор заведений, который знает всё про рестораны, где готовят бургеры. Бургеры я люблю, особенно хорошие. Потом анонсировали платформу для создания ботов, и я понял — вот оно, пора действовать. Изучив документацию по API ботов, я создал бота, задал ему имя, описание — и понеслось.

Использовать механизм веб-хуков или запрашивать обновления вручную

Раз бот должен взаимодействовать с пользователем интерактивно и быстро отвечать на его запросы, то ответ очевиден — веб-хук. Как уже было сказано, для функционирования хуков на сервере, где будет установлен обработчик, должен быть SSL-сертификат. На помощь пришел StartSSL и статьи с «Хабрахабра» о его получении, чего вполне достаточно для работы.

Где брать данные для выдачи

На помощь пришла компания «Яндекс» в лице менеджера проектов Ксении Аникеевой и их замечательный API«Карт». Бот ищет заведения в базе, и если результатов недостаточно, обращается за помощью к «Яндексу» и дополняет результаты выдачи.

Результаты выдачи

Получить одно заведение — хорошо, а получить несколько с возрастанием по удалённости — куда лучше.

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

Кроме того, бот определяет расстояние до заведения и, учитывая среднюю скорость пешего человека, рассчитывает время ходьбы до него. Используя другой API «Яндекса» для генерации статических карт, мы создаём изображения с двумя точками — точкой местоположения пользователя и местоположением заведения. Через собственный «сокращатель» ссылок генерируем ссылку на «Яндекс.Карты» с уже выбранным заведением для получения большей информации о ресторане.

Соответственно, пока в результате поиска есть заведения, человек может отправить команду /more и получать следующие позиции.

Немного технических подробностей

Я давно хотел попробовать платформу Jelastic Сloud. Бот размещен на ней, удобно сделаны правила для вертикального и горизонтального масштабирования системы.

В качестве базы данных используется PostrgeSQL с расширением PostGIS для удобной работы с геоданными.

Результаты выборки хранятся в Redis, чтобы постоянно не дёргать базу данных запросами. Сам хранящийся результат реализован в виде очереди: делаем запрос на следующее заведение — указатель сдвигается на следующее заведение, пока есть, что отображать. Как только отобразили все заведения, кэш очищается.

MongoDB используется для хранения «сырых» данных, получаемых от «Яндекса» и Telegram, результатов отправки сообщений. Помогает быстро строить необходимую аналитику и, в случае необходимости, перестраивать формат базы данных без необходимости делать новые запросы.

В результате работы был написан небольшой враппер (wrapper, программа, которая из себя вызывает одну или несколько других программ — прим. ред.) для фреймворка Yii2, позволяющий быстро подключить функциональность отправки сообщений.

Эпилог

Разработка бота от первого коммита в репозитории до его представления публике заняла почти месяц вечеров. Сначала обработка хуков, потом изучение матчасти по геокодированию, вычислению длин градусов долготы и широты, переводу их в километры на плоскости и обратно. Парсинг результатов «Яндекса», формирование выдачи, её сортировка, опять геокодирование.

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

На ум приходит пачка потенциальных решений, от вызова такси и заказа еды на дом до реализации неких систем технической поддержки а-ля Jivosite (на «Хабрахабре» уже есть статья про это). Наблюдать за её развитием я буду точно, друзья и знакомые уже постоянно предлагают идеи новых ботов. Буду рад любому фидбэку по боту, советы, замечания, предложения. Рассмотрено будет всё.

Отдельное спасибо редакции ЦП. Прошлая моя публикация на «Бирже труда» помогла мне найти интересную работу в крутой компании.

#боты #Telegram #боты_telegram #боты_телеграм #боты_для_телеграм #поиск_бургеров #главбургер

Статьи по теме
Письмо в редакцию: Как я за один день сделал игрового бота для Telegram
20 примечательных «умных» ботов для Telegram: игры, работа, общение
18 бизнес-ботов для Telegram: финансы, путешествия, языки
{ "author_name": "Daria Khokhlova", "author_type": "editor", "tags": ["\u043f\u043e\u0438\u0441\u043a_\u0431\u0443\u0440\u0433\u0435\u0440\u043e\u0432","\u0433\u043b\u0430\u0432\u0431\u0443\u0440\u0433\u0435\u0440","\u0431\u043e\u0442\u044b_\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c","\u0431\u043e\u0442\u044b_\u0434\u043b\u044f_\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c","\u0431\u043e\u0442\u044b_telegram","\u0431\u043e\u0442\u044b","telegram"], "comments": 48, "likes": 13, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 9823, "is_wide": true }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15388' + '59599') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 9823, "author_id": 5723, "diff_limit": 1000, "urls": {"diff":"\/comments\/9823\/get","add":"\/comments\/9823\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/9823"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

48 комментариев 48 комм.

Популярные

По порядку

Написать комментарий...
9

статьи про "создание бота на телеграме" похожи как одна - пересказ статьи на хабре, разбавленный своими целями создания бота. Порог входа настолько низкий, что создать бота может каждый.
А вот придумать действительно интересного бота трудно. Больше половины ботов уровня "еще одна сущность вместо поисковой выдачи/еще один способ получения новостей". "Потому что могу".
Если что, данный бот кинул мне ссылку на ближайший Макдональдс. Фейспалм. Ждем следующих статей, в которых слово "гамбургерная" заменено на "бар", "блинная", "скамейка", "театр/кинотеатр", "парк", "фонтан", "супермаркет".

Ответить
1

Именно потому, что "порог входа настолько низкий", люди создают ботов. Правда странно? Особенно странно, что пытаются популяризировать использование платформы опять-же из-за того, что порог входа настолько низкий. Больше ботов = больше разработчиков = интереснее решения = больше клиентов.

Ответить
9

да не странно что создают. Странно, что об этом пишутся статьи. "Письмо в редакцию: Как я создал свою первую страницу на html". Просто надо адекватно смотреть на вещи. Перефразирую фразу Армстронга: то, что является большим шагом для человека, является маленьким шажком для человечества.
Без шуток: бот из статьи пишется за два(!) часа. А если постараться/поспорить на деньги, то можно и за полчаса все сделать. То есть в создании бота нет ни технической ценности, ни практической.

Ответить
–6

Я рад за вас и Армстронга, что еще сказать. Но именно благодарю таким маленьким шагам и их примерам и идет развитие в целом. Фразы типа "это каждый школьник может сделать за полчаса" тут не совсем уместно, ибо кто-то делает, а кто-то только говорит. Удачи!

Ответить
8

а, это вы автор :-) ок. Оставляю за вами право отстаивать свое детище. Только ведите диалог в корректном, конструктивном ключе, ибо фразы типа "кто-то делает, а кто-то только говорит. Удачи!" - это фразы обиды, поскольку в них видится намек на "сделай сам", "чего добился ты" и "давай до свидания".

Ответить
–4

Я приму к сведению ваше замечание.

Ответить
3

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

Ответить

Комментарий удален

6

Все круто, но зачем это здесь?

Ответить
0

Бот - это прекрасно. Но можно же установить Фламп и найти бургерные хоть поблизости, хоть по рейтингу, хоть в районе Чертаново. Смузи, к сожалению, не ищет.

Ответить
3

На самом деле идея ботов прекрасна тем, что ленивому пользователю не нужно ничего устанавливать и не покидать приложения с друзьями и коллегами. Можно сократить количество нажатий пальцем до получения нужной информации. А у некоторых ботов можно спросить информацию относительно человеческим языком, как если бы это был ещё один контакт в листе (который знает ответы на все вопросы в рамках компетенции) — например, бот ImageSearch у Яндекса (Павел Дуров приводил пример его работы в твиттере: запросы Pavel Durov и Happy Pavel Durov). Мне недавно нужно было показать другу, как выглядит нужный мне переходник, я просто перешёл в другой чат, попросил у бота Яндекса картинку и тут же переслал её другу. В другом сценарии я бы открыл браузер, ввеёл там запрос, дождался выдачи, сохранил картинку, открыл Telegram и прикрепил бы её к чату. Тут всё вышло быстрее. Возможности создавать ботов всего полтора месяца, а она уже позволяет такие эксперименты, что я чую, через год это может стать новым революционным путём получения информации.

Ответить
1

Революционное получение контента? Mem:пффф, я вас умоляю. :)

В мою молодость (сейчас мне 25) уже существовали боты для мессенджеров: боты для ICQ, боты для mIRC и другие . Всё это попса, которая просто вернулась в моду вместе с Telegram. Ничего более.

Ответить
1

Кирилл, я бы не торопился с «пфф». Я тоже застал этих ботов (и погоду, и курсы валют). Никто и не говорит, что идея новая. Просто тогда, когда эта идея появилась, особых инструментов для её использования не было: ICQ Light, mIRC и мультипротокольная Miranda? Давайте посмотрим немного шире. Сейчас боты дают нам совсем другие возможности:
Во-первых, они работают в мобильной парадигме. То есть, могут доставлять контент прямо нам в карман, прямо в руку (а также в часы и в очки).
Во-вторых, сегодня боты работают с медиа-контентом и геолокацией. Ещё пара-тройка месяцев и они смогут работать с голосом и камерой. С развитием носимых устройств боты смогут работать и с другими параметрами, получаемыми датчиками.
В-третьих, возможности обработки запросов на стороне сервера сейчас намного богаче: всё идёт к тому, что запросы можно будет отправлять не в специально подготовленных для бота командах, а на живом человеческом языке (возможно, с обучением индивидуальным языковым привычкам).

С точки зрения новостной ленты в пределах недели, статья про «Главбургер» или ImageBot Яндекса не так впечатляет. Но с точки зрения общего развития платформы ботов, я считаю, это важные шаги.

Ответить
1

Где-то в сообщениях Telegram:

— Ты хоть меня помнишь? Сару Коннор? Взрыв Кибердайна? "Хаста ла виста, бэйби"? Ни о чём не говорит?

— Это был другой Т-101.

Coming soon... :-)

Но с большего я с вами согласен.

Ответить
0

Если будет спрос у пользователей - можно доработать. И рейтинг по флампу/афише/етк и поиск смузи в Чертаново.

Ответить
1

А где исходнички то можно посмотреть?

Ответить
0

Интересно)

Ответить
0

Решение с Хабра - отвратительное. История валится в одну кучу, менеджеру приходится в пределах одного окна вести диалог с несколькими клиентами - уверен, что ситуации "Извините, это не вам" будут не редки.
Телеграм API для ботов - это отличный молоток, но не надо всем видеть гвозди.

Ответить
1

Зачем менеджеру сидеть через телеграм?) менеджер имеет веб-интерфейс где у него отдельные диалоги. А вот у клиента уже один чат.

Ответить
0

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

Ответить
0

В чем проблема сделать виджет? Клиент пишет в чат на сайте, бэкенд смотрит какой из ботов сейчас свободен. Если свободных ботов нет, создает нового. Отправляет от имени главного бота сообщение менеджеру мол "Николай. Вам новое сообщение от клиента с сайта. Установите контакт с ботом @support452bot для начала диалога" Николай пишет боту старт, ему приходят сообщения с сайта. В ответ он пишет боту, хук это ловит и отправляет сообщения на сайт. Вся проблема была именно в том, что в рамках одного диалога менеджеру придется вести энное количество клиентов, что не совсем удобно.

Ответить
0

Про виджет было к другому комментарию - про то, что менеджеры сидят через веб-интерфейс, а операторы - через оф. клиенты.
Если свободных ботов нет, создает нового.

Ну вот вы правда считатее, что это нормальная практика - писать бота для создания ботов ? Есть уверенность, что телеграм не будет банить за такое поведение ?

Ответить
0

Я считаю что раз телеграм дал такую платформу, то можно пользоваться. Спорные нюансы вполне можно уточнить через их ТП.

Ответить
0

У нас была идея реализации подобного в одном из наших сервисов, но столкнулись с той-же кучей сообщений. Задал вопрос поддержке телеграма, можно ли реализовать авто создание ботов, под каждого нового написавшего свой бот. Тогда это избавило бы от многих проблем, но поддержка ответила решительным нет. Создание ботов только руками и создание через другого бота (бот пишет botfather) тоже невозможно. Для небольшой компании можно конечно руками сгенерировать себе ботов и использовать их. Когда все заняты показывать на сайте сообщение вида "все операторы заняты". Для небольшого проекта 10-20 ботов думаю будет вполне достаточно.

Ответить
0

можно юзать telegram-cli для того, что не может бот.

Ответить
0

В любом случае, нужно самому регистрировать телеграм аккаунты. Основная проблема в этом. Дабы не было мусора в чате, должна быть схема 1 пользователь сайта - 1 бот (или телеграм аккаунт) - менеджер. Чтобы в одном чате у менеджера был один пользователь, а не десять.

Ответить
0

я уже не помню - регистрация бота требует человеческого вмешательства, которого не сможет выполнить автомат? telegram-cli же это полноценный клиент, а, значит, сам сможет пообщаться с BotFather.

Ответить
0

Хмм, кстати довольно интересный вариант. Обязательно попробуем!

Ответить
0

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

Ответить

Комментарий удален

1

как называется ваш бот?

Ответить
0

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

Ответить
0

Отличный бот. Удобно, что распознаёт «еще» и «ещё», но я бы сделал кнопку с такой функцией, чтобы не набирать каждый раз это слово. Либо выдавать другой вариант при получении эмодзи с бургером 🍔 (а при получении мороженого или суши адаптировать выдачу)

Ответить
0

С кнопкой быстрого ответа я промахнулся да, сделаю! Промахнулся еще с одним. Botan.io на днях открыли доступ к платформе, принял участие в написании пхп сдк https://github.com/botanio/sdk к нему и забыл у себя его вставить 😞Сегодня плюс 160 новых пользователей у бота, а я их не трекаю😢

Ответить
0

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

Ответить
0

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

Ответить
0

как определяется геолокация пользователей?

Ответить
0

Что за ад "отправьте свою геолокацию"? Что я должен отправить, в каком виде и откуда я должен это узнать?

Ответить
0

Поясняю: это имеенно то, что мне ответил этот бот при попытке им воспользоваться :-(

Ответить
0

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

Ответить
0

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

Ответить
0

Достаточно будет написать в сообщении бота ровно то, что было написано в предыдущем комменте, и проблемы не будет :-) но кто вам сказал, что в Upside Down Cake есть бургеры?! :-)

Ответить
0

Так говорит Яндекс. На текущий момент база его.
Насчет предыдущего сообщения не совсем понял, что именно достаточно написать?

Ответить
0

"свое местонахождение (а не "геолокацию"!) можно отправить из того же меню, из которого вы прикрепляете картинки"

Ответить
0

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

Ответить
0

Готово. Насчет версий с десктопа, буду добавлять распознавание адреса и перевод его в координаты

Ответить
0

dadata.ru может вам в этом помочь

Ответить
0

В курсе про этом сервис, но мне больше нравится геокодер от яндекса

Ответить

Комментарий удален

0

"Бот хеджирующий бургерные по геолокации"- программный код ищущий в другом программном коде координаты заведений где продают бутерброды.

Ответить
0

Я думаю тут более правильная формулировка "проксирующий", хеджирование все таки несколько иное понятие

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Хакеры смогли обойти двухфакторную
авторизацию с помощью уговоров
Подписаться на push-уведомления