Стоп-спам для «Телеграма». Как написать и задеплоить бота на TypeScript за полчаса

0
17

Содержание статьи

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

Меня зовут Никита, и я программист: зарабатываю программированием на хлеб насущный и в свободное время пишу разного рода инструменты, которые упрощают жизнь пользователям интернета. Некоторые ты, возможно, используешь. Один из моих самых популярных продуктов — это @voicybot, бесплатный бот для «Телеграма», который просто переводит аудиосообщения в текст. На момент написания статьи им пользуется более полумиллиона чатов, а одних только голосовых сообщений через него проходит более 40 тысяч в сутки.

На самом деле создать чат-бота для Telegram с имеющимися инструментами стало максимально просто, что я и собираюсь продемонстрировать в этой статье. Буквально за полчаса мы с тобой напишем достаточно сложного антиспам-бота на Node.js с использованием TypeScript 3 и хранением записей в MongoDB, а после закинем его на Digital Ocean и настроим быстрый и бесплатный CI на основе простых веб-хуков GitHub. Конечно, можно было бы развернуть все и на «Докере», но, думаю, новичкам в программировании сложнее разбираться с этой магией. Сегодня только олдскул!

Настройка окружения

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

В качестве IDE (или текстового редактора, смотря какого лагеря этого холивара придерживаться) я воспользуюсь VSCode. Хранить код буду на GitHub. Скачай и установи себе VSCode, а затем зарегистрируйся на GitHub.

Первым делом стоит установить то, на чем мы будем писать проект, — Node.js. Можно стянуть инсталлятор c официального сайта, но я крайне рекомендую использовать NVM — менеджер версий для Node.js, который позволяет не только установить разные версии, но и переключаться между ними. Установить его можно из официального репозитория следующей командой:

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

Советую использовать наиболее актуальную команду из репозитория Readme. Не забудь перезапустить терминал после установки NVM. После стоит установить сам Node.js. У меня одиннадцатая версия, но все последующие, в принципе, должны работать примерно так же. Установим последнюю версию «Ноды»:

$ nvm install node

Если после выполнения $ which node терминал выдает папку, то все прошло успешно. Вместе с Node.js ставится и менеджер пакетов NPM, который мы заменим на более быстрый yarn. Пропиши следующую команду, чтобы установить его:

$ npm install -g yarn

Без опций npm и yarn добавляют и устанавливают пакеты в открытую папку проекта. Однако если к npm добавить флаг -g, то пакет установится прямо в систему (на самом деле в пользователя — но углубляться не будем) и будет доступен как отдельное приложение. Таким образом, мы установили yarn отдельным приложением и уже будем использовать его. Время заставить yarn установить TypeScript 3 глобально! Делается это не флагом, а отдельным аргументом при вызове:

$ yarn global add typescript

Одна команда — и у тебя в системе теперь есть TypeScript. Вся мощь Unix на кончиках пальцев!

Последний кусочек пазла — это база данных MongoDB, которую мы и будем использовать для этого проекта. MongoDB — база данных типа NoSQL, что означает отсутствие очевидных связей между таблицами при помощи связных таблиц (или join tables), но зато дает упрощенную структуру данных в читабельном виде и простейшие миграции. Человеческим языком: эффективных связей между объектами быть не может, но разрабатывать проще.

Проще всего установить MongoDB с официального сайта. Разработчики будут всячески пытаться продать тебе собственное хранилище базы данных (БД) в облаке — не ведись на провокации. Все хранилища БД в облаках дешевые только до первых 10 тысяч пользователей, дальше тебя начнут разорять. Мы поднимем собственное облако для БД с блек-джеком и прочими атрибутами. Также есть и официальный туториал по установке MongoDB на «Мак» через терминал — именно это я и советую сделать. Заодно и homebrew себе поставь, лишним точно не будет.

На этот момент у тебя должны быть установлены:

  • Node.js;
  • Yarn;
  • TypeScript;
  • MongoDB.

Если все установлено и работает, смело продолжай читать туториал. Если что-то не получилось, дальше будет слишком тяжко, лучше поправить сейчас.

Тест-драйв

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

Создай в любом месте у себя на компьютере (у меня есть удобная папочка ~/code, где я держу все проекты) папку shieldy_bot и зайди в нее в терминале. В папке проекта пропиши

$ yarn init

Эта команда задаст тебе ряд вопросов и создаст проект вместе с файлом package.json — это тот самый мастер-файл, на который будет смотреть Node.js при запуске проекта. Обязательно укажи dist/index.js в качестве entry point (точки входа) — чуть позже я расскажу зачем.

Таким образом я настроил свой проектТаким образом я настроил свой проект

Создай файл index.js в папке dist в папке проекта. Внутри пропиши лишь одну строку: console.log('Hello world!'). В файл package.json добавь скрипт start вида node dist/index.js.

Примерно так должен выглядеть проектПримерно так должен выглядеть проект

INFO

Здесь и далее: команды Unix должны выполняться в папке проекта, если не сказано иначе.

Вперед: запусти команду $ yarn start, и ты должен увидеть Hello world! в своей консоли. Если так и произошло — успех, Node.js работает! Теперь проверим TypeScript. Но сначала установим его прямо в проект.

$ yarn add typescript

После добавления TypeScript прямо в проект будет использоваться именно он, а не тот, что установлен в системе. TypeScript не запускается напрямую «Нодой», он сначала компилируется в JavaScript, а потом компилированный код и запускается при помощи Node.js. В нашем проекте мы будем хранить и писать наш код TypeScript в папке src, а компилироваться и запускаться JavaScript будет в папке dist. Чтобы tsc (тулза — компилятор из TypeScript в JavaScript) работала правильно, ее нужно настроить. Добавь в корень проекта файл tsconfig.json со следующим содержанием:

{ "compilerOptions": { "module": "commonjs", "target": "es2017", "lib": ["es2015"], "moduleResolution": "node", "sourceMap": true, "outDir": "dist", "baseUrl": ".", "paths": { "*": ["node_modules/*", "src/types/*"] } }, "include": ["src/**/*"]
}

Вдаваться в подробности, что это за файл и как он работает, я не буду: это задача вне текущего руководства. Стоит лишь отметить, что мы берем TypeScript-файлы из src, конвертируем в стандарт es2017 и кладем в папочку dist.

После удаляем папку dist — она теперь должна генерироваться сама. Добавляем папку src и кладем туда уже index.ts с содержанием console.log('Жизнь за Харамби') (ts — это расширение файлов TypeScript). В принципе, любой рабочий JavaScript (JS) — это еще и рабочий TypeScript (TS), так как TS — это надстройка над JS.

Также стоит отметить, что TS — это типизированный язык, в отличие от JS. Но так как множество пакетов было изначально написано на JS, сообщество начало дополнять уже существующие проекты информацией о типах в репозитории Definitely Typed, откуда все разработчики заимствуют типы. Так и мы сделаем для «Ноды» — выполним команду $ yarn add @types/node. Если все было правильно, твой проект должен походить на следующий скрин.

Добавили шаг компиляции TSДобавили шаг компиляции TS

Теперь перед каждым запуском $ yarn start тебе нужно запускать команду $ tsc, чтобы компилировать код TS в JS. К слову, можно еще и использовать $ tsc -w. Флаг -w заставит tsc перекомпилировать файлы, которые изменяются, при их сохранении. Удобно! Но еще удобнее будет поменять команду start из package.json на tsc && node dist/index.js — тогда каждый раз при запуске $ yarn start будет запускаться и tsc.

Запусти $ yarn start, предварительно добавив или запустив $ tsc вручную. Ты должен увидеть выплюнутую консолью строку «Жизнь за Харамби».

Если все получилось, то поздравляю: ты настроил окружение для разработки и теперь знаешь, что TypeScript работает. Теперь настроим контроль версий!

Продолжение доступно только подписчикам

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

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here