Русский
Русский
English
Статистика
Реклама

Боты для мессенджеров

Из песочницы Urban Bot или как писать чат-ботов для Telegram, Slack, Facebook на React.js

27.07.2020 22:10:16 | Автор: admin

image


В этой статье я хочу познакомить с новой библиотекой Urban Bot, которая адаптирует React для написания чат-ботов. Ниже я расскажу, зачем эта библиотека появилась на свет, какие дает преимущества и как написать вашего первого чат-бота.


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

В отличии от большинства чат-бот библиотек, которые чаще всего просто оборачивают http запросы в функции с готовыми аргументами и предоставляют подписки вида bot.on('message', callback), иногда позволяя передавать контекст между вызовами, Urban Bot предлагает совершенно иной подход к разработке чат-ботов через декларативное программирование и компонентный подход. Живой пример, написанный на Urban Bot, вы можете попробовать в Telegram, cсылка на чат-бот, и посмотреть код на GitHub.


Как мы заметили выше, чат-боты это полноценные UI приложения. А какой язык в 2020 и какая библиотека наиболее подходит для разработки UI приложений? Правильно, JavaScript и React. Такая интеграция позволяет легко и непринужденно строить чат-боты любой сложности без единого знания об API мессенджеров. Далее я расскажу, как создавать простые компоненты и на их основе строить сложных чат-ботов, работать с навигацией, создавать диалоги любой вложенности, писать одно приложение и запускать в любых мессенджерах, и многое другое.


Отправка сообщений


Так выглядит самый простой пример на Urban Bot. Для отправки текстового сообщения нам нужно создать функцию и вернуть из него готовый компонент Text с текстом внутри, который мы хотим отправить. Когда компонент отрендериться, все пользователи чат-бота получат сообщение "Hello, world!".


import React from 'react';import { Text } from '@urban-bot/core';function App() {    return (        <Text>           Hello, world!        </Text>    );}

Изображение можно отправить так:


import React from 'react';import { Image } from '@urban-bot/core';function App() {    const imageByURL =  'https://some-link.com/image.jpg';    return <Image file={imageByURL} />;}

Urban Bot имеет готовый набор компонентов, для каждого вида сообщений, для файлов File, для кнопок ButtonGroup и много других, подробнее можно взглянуть здесь. В каждый из них можно передать определенный набор пропсов, например, имитировать будто бот печатает сообщение 1 секунду <Text simulateTyping={1000}>.


Получение сообщений


Мы рассмотрели как посылать сообщения, давайте разберемся как подписываться на сообщения от пользователей. За подписки в Urban Bot отвечают React Hooks.


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


import React from 'react';import { Text, useText } from '@urban-bot/core';function App() {    useText(({ text }) => {        console.log(`Пользователь отправил сообщение ${text}`);    });    return (        <Text>            Hello, world!        </Text>    );}

Urban Bot предоставляет готовы набор хуков для разных типов сообщений. Например, useImage, если пользователь отправил изображение, useFile и т.д. Полный список здесь. В каждый хук также приходит мета информация, кто отправил сообщение и т.д.


Эхо бот


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


В этом компоненте мы впервые добавим работу с переменными через React хук useState. Этот хук возвращает переменную и функцию, чтобы ее изменять. React.useState нужен, чтобы изменение переменной приводило к ререндеру и, соответсвенно, отправке нового сообщения. Мы определим начальное значение переменной text как "Привет" и передадим в компонент Text. Также мы подпишемся на сообщения от пользователей с помощью хука useText, и будем изменять text через функцию setText. После вызова setText React перерендерит компонент Echo с новым значением, и пользователь получит новое сообщение с тем что он сам отправил боту.


import React from 'react';import { Text, useText } from '@urban-bot/core';function Echo() {    const [text, setText] = React.useState('Привет!');    useText(({ text }) => {        setText(text);    });    return (        <Text>            {text}        </Text>    );}

Кнопки


Давайте также напишем пример с кнопками, сделаем простейший счетчик. Для этого нам понадобятся компоненты ButtonGroup и Button. Каждой кнопке мы определим свой обработчик, который будет менять count на +1 или -1 и будем передавать результат в ButtonGroup в проп title. Мы установим проп isNewMessageEveryRender как false, чтобы при последующих ререндерах отправлялось не новое сообщение с новыми кнопками, а просто изменялось начальное сообщение.


import React from 'react';import { ButtonGroup, Button } from '@urban-bot/core';function Counter() {    const [count, setCount] = React.useState(0);    const increment = () => setCount(count + 1);    const decrement = () => setCount(count - 1);    return (        <ButtonGroup title={count} isNewMessageEveryRender={false}>            <Button onClick={increment}>+1</Button>            <Button onClick={decrement}>-1</Button>        </ButtonGroup>    );}


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


Теперь, когда пользователь напишет "/echo" отрендериться компонент Echo, когда "/counter" управление перейдет в Counter. Роуты также могут принимать path как regexp.


import React from 'react';import { Router, Route } from '@urban-bot/core';import { Echo } from './Echo';import { Counter } from './Counter';function App() {    return (        <Router>            <Route path="/echo">                <Echo />            </Route>            <Route path="/counter">                <Counter />            </Route>        </Router>    );}

Визуальный пример, чтобы увидеть как будет работать код.


image


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


Форматирование текста


Urban Bot позволяет стилизовать сообщения через привычные HTML теги. Писать жирным <b>, курсивом <i>, зачеркнутым <s>, переносить строки <br /> и так далее, полный список здесь.


Пример
const someCode = `function sum2() {    return 2 + 2;}if (sum2() !== 4) {    console.log('WTF');}`;<Text>    Usual text    <br />    <b>Bold text</b>    <br />    <i>Italic text</i>    <br />    <u>Underscore text</u>    <br />    <s>Strikethrough text</s>    <br />    <q>quote</q>    <br />    <b>        Bold and <s>Strikethrough text</s>    </b>    <br />    <code >Code 2 + 2</code >    <br />    <pre>{someCode}</pre>    <br />    <a href="http://personeltest.ru/aways/github.com/urban-bot/urban-bot">External link</a></Text>


Диалоги


Чат-боты могут вести диалоги с пользователем, что-то спрашивать, реагировать на сообщения в зависимости от ответа пользователя. В Urban Bot встроен компонент Dialog, который позволяет легко создавать диалоги любой сложности.


Пример плоского диалога. Бот задаст первый вопрос, после ответа задаст второй, потом третий, потом запустит callback onFinish с готовыми ответами. На каждом шаге можно обрабатывать ответ пользователя через callback onNext.


import React from 'react';import { Dialog, DialogStep, Text } from '@urban-bot/core';function FlatDialogExample() {    return (        <Dialog onFinish={(answers) => console.log(answers)}>            <DialogStep                content={<Text>Привет, как тебя зовут?</Text>}                 id="name"                onNext={(name) => console.log(name)}            >                <DialogStep                    content={<Text>Cколько тебе лет?</Text>}                    id="age"                >                    <DialogStep                         content={<Text>Из какого ты города?</Text>}                        id="city"                    />                </DialogStep>            </DialogStep>        </Dialog>    );}

Можно получать на следующем шаге прошлый ответ через паттерн render-props .


function FlatDialogExample() {    return (        <Dialog>            <DialogStep content={<Text>Привет, как тебя зовут?</Text>}>                {(name) => (                    <DialogStep                         content={<Text>{`${name}, cколько тебе лет?`}</Text>}                    />                )}            </DialogStep>        </Dialog>    );}

Можно добавить валидацию на каждый шаг.


function FlatDialogExample() {    return (        <Dialog onFinish={(answers) => console.log(answers)}>            <DialogStep                content={<Text>Привет, как тебя зовут?</Text>}                id="name"                validation={{                     isValid: (answer) => answer !== 'Самуэль',                     errorText: 'Самуэль заблокирован.'                 }}            >                // ...            </DialogStep>        </Dialog>    );}

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


import React from 'react';import { Dialog, DialogStep, Text, ButtonGroup, Button } from '@urban-bot/core';function TreeDialogExample() {    return (        <Dialog>            <DialogStep                content={                    <ButtonGroup title="Привет, что вы хотите купить?">                        <Button id="hat">Футболка</Button>                        <Button id="glasses">Очки</Button>                    </ButtonGroup>                }            >                <DialogStep                    match="hat"                    content={                        <ButtonGroup title="Футболка какого размера?">                            <Button id="m">S</Button>                            <Button id="s">M</Button>                            <Button id="l">L</Button>                        </ButtonGroup>                    }                />                <DialogStep                    match="glasses"                    content={                        <ButtonGroup title="Очки какого цвета?">                            <Button id="black">Черный</Button>                            <Button id="white">Белый</Button>                        </ButtonGroup>                    }                />            </DialogStep>        </Dialog>    );}

Состояние


Что вы можете использовать для управления состоянием? Все то же что и в любом React приложении. Можете использовать React useState и передавать состояние ниже по дереву компонентов через пропсы или React Context. Можно использовать библиотеки для управления состоянием: Redux (пример), MobX (пример), Apollo и любые другие, которые обычно используют вместе с React, вы можете даже переиспользовать готовые части из готовых React Web или React Native приложений, так как Urban Bot использует тот же чистый React, который работает в миллионах приложений.


Сессия


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


В любом примере на Urban Bot уже вшита работа с сессией. Например, в примере ниже у каждого пользователя, кто зайдет в персональный чат-бот, будет его собственный счетчик.


function Counter() {    const [count, setCount] = React.useState(0);    const increment = () => setCount(count + 1);    const decrement = () => setCount(count - 1);    return (        <ButtonGroup title={count} isNewMessageEveryRender={false}>            <Button onClick={increment}>+1</Button>            <Button onClick={decrement}>-1</Button>        </ButtonGroup>    );}

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


function Counter() {    const [count, setCount] = useGlobalCount();   // ...}

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


import React from 'react';import { Text, useText, useBotContext } from '@urban-bot/core';function UserId() {    const { chat } = useBotContext();    useText(({ from }) => console.log(`Пришло сообщение от ${from.username}`));   return <Text>Чат id {chat.id}</Text>;}

Типизация


Urban Bot написан на TypeScript, соответсвенно проект полностью типизирован, и если вы пишете на TypeScript, вам будет очень удобно.


Запуск в мессенджерах


Большой плюс Urban Bot, что он не привязан ни к одному мессенджеру. Есть основной пакет @urban-bot/core, который позволяет создавать абстрактных чат-ботов, а уже их подключать к определенным мессенджерам. В данный момент есть поддержка Telegram, Slack, Facebook. В дальнейшем, мы планируем добавлять любые мессенджеры, где есть чат-боты и открытое API. Если вам интересно, и вы хотите писать Urban Bot приложения для других мессенджеров, скажем Viber, Discord или у вас есть свой мессенджер то пишите к нам в группу https://t.me/urbanbotjs, одной просьбы будет достаточно, чтобы появилось большая мотивация реализовать ваш функционал.


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


Скажем, у нас есть готовое приложение App и мы хотим его запустить его в Telegram. Для этого нам понадобится класс UrbanBotTelegram из пакет @urban-bot/telegram. Функция render из @urban-bot/core подобная ReactDOM.render и компонент Root. Мы создаем экземпляр UrbanBotTelegram и передаем туда бот токен из Telegram, также можно передать isPolling, чтобы не настраивать вебхук, и бот работал локально. Готовый экземпляр мы передаем в компонент Root, и оборачиваем наше готовое приложение и, соответсвенно, передаем все в функцию render, которая запустит все процессы.


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


import React from 'react';import { render, Root } from '@urban-bot/core';import { UrbanBotTelegram } from '@urban-bot/telegram';import { App } from './App';const urbanBotTelegram = new UrbanBotTelegram({    token: 'telegramToken',    isPolling: true,});render(    <Root bot={urbanBotTelegram}>        <App />    </Root>);

Если нам нужно запустить два и более мессенджера, просто используем пакеты других мессенджеров, передаем туда нужные данные и делаем по аналогии с Telegram.


// ...import { UrbanBotSlack } from '@urban-bot/slack';// ...render(    <Root bot={urbanBotTelegram}>        <App />    </Root>);const urbanBotSlack = new UrbanBotSlack({    signingSecret: 'slackSigningSecret',    token: 'slackToken',});render(    <Root bot={urbanBotSlack}>        <App />    </Root>);

Прямой вызов API


С помощью Urban Bot вы можете создавать чат-ботов просто описывая их через компоненты. А что если вам будет нужно вручную вызвать API? Каждый экземпляр UrbanBot* содержит в себе API клиент для активного мессенджера. Рассмотрим пример для Telegram.


Мы можем получить bot с помощью хука useBotContext. bot содержит client и type c типом мессенджера. client будет представлять собой экземпляр библиотеки node-telegram-bot-api . В любом месте приложения можно получить client и вызвать любой метод на ваше усмотрение, скажем блокировать пользователя, если он написал нецензурное сообщение.


import React from 'react';import { useText, useBotContext } from '@urban-bot/core';function SomeComponent() {    const { bot } = useBotContext();    useText(({ text, chat, from }) => {        if (text.includes('бл***')) {            bot.client.kickChatMember(chat.id, from.id);        }    });    // ...}

В каждом мессенджере уникальный API. Если вы разрабатываете несколько мессенджеров одновременно, можно отделять функционал сравнивая bot.type.


import { useBotContext } from '@urban-bot/core';import { UrbanBotTelegram } from '@urban-bot/telegram';import { UrbanBotSlack } from '@urban-bot/slack';function SomeComponent() {    const { bot } = useBotContext();    if (bot.type === UrbanBotTelegram.type) {        // telegram api        bot.client.kickChatMember(/* ... */);    }    if (bot.type === UrbanBotSlack.type) {        // slack api        bot.client.conversations.kick(/* ... */);    }    // ...}

Как попробовать?


У Urban Bot есть стартер, который позволит вам начать разрабатывать чат-ботов за минуту, сделан по аналогии с create-rect-app. Все что вам нужно, чтобы попробовать Urban Bot это выполнить команду в терминале для


TypeScript


npx create-urban-bot my-app

JavaScript


npx create-urban-bot my-app --template js

Команда склонирует шаблон приложения с нужными зависимостями и скриптами на ваш компьютер, и вам останется только открыть проект, передать ваши токены в .env файл и расскоментировать мессенджеры, которые вы хотите разрабатывать. Видео инструкция.


Итого


Несмотря на то что Urban Bot запустился только недавно, на мой взгляд это библиотека с огромным потенциалом. Только представьте, если у вас есть базовые знания React, вы можете написать чат-бот любой сложности на все возможные платформы, создавать и использовать библиотеки с готовым набором компонентов на манер ui-kit, переиспользовать код между вашими другими UI приложеними на React, будь то web или mobile.


Если вы уже разрабатывали чат-ботов, попробуйте Urban Bot, вы почувствуете как библиотека делает за вас кучу работы. Если никогда не разрабатывали, но имеете представление о React, то напишете вашего первого чат-бота за 5 минут. Если вам понравилась идея и хотите, чтобы проект развивался дальше, вступайте в нашу группу в Telegram, ставьте звезду на гитхабе, будем рады любому фидбеку.


Полезные ссылки


Сайт
Github
Группа в Telegram
Наглядный чат-бот в Telegram, с открытым кодом.
Как создать Todo List чат-бот в Telegram с помощью React.js

Подробнее..

Оплата в телеграм боте Платежи 2.0 Сбербанк Telegraf Node.js

02.05.2021 10:10:12 | Автор: admin

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



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


Платежи 2.0


Платежи 2.0


Платёжные боты существуют в Telegram с 2017 года. С их помощью можно безопасно оплачивать товары и услуги вроде доставки пиццы, не покидая приложения.


С сегодняшнего дня продавцы могут принимать платежи кредитными картами с помощью 8-ми встроенных платёжных систем в любом чате, включая группы и каналы.


На данный момент поддерживаются платежи из более чем 200 стран через следующие платежные системы:


Платежи 2.0


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


Для оплаты можно использовать любое приложение в том числе Telegram для компьютеров. Покупатель также может оставить чаевые, чтобы поддержать любимого автора, кафе или магазин.


Создаём бота в Telegram


Бот в Telegram создается при помощи другого бота под названием @BotFather. Отправляем ему команду /newbot, выбираем имя, которое будет отображаться в списке контактов, и адрес. Например, Оплата в Telegram боте с адресом sber_pay_test_bot.


newbot


Если адрес не занят, а имя введено правильно, BotFather пришлет в ответ сообщение с токеном ключом для доступа к созданному боту.


ВНИМАНИЕ! Его нужно сохранить и никому не показывать.


Создаем проект Node.js


Далее создадим новый проект. Создаем папку.


Вводим в консоле:


mkdir sber_pay_test_bot && cd sber_pay_test_bot

Затем:


npm init 

Программа задаёт вам разные вопросы и создает package.json, который определяет настройки проекта, зависимости, скрипты, название и прочее. Для примера можно везде нажать enter


и добавим файл index.js в котором будет разрабатываться наш бот.


touch index.js    

Telegraf.js


Cтавим telegraf.js это один из популярных фреймворков для создания телеграм бота.


npm install telegraf@3.38 

Ставим библиотеку dotenv это модуль, который загружает переменные среды из файла .env в process.env., а также заодно поставим nodemon инструмент, который помогает разрабатывать приложения на основе node.js путем автоматического перезапуска приложения node при обнаружении изменений файлов в каталоге.


npm install dotenv nodemon

Добавляем скрипт запуска в package.json


"scripts": {    "start": "nodemon index"}

Из документации telegraf.js, копируем в наш проект первоначальную настройку бота.


const { Telegraf } = require('telegraf')require('dotenv').config()const bot = new Telegraf(process.env.BOT_TOKEN) //сюда помещается токен, который дал botFatherbot.start((ctx) => ctx.reply('Welcome')) //ответ бота на команду /startbot.help((ctx) => ctx.reply('Send me a sticker')) //ответ бота на команду /helpbot.on('sticker', (ctx) => ctx.reply('')) //bot.on это обработчик введенного юзером сообщения, в данном случае он отслеживает стикер, можно использовать обработчик текста или голосового сообщенияbot.hears('hi', (ctx) => ctx.reply('Hey there')) // bot.hears это обработчик конкретного текста, данном случае это - "hi"bot.launch() // запуск бота

Создаем файл .env куда в переменную BOT_TOKEN кладем токен, который ранее нам выдал @BotFather


BOT_TOKEN='сюда'

Запускаем бот командой


npm run start

Проверяем работу бота


check bot


Получаем PROVIDER_TOKEN от @SberbankPaymentBot


Для получения PROVIDER_TOKEN вам необходимо получить merchantLogin в Сбербанке. Для этого необходимо подключить услугу интерент-эквайринг в Сбербанке.


После того как вы его получили переходим в @BotFather и вызываем команду /mybots, где выбираем вашего бота.


Далее Payments


Payments


Где выбираем Сбербанк


Payments


Выбираем Connect Сбербанк Live


Payments


После этого вас перекинет на @SberbankPaymentBot, где нужно ввести ваш merchantLogin, который необходимо вводить без всяких префиксов -api или -operator. Например так: P71XXXXXXX21. Из-за того что я этого не знал, у меня ушло на переписку с техподдержкой Сбербанка неделя времени.


SberbankPaymentBot


После @BotFather выдаст вам токен, который нужно вставить в переменную PROVIDER_TOKEN файла .env


PROVIDER_TOKEN='41018XXXX:LIVE:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

SberbankPaymentBot


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


Пишем в index.js следующий код:


const { Telegraf } = require('telegraf')require('dotenv').config()const bot = new Telegraf(process.env.BOT_TOKEN) //сюда помещается токен, который дал botFatherconst getInvoice = (id) => {  const invoice = {    chat_id: id, // Уникальный идентификатор целевого чата или имя пользователя целевого канала    provider_token: process.env.PROVIDER_TOKEN, // токен выданный через бот @SberbankPaymentBot     start_parameter: 'get_access', //Уникальный параметр глубинных ссылок. Если оставить поле пустым, переадресованные копии отправленного сообщения будут иметь кнопку Оплатить, позволяющую нескольким пользователям производить оплату непосредственно из пересылаемого сообщения, используя один и тот же счет. Если не пусто, перенаправленные копии отправленного сообщения будут иметь кнопку URL с глубокой ссылкой на бота (вместо кнопки оплаты) со значением, используемым в качестве начального параметра.    title: 'InvoiceTitle', // Название продукта, 1-32 символа    description: 'InvoiceDescription', // Описание продукта, 1-255 знаков    currency: 'RUB', // Трехбуквенный код валюты ISO 4217    prices: [{ label: 'Invoice Title', amount: 100 * 100 }], // Разбивка цен, сериализованный список компонентов в формате JSON 100 копеек * 100 = 100 рублей    payload: { // Полезные данные счета-фактуры, определенные ботом, 1128 байт. Это не будет отображаться пользователю, используйте его для своих внутренних процессов.      unique_id: `${id}_${Number(new Date())}`,      provider_token: process.env.PROVIDER_TOKEN     }  }  return invoice}bot.use(Telegraf.log())bot.hears('pay', (ctx) => { . // это обработчик конкретного текста, данном случае это - "pay"  return ctx.replyWithInvoice(getInvoice(ctx.from.id)) //  метод replyWithInvoice для выставления счета  })bot.on('pre_checkout_query', (ctx) => ctx.answerPreCheckoutQuery(true)) // ответ на предварительный запрос по оплатеbot.on('successful_payment', async (ctx, next) => { // ответ в случае положительной оплаты  await ctx.reply('SuccessfulPayment')})bot.launch()

Метод Telegraf replyWithInvoice это метод telegram.sendInvoice.


Используйте этот метод для отправки счетов. В случае успеха отправленное сообщение возвращается.


Запускаем бот командой yarn start и проверяем проходит ли оплата.


Проверить как работает оплата можно в наших телеграм ботах JavaScript Bot это бот с тестовыми вопросами по нашим курсам JavaScript, React Native, TypeScript, а также проверить платежи можно боте по изучению английских слов по эмодзи Englishmoji


Проблемы или вопросы?


Задавайте их в телеграм сообществе Боты на Telegraf


Подписывайтесь на наши новости и социальные сети.


JavaScript Camp

Подробнее..

Управляем офисом с помощью простого telegram-бота

28.07.2020 16:18:22 | Автор: admin
Привет, Хабр! Меня зовут Александр, я работаю в компании FINCH. Мы создаем приложения для крупных брендов вроде Спартака, Столото и Газпром-медиа.

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




Дисклеймер: если вы ищете сложных технических кейсов, боюсь мне нечем вас порадовать. Говорю заранее, чтобы у вас не было ложных ожиданий. У нас простое, но эффективное решение, которое можно легко сделать за пару часов, получив кучу пользы.

Как устроен бот


Бот предельно простой: две кнопки для дверей (открыть дверь, открыть калитку) + несколько для камер.



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

Бот экономит время


Бот это удобно. Особенно, когда забыл ключи или когда лень их доставать пока идешь курить. Кажется, что это мелочи ну достань ты связку ключей с брелоком из Парижа или пропуск из кармана и приложи к двери. Но из таких мелочей состоит вся наша жизнь кажется, если каждый день экономить по 10-15 секунд то можно будет наслаждаться реальностью дополнительные 5-10 дней. Посмотрите на эту красивую инфографику о том, куда уходят наши годы жизни.

Но главная причина для бота курьеры. У нас двухэтажный офис на 800м, но с одним входом для курьеров. Если ты работаешь на первом этаже, то проблем нет, но пока дойдешь из DevOps-отдела до входа, пройдет вечность.


Встреча с курьером после долгих лет странствий

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

С ботом все было бы проще. Спокойно работаешь, курьер звонит, просишь его нажать на кнопку звонка и оставить заказ у двери, слышишь звонок. Нажал на кнопку открыл калитку, нажал вторую открыл дверь. Курьер оставил еду Profit!

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

Как бот следит за офисом


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

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



Что внутри бота


Мы написали специальный сервис, так как без него делать опасно не хотелось бы, чтобы кто-то случайно наткнувшись в поиске на бота, смог бы открывать двери в нашем офисе. Сидит такой человек в Переславле-Залесском и вносит смуту в Московском мобильном продакшне.


А это Переславль-Заллеский. Выглядит прекрасно!

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



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

Бот и камеры


С камерами похожая история. Есть внутренняя сеть, которая автоматически генерирует превью. Все, что требуется обратиться на ссылку по которой всегда гарантированно есть свежая картинка последний кадр с камеры. Он всегда хранится в оперативке обновляется не постоянно, но точно есть. Как раз в оперативку и идет обращения по хитрой схеме авторизации.

Говоря хитрую я имею ввиду нестандартный запрос, который вряд ли где-то кроме камер используется. Нужно прям в домене указывать логин и пароль, прям как mailto. Дальше все просто Java обращается к URL, сохраняет файл и загружает в Telegram. Бот не создает новый кадр, а перезаписывает существующий. Ему неинтересно кто во сколько пришел на работу, его интересует только текущее состояние. Каждое изображение весит около 200-300 Кб, о высоких нагрузках речи не идет. Но чтобы никто не смог положить бота, и чтобы бота не забанил Telegram за спам, мы добавили 10-секундный интервал между отправкой запросов.

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

Последнее, что стоит отметить ночные уведомления. Мы периодически устраиваем вечеринки в офисе, плюс у нас всегда есть люди, которые уходят из офиса позднее остальных. Поэтому мы сделали так, что если кто-то с 00:00 до 09:00 пользуется ботом, то пользователю и специально отмеченным людям приходит уведомление.



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



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

Раньше со скоростью вообще дела шли не очень спасибо блокировке Telegram. Команды, которые должны были выполняться 2-3 миллисекунды, выполнялись секунду. А для всех звеньев, которые используют прокси (получение и отправление) пинг возрастает многократно.

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

Бонус трек: придумываем идеи, что еще можно придумать для офиса. Придумывайте и вы


  1. Заказывать еду в офис. То есть автоматизировать то, что мы обычно делаем в специальных чатах вроде FINCH Еда. Многим нашим сотрудникам, не особо нравится разговаривать с людьми, им нравится тыкать кнопки (Денис, кто создал бота из таких).
  2. Бот мог бы помочь: условно люди подписывались на него, и когда дело доходило до заказа, человеку в личку прилетал вопрос Будешь пиццу? с ответами Да и Нет. При необходимости он выяснял бы детали у человека, кто создал запрос.
  3. Выводить CO2. Вовремя проветриваем помещение, не теряем сознание от углекислого газа. Сейчас это можно посмотреть в Графане, но мы можем сделать так, что и значения и график будут прилетать человеку по нажатию кнопки.
  4. Регулировать свет. Это нужно для тех, кто любит работать в темноте. Мы могли бы подключить бота к диодным лампам, и с помощью бота можно было бы регулировать их яркость. Условно, человек заранее выставляет нужно значение освещения и бот его запоминает. Потом в определенный момент, когда жить со светом уже нельзя человек нажимает кнопку и вуаля атмосфера создана.

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

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

При этом делать отдельных ботов еще хуже, потому что придется искать их, а это столько кликов, что зачем вообще такой бот, если быстрее сделать все вручную (даже если ты сидишь в отделе DevOps и тебе нужно встречать курьера).

Однако мечтать никто не запрещает. Расскажите о самых безумных идеях для Telegam-бота, и авторам самых крутых мы раздадим эксклюзивные майки FINCH. Отправим в любую точку мира

Спасибо!
Подробнее..

Калькулятор Wolframalpha в диалоге Telegram

14.08.2020 14:14:13 | Автор: admin

Идея


В диалогах телеграма я очень часто использую телеграм бот: inlatexbot. Он позволяет вставлять Latex прямо в диалоге телеграма это удобно: математическое обозначение можно отправить понятной картинкой, чтобы было так

$$display$$\sqrt{4} * 2^x * \frac {1} {3}=1024$$display$$

, а не так sqrt(4)*2^x * 1/3 =1024.
Но не менее часто, мне в телеграме необходим функционал WolframAlpha: посчитать сложный счет за вечеринку с друзьями, различные проценты, решить уравнение и так далее полный функционал WolframAlpha, но при этом не выходить из диалога телеграма.

Подключение Wolfram


Я нашел Wolfram Alpha API для python (http://personeltest.ru/aways/pypi.org/project/wolframalpha/). Документация предельно понятная и можно сделать все, что доступно в веб версии. Правда, есть ограничение бесплатного Wolfram API на 2000 запросов в месяц. Код, который работает с вольфрамом предельно простой и у меня вышел в 4 строки.

import wolframalphaclient = wolframalpha.Client('TOKEN')res = client.query(query)print(next(res.results).text)

В первых двух строчках я импортирую модуль wolframalpha, создаю client со своим APP ID необходимо предварительно зарегистрироваться в wolfram и получить его, далее можно отправлять запросы к вольфраму и просто делаю принт результат того, что получил Wolfram Alpha. Все работает теперь можно приступать к интегрированию с Telegram.

Интегрирование в Телеграм бот


Осталось соединить все вместе и отправлять запросы, полученные из Телеграм в Вольфрам и выдавать ответ юзеру. Создаю бот в @BotFather, в настройках включаю режим inline, чтобы бот работал прямо в диалоге Телеграм. Использую пример inline бота из GitHub для Телеграм, и отправляю ответ юзеру. Вот как выглядит самая важная часть кода.

def inlinequery(update, context):    """Handle the inline query."""    query = update.inline_query.query    print(query)    res = client.query(query)    results = [        InlineQueryResultArticle(            id=uuid4(),            title="Magic answer is here!",            input_message_content=InputTextMessageContent(                "{} => *{}*".format(query, next(res.results).text),                parse_mode=ParseMode.MARKDOWN))]    update.inline_query.answer(results)

Как это работает?


Очень просто прямо в диалоге я ввожу @calcherebot 12 + 15 и мне выдает ответ 27. Бот в телеграме упрощает не только процесс подсчетов чего-либо, но и процесс различных доказательств, например можно узнать население Москвы или средний вес человека и бот в каком-то смысле меняет коммуникацию: больше не нужны скриншоты калькуляторов, википедии или других источников теперь все может быть доступно в диалоге.



Что дальше?


Пока что бот работает локально и поддерживает всего лишь 2000 запросов в месяц, что очень мало для публичного использования. В моих планах его доработка для массового использования всем, кому это необходимо: студентам, ученым, просто людям которым нужно что-то посчитать или доказать прямо в телеграме. Если у вас есть идеи или пожелания по доработке( скорее всего они есть, так как бот был написан за пару часов) напишите мне на почту: rk-helper@yandex.ru
Подробнее..

Перевод Как избежать блокировки в WhatsApp для того чтобы

14.08.2020 04:10:43 | Автор: admin


чтобы отправлять сообщения каждые 30 секунд (120 сообщений в час).
Надеюсь что мистер Цукенберг не заходит на этот ресурс :)

WhatsApp самый популярный в мире мессенджер (свыше 1.3 миллиарда пользователей), но почему нельзя общаться с большим количеством пользователей в этом приложении?

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


С точки зрения WhatsApp, боты это нормально, но вы должны только отвечать на сообщения, но никогда не начинать общение первым.

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

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

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

Что можно и чего нельзя делать:

1. Высылайте интересный контент, опросы показывают что пользователи нормально к этому относятся по сравнению с рекламой, даже если они получают сообщения в субботу вечером.

2. Добавляйте каждый контакт, которому вы шлете сообщения, в свой контакт лист.

3. Высылайте каждый раз как бы разные сообщения, можно сделать скрипт, который бы рандомно ставил пробелы в сообщения и вставлял бы имя получателя.

4. После отправки первого сообщения используйте рандомный таймаут (от 30 до 60 секунд) перед отправкой следующего сообщения.

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

6. Если вы не знаете как хакнуть валидацию регистрации (в сети много туториалов по этому вопросу), то лучше использовать реальный телефон, а не эмулятор.
7. Прокси маст хев, удостоверьтесь что реальный телефон и бот имеют одинаковые IP адреса и эти адреса привязаны к той же стране, номера которой у вас в контакт листе.

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

9. Используйте какую-нибудь картинку в профиле, это не относится к Whatsapp Bots Catcher, просто люди могут пометить контакт без фото как спам.

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

11. Хотя вы можете пытаться отправить сообщения тем у кого нет WhatsApp, крайне не рекомендую это делать.
Всегда проверяйте имеет ли контакт WhatsApp аккаунт или нет.

12. У WhatsApp существуют специальные номера для тестов и если вы вышлете сообщение на 00@c.us официальный маркетинговый аккаунт вацапа, то это тоже самое что пытаться продать кокаин полиции.

13. Не позволяйте своему скрипту делать запросы туда, куда не делает их обычный клиент Whatsapp Web все логи таких ошибок сохраняются.

14. Всегда шлите уведомление прочитано после принятия сообщения или выключите это уведомление в настройках.

15. Не отвечайте мгновенно на сообщение нормальный таймаут ответа 5-10 секунд.

16. Хорошая практика ответа на сообщение открыть чат, выслать нотификацию прочитано, затем выслать статус typing, потом подождать несколько секунд и отправить сообщение.

17. Очищайте кэш в браузере всякий раз, когда вы открываете Whatsapp Web, да это головная боль каждый раз вводить новый QR код, но без этого ваш бот нормально не перезагрузится.

18. Избегайте высылать ссылки, которые уже были помечены кем-то как спам и избегате слать ссылки без https. Хорошая идея использовать сокращатель ссылок.

19. Важно: Плохая идея слать сообщения 24/7 без перерыва.
Рандомной задержки недостаточно, шлите разумное количество сообщений например шлите максимум 4 сообщения в час каждому контакту кто ответил вам, затем перерыв на час и затем опять.

20. В начале разговора шлите только одно короткое сообщение, не нужно слать длинный текст или несколько сообщений без реакции пользователя на них.

21. Если вам нужно ответить несколькими сообщениями, вышлите сначала одно, потом подождите несколько секунд и затем вышлите второе.
Но даже если вы ответили несколькими сообщениями с паузами, вы все равно можете оказаться заблокированными, поэтому пытайтесь отвечать одним сообщением.

22. Не шлите разным людям разные сообщения одновременно, шлите такие сообщения по очереди.

23. Избегайте использования префиксов в сообщениях.

24. Не используйте yowsup-cli

25. Ставьте пометку online при отправке сообщения.

Имейте ввиду:

1. Каждый человек, кому вы отправляете сообщение и у которого вы не находитесь в контактах, будет спрошен на предмет спама.
Если вас выделят как спам 5-10 раз, вы будете заблокированы.

2. Помните WhatsApp записывает каждое движение, которое вы делаете, чтобы проверить это вышлите письмо в их суппорт они могут выслать логи.
Поэтому ведите себя как человек.

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

4. Использовать приложения которые дублируют вацап тоже плохая идея вацап это видит и блокирует.

5. Старайтесь вовлекать в чат с собеседника и если сразу вас не пометили как спам, то все ок и можно продолжать. Чем чаще отвечают вам люди тем меньше шансов у вас попасть под бан.

6. Думайте об этом как о балльной системе если вас внесли в список контактов, то вы получили 1 балл, если пометили как спам вы потеряли 1 балл и т.д.

7. Не позволяйте вашему боту быть запущенным долго время от времени выключите WhatsApp Web, откройте вацап на телефоне, потом снова запустите вебверсию и т.д.

8. Виртуальные номера в некоторых странах знакомы вацапу, поэтому вы не сможете там зарегестрироваться, вы получите сообщение Not a valid number for country XX

9. Если вацап по каким то причинам стал недоступен на телефоне, а Whatsapp Web этого не заметил, то вы еще можете отправлять какие-то команды, но будете забанены, т.о. избегайте пользоваться Whatsapp Web если ваш телефон не в сети.

10. Если у вас несколько вацап аккаунтов под одним IP адресом и вы заметили что один из них заблокирован, немедленно закройте другие аккаунты, иначе они тоже будут заблокированы.

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

заблокированы.

Если вас все-таки заблокировали, но вы не хотите сдаваться:

1. Удалите вацап и все что с ним связано.

2. Сделайте сброс к заводским настройкам, если это возможно.

3. Подключитесь с новым IP адресом

4. Скачайте вацап

5. Первые сообщения сделайте с тем номером, который давно имеет вацап например с вашим собственным телефоном.

6. Некоторые люди говорят что нужно ждать 12-36 часов после первого сообщения, другие говорят что если вы не шлете сообщения в течении дня, то после первого сообщения вы будете забанены я делаю так регистрируюсь, шлю первое сообщение, потому жду несколько часов и затем уже шлю сообщения как обычно.

Что будет если вы напишете в суппорт WhatsApp с вопросом о причинах блокировки?

Есть небольшой шанс быть разбаненным, у меня было несколько случаев разблокировки через 1 день и несколько случаев блокировок с прошедшими месяцами после письма и до сих пор неразблокированными.

Отвечают быстро, но всегда одно и тоже:

## WhatsApp Support ##
Hello,
Thanks for getting in touch with us!
Your WhatsApp account has been disabled because you have violated our Terms of Service when using an unauthorized app or an unsupported device.
Please remove the application and install an authorized version on a compatible device at: www.whatsapp.com/download
Please keep in mind that we do not allow support for unofficial or jailbroken / rooted clients (including emulators) and unsupported devices.
To use WhatsApp on your computer, visit our website from your computer's browser. Then open WhatsApp and scan the QR code using the WhatsApp application on your phone (look for WhatsApp Web in the WhatsApp settings on your device). WhatsApp can only be installed on your computer if you are using Windows operating systems 8.0 and higher or Mac OSX.9 and above. If you are experiencing problems installing WhatsApp on a supported operating system, disable your anti-virus and try again.
You have the option to access WhatsApp through your browser here if you are using non-compatible operating systems.
Your account will be permanently disabled, and without the possibility of appeal if you continue to violate our Terms of Service.Cheers,
Roshan
WhatsApp Support Team
Take a look at our FAQ.

Финальные соображения и заключения.

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

Note: Я не использую API для рассылки спама или маркетинговых предложний и не люблю тех кто это делает.
Я всегда пишу только тем, кто подтвердил желание общаться со мной, но на самом деле WhatsAppу плевать на это.

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

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru