Telegram боти: на допомогу редактору

— Синонім до слова «норовливий»? — пролунав голос дружини з сусідньої кімнати.

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

— Дик подивися у цього… як його…
— Так-так, я теж забула. Ну так що, скажеш мені синонім?

Але на жаль, я не ходяча енциклопедія, і навіть не її сидячий варіант, тому я не знайшов нічого краще, ніж відправити дружину гуглити словник.



— Так це довго! Я думала, ти швидше згадаєш…

Кіт, буридановым ослом метався між мною і дружиною, в кінці кінців вибрав мене в якості більшого добра (цікаво — за вагою або за якимось іншим параметрам?) і мені не залишалося нічого робити, як піти на кухню погодувати нещасну тваринку. Попутно міркуючи про те, як довести до дружини той факт, що “закладки" у браузері призначені не для суцільного збереження всіх її френдів з Вкантактика, а для запам'ятовування дійсно потрібних посилань. Всі попередні спроби навчити її користуватися закладками закінчувалися збереженням якщо не френдів, то викладену френдами музику; але ті посилання, які зберіг для неї я, були остаточно поховані під цими завалами.

Але якщо вона навчилася користуватися Вкантактиком і Телеграмом, значить… значить вона вже вміє користуватися Телеграмом і Вкантактиком! Еврика!

Хтось казав, що боти для Telegram це просто? А ось зараз візьмемо і спробуємо…

Як реєструвати власну частину нового бота, ви швидше за все вже знаєте. Якщо немає — просто додайте @BotFather Telegram і почати з ним розмову.

@BotFather — офіційний інтерфейс управління ботами. Крім нього за запитами про створення ботів прогугливаются Manybot, YourBot, і ще кілька. Судячи з опису, це якісь прокладки, т. к. при роботі з ними все одно доведеться звертатися до @BotFather. Я не розбирався з ними і буду вдячний за роз'яснення користі від них.
Перша проблема, з якою довелося зіткнутися при створенні синонім-бота — пошук словника синонімів.

Більшість нагугленных словників рясніють грізними написами і підписами з перерахуванням жахливих кар, які неодмінно зваляться на голову нещасного, який насмілився використовувати «не за призначенням» творіння авторів. У яких, судячи з кількості смачно розписаних загроз, є копірайт на російську мову" цілком, повністю і без будь-яких винятків. Причому «призначення» на таких ресурсах часом не визначено ніде і ніяк, а обсяги їх словників як правило складають жалюгідні 5000...40 000 слів.

Частина словників являють собою алфавітні списки: перша сторінка зі словами на букву «а», друга на «б» і так далі. Тут не те що парсинг, навіть завантаження адовой онучі перетворюється в окрему проблему.

І, зрозуміло, ні про яке API немає навіть і мови.
Врешті-решт мені вдалося знайти на адекватний словник об'ємом, як сказано в описі «591 тис. слів і фразеологізмів та 2166 тис. синонімічних зв'язків», який до того ж вільно поширюється. Єдиним його недоліком виявилося повне відсутність API, що компенсувалося можливістю легально завантажити сам словник (правда в жахливому форматі) та стабільно працюючої онлайн-версією.

Мені здалося, що в цьому конкретному словника занадто багато застарілих, що вийшли з обігу слів і навпаки занадто мало сучасних. Але дружина зазначила, що про новомодних «селфи», «кавер» і «транспарентність» через п'ять років всі забудуть, зате «неодмінно», «трішки» і «капітулювати» будуть жити в мові вічно, незважаючи на витівки лінгвістів від влади.

вкотре переконуюся, що у хорошого продукту як правило жахлива упаковка, а за красивими «ле-ендингами» з великими кнопками і повітряними полями ховається звичайне фуфло.
На цьому місці вже ситий кіт відірвався від вилизування своїх теплих аналогових ідентифікаторів і ствердно мявкнул як би підтверджуючи, що він не збирається змінювати коханому «мяу», незважаючи на те, що хтось може заявити, що це «некруто» або «відстій».

Друга проблема — швидше за все підходящі вам імена ботів будуть зайняті. Я перепробував цілу купу милозвучних коротких імен і всі вони виявилися зайнятими і — тадааам — очікувано мертвими. В результаті довелося регистировать довга і важка для запам'ятовування ім'я @synonim_bot: з якоїсь причини сквотери до нього не добралися і воно виявилося вільним.


Якщо коротко, вся схема працює так:

0. Ви встановлюєте вебхук — повідомляєте API Telegram адреса скрипта на своєму сервері (HTTPS!), до якого він буде звертатися, коли юзер що-небудь напише вашу роботу.


І далі реалізуєте свою логіку. На схемі — урізаний варіант логіки бота Синонім.



Я навмисно не наводжу ні строчки коду, щоб виключити холивары і взаимополивание. Пишіть на те, що знаєте — боту все одно.
Тепер текстом:

1. Юзер пише вашому боту що-небудь команду або слово.

2. API Telegram смикає ваш скрипт (він вже знає його урл з п. 0) і передає йому приблизно таке:

{
"update_id":12345678,
"message": 
{
"message_id":1234,
"з": 
{
"id":0123456789,
"first_name":"Vasya",
"username":"vapupkin"
},
"chat":
{
"id":1234567890,
"first_name":"Vasya",
"username":"vapupkin",
"type":"private"
},
"date": 1451606400,
"text":"preved"
}
} 

3. Далі ваш скрипт повинен розібратися що йому прислали і видати відповідь:

https://api.telegram.org/bot123456789:boLshoiogRomnIycOLlaideR/sendMessage?chat_id=1234567890&text=Taki%20Preved


Напевно правильніше буде переписати в POST щоб мати запас за розміром відправляється тексту, але в моєму випадку цілком вистачає і цього: все-таки месенджери не призначені для лонгридов.
4. API Telegram надішле у відповідь щось подібне:

{
"ok":true,
"result":
{
"message_id":1234,
"з":
{
"id":9876543210,
"first_name":"Бот",
"username":"my_bot"
},
"chat":
{
"id": 0123456789,
"first_name":"Vasya",
"username":"vapupkin",
"type":"private"
},
"date": 1451606500,
"text":"Taki Preved"
}
}

Я так зрозумів, що з цією відповіддю я можу діяти як заманеться (якщо неправильно — поправте). Теоретично на його основі можна збирати статистику, але я збираю її на більш ранньому етапі: мені так зручніше.

Пара слів про відмінності присилаються юзером команд, соррі за каламбур, слів.
Ви можете заготовити стандартні відповіді бота на стандартні запитання юзера, оформивши це господарство у вигляді команд @BotFather — вони будуть видні юзеру якщо той почне рядок з слеша. В скрипті бота буде достатньо відловити ці команди (API Telegram їх так і передає, зі слешем спереду), видати відповідь і тут же припинити подальше виконання скрипта.



Процедура спілкування бота зі словником не представляє художньої цінності і я з вашого дозволу її опущу. Єдине, що треба було зробити — відловити відсутність результату, коли словник не знаходив синоніма на введене слово.


… а також випадок, коли юзер вводить цілу фразу — адже словник цього не вміє:


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


Да уж… Сучасні технології деколи дозволяють нам творити чудеса, але начисто позбавляють нас знань про фундаментальні речі. Практично половина запитуваних слів містили помилки і з цим потрібно було щось робити.

З боязкою надією я одразу ж кинувся до улюбленої Dadata, але обламався: вона прекрасно виконує свої завдання і не зазіхає на весь мовний корпус. Гугление, як не дивно, не принесло ніякого адекватного результату і я по-швидкому прикрутив Яндекс.Спеллер як тимчасовий варіант. Теоретично, поки він не став платним і не вимагав нотаріально завіреної копії паспорта, їм теж можна користуватися.

Буду вдячний за підказку: потрібно безкоштовний сервіс перевірки правопису в російській мові з API.
Тут виявилася четверта проблема: якщо слово набране без помилок, Яндекс.Спеллер не видає нічогісінько. Просто мовчить як партизан, що трохи ускладнює ведення статистики.

Було б непогано якось позначити виправлення користувальницького введення, не кричачи про це у всю іванівську. З-за мізерного html-інструментарію бота я обрав ось такий варіант оповіщення (можливо, в майбутньому подкорректирую):


Посадив дружину тестувати, попросив роздати по мережі колегам. Якщо бот виявиться комусь потрібним, буду його розвивати.

P. S.: При написанні бота кіт Юнікс (реальний персонаж) не голодував.

Пруф



» API Telegram
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.