Создаем многопользовательский сервис при помощи Zennoposter + Telegram API

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63

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

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

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

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

Для работы нам потребуется либо Zennoposter версии стандарт и выше (нужно минимум 2 потока), либо зеннобокс, также купленный через лицензию стандарт и выше, т.к. потребуется добавлять несколько шаблонов и телеграмм.

Ссылка на русскую документацию, описывающую API Телеграм тут: https://tlgrm.ru/docs/bots/api

Первым делом создадим бота.

Добавляем в телеграм контакт @BotFather


Вводим боту последовательность команд, с названием бота и именем, которое должно заканчиваться на «bot».


В итоге получаем наш ключ для использования API телеграма:

Use this token to access the HTTP API:

313403030:AAHSGy5ebCE9alwUNKa1iJk6H8SUEDEbrPU

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


-----------------------------------------------------------------------​

Далее вкратце опишу структуру того, что мы будем писать для ZennoPoster. Для получения информации об новых сообщениях в боте в телеграме используется два диаметрально противоположных по логике способа получать обновления от вашего бота: getUpdates и вебхуки. Входящие обновления будут храниться на сервере до тех пор, пока вы их не обработаете, но не дольше 24 часов.

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

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

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

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



-------------------------------------------------------------------------
Итак, разберем все шаблоны по шагам:

1. Шаблон проверки новых сообщений

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

Код:
https://api.telegram.org/bot{-Variable.bot_token-}/getUpdates?offset={-Variable.last_update_id-}
{-Variable.last_update_id-} – это токен, который мы получили при создании бота, советую в этом и послеюущих шаблонах вынести его во входные настройки.
{-Variable.last_update_id-} – айди последнего обновления, при первом запросе переменная пустая, чтобы получить все обновления и спарсить айди последнего.
Далее на всякий случай стоит проверка на успешный ответ, делается это простой регуляркой "ok":.*true в ответе. Очень редко, но случается, что запрос уходит со сбоем, поэтому рекомендую все-таки ставить бесконечное количество запусков этому шаблону, а не один.

Ответы телеграм шлет в формате json, на момент написания шаблонов функционала парсинга не было, поэтому я собирал все регуляркой.

Напишем нашему боту любой текст, посмотрим, что мы получаем от телеграма в ответе:

Код:
{"message_id":4,"from":{"id":153478981,"first_name":"Vasiliy","last_name":"Pupkin","username":"vierasen"},"chat":{"id":153478981,"first_name":"Vasiliy","last_name":"Pupkin","username":"vierasen","type":"private"},"date":1482137729,"text":"634634634634"}}]}
Тут мы видим ID сообщения, теоретически мы можем отправлять ответ на конкретное сообщение, но можно просто слать ответ пользователю. Далее мы видим ID пользователя, это очень важный параметр, указывая его в команде ответа телеграм знает, какому пользователю отправить то или иное сообщение. Имя и фамилию и ник пользователя мы опустим, но может кому-то понадобятся эти данные. Тип сообщения и дата нам тоже не понадобится. Поле Text это собственно то, что отправил нам пользователь, по нему мы будем определять, что же делать дальше с поступившими данными.

Далее идет проверка на активную сессию пользователя, проверка осуществляется при помощи файла-маркера {-Variable.chat_id-)_.txt Если данный файл существует, то команда записывается в файл {-Variable.chat_id-).txt (без нижнего прочерка) и ответ шаблоном проверки не дается. Этот файл (без нижнего прочерка) будет постоянно очищаться шаблоном работы с сессией. В случае наличия активной сессии данные передаются другому шаблону, шаблон проверки ответ не дает.

Если активной сессии не обнаружено, то шаблон определяет суть поступившей команды. Вы можете обратить внимание на Switch
Если язык команды русский, то русские символы должны быть записаны в формате json. Для перевода русского текста в json воспользуйтесь любым кодировщиком json.

В свиче запрограммированы общие информационные ответы (содержание которых указывается во входных настройках), команда start_work, при получении которой создается 2 файла {-Variable.chat_id-)_.txt и {-Variable.chat_id-).txt (это значит, что сессия открыта). Весь default, то есть нераспознанная команда дает соответствующее сообщение пользователю.

Что еще хотелось бы сказать о данном шаблоне. Для того чтобы пользователь видел клавиатуру, мы к каждому ответу добавляем параметр {-Variable.reply_markup-}

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

Пользователь видит клавиатуру вот так:



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

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

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

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

Непосредственно с самим сайтом работаем аналогичным образом, в моем случае это 2 шаблона, привязанных как «проект в проекте». Работают как отдельные блоки, описанные выше. Первый шаблон принимает на вход номер, на выходе дает результат либо good (ожидайте получение кода), либо иной статус, к примеру номер не подошел. Во втором случае возвращаем шаблон к состоянию ожидания номера телефона. Второй шаблон уже вводит код и так же возвращает состояние. Результаты записываются в таблицу в удобном формате.


-------------------------------------------------------------------​
В данной статье внимательные читатели заметили 2 вещи, связку зеннопостер+телеграм, а также связь нескольких шаблонов в единую систему. По поводу телегама, это лишь одна из идей использования. Накину еще парочку, которые крутятся у меня в голове. К примеру, вы ведете продажи своего товара или услуги на форумах. Можно запрограммировать аналогичным образом систему, чтобы все ответы собирались в телеграм, а также было возможно дать свой ответ на любой форум, не заходя туда самостоятельно. Вторая идея принимать оплату от клиентов, регистрируя под каждую оплату отдельный кошелек с последующим переводом денег на центральный. Идей может быть масса, самое главное, что не нужно изучать языки программирования, можно сделать все на любимом зеннопостере.
Надеюсь, статью написал более-менее понятно, если какие-то моменты нужно прояснить, задавайте свои вопросы в комментариях.
 
Тема статьи
Нестандартные хаки
Номер конкурса статей
Шестой конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

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

Craftsman

Client
Регистрация
30.12.2015
Сообщения
61
Благодарностей
4
Баллы
8
Для того, чтобы шаблон, который выполняет непосредственно задачу регистрации аккаунтов не находился постоянно в работе, т.к. он использует браузер и потребляет больше ресурсов, мы вводим понятие пользовательской сессии. Сессия будет открываться после получения проверяющим шаблоном соответствующей команды на начало работы.
Я правильно понял, что первый шаблон запущен и работает постоянно 24/7. При выполнении какого-то условия в первом шаблоне запускается второй шаблон, который всегда выключен (не запущен). Если да, то как можно из первого шаблона пустить второй? Можете подсказать?
 

Sanekk

Client
Регистрация
24.06.2016
Сообщения
988
Благодарностей
389
Баллы
63
Как-то не давно задумывался над подобной идеей,а тут уже можно сказать готовое решение,но конечно нужно еще думать как допиливать его до состояния
чтобы все ответы собирались в телеграм, а также было возможно дать свой ответ на любой форум, не заходя туда самостоятельно
автору + за нестандартную идею)))
 

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
Я правильно понял, что первый шаблон запущен и работает постоянно 24/7. При выполнении какого-то условия в первом шаблоне запускается второй шаблон, который всегда выключен (не запущен). Если да, то как можно из первого шаблона пустить второй? Можете подсказать?
Все верно.

Наверное выскочило из головы дописать этот момент, хотя собирался. Я реализовывал это так:

1. Идем в диспетчер заданий

2. Добавляем задание с выполнением по сигналу

3. В качестве сигнала добавляем появление нашего файла {-Variable.chat_id-).txt (без нижнего прочерка), ставим галочку на удалить файл.

4. Добавляем шаблон сесиии.

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

Также можно реализовать запуск шаблона через bat файл, но придется немного поменять структуру для шаблона проверки.
 
  • Спасибо
Реакции: phoenixs и orka13

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
Как-то не давно задумывался над подобной идеей,а тут уже можно сказать готовое решение,но конечно нужно еще думать как допиливать его до состояния
автору + за нестандартную идею)))
Тут скорей инструментарий, что да как, связать все блоки второго шаблона это достаточно большой объем работы)
 

romanov

Client
Регистрация
14.05.2016
Сообщения
60
Благодарностей
3
Баллы
8
каково практическое применение данного шаблона?
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 247
Благодарностей
4 327
Баллы
113
Я правильно понял, что первый шаблон запущен и работает постоянно 24/7. При выполнении какого-то условия в первом шаблоне запускается второй шаблон, который всегда выключен (не запущен). Если да, то как можно из первого шаблона пустить второй? Можете подсказать?
c# имеет инструментарий по управлению другими проектами. Число потоков, число попыток и т.д.
 

Craftsman

Client
Регистрация
30.12.2015
Сообщения
61
Благодарностей
4
Баллы
8
Все верно.

Наверное выскочило из головы дописать этот момент, хотя собирался. Я реализовывал это так:

1. Идем в диспетчер заданий

2. Добавляем задание с выполнением по сигналу

3. В качестве сигнала добавляем появление нашего файла {-Variable.chat_id-).txt (без нижнего прочерка), ставим галочку на удалить файл.

4. Добавляем шаблон сесиии.

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

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

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

Craftsman

Client
Регистрация
30.12.2015
Сообщения
61
Благодарностей
4
Баллы
8
c# имеет инструментарий по управлению другими проектами. Число потоков, число попыток и т.д.
Вы имеете в виду запускать/останавливать шаблоны через "Свой код - С# код" ? Если да, то у меня пока с с-sharp пока сложности. Пока в процессе изучения.
 

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
какого практическое применение данного шаблона?
Конкретной шаблон приложенный к статье вряд ли можно применить в том виде что есть. Те люди, которые пишут шаблоны, смогут взять из них основу для собственных проектов в связке зенно+телеграм.

Ну а тем, кому понравилась идея с телеграмом, но сами шаблон такой не потянут / лень делать, всегда могут обратиться с заказом, ко мне например ;-)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 247
Благодарностей
4 327
Баллы
113

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
Вы имеете в виду запускать/останавливать шаблоны через "Свой код - С# код" ? Если да, то у меня пока с с-sharp пока сложности. Пока в процессе изучения.
Я описал наиболее простое решение, на с#, конечно будет пофункциональней, но для моих задач хватает диспетчера, либо встроенного генератора бат-файлов.
 
  • Спасибо
Реакции: doc

doc

Client
Регистрация
30.03.2012
Сообщения
8 247
Благодарностей
4 327
Баллы
113
Я так полагаю если бы все знали в совершенстве Си шарп на врятли кто то зенку покупал бы
ах если бы я его знал так) Но так сложилось, что именно в зенке я с ним и познакомился)
 

evgen2522

Client
Регистрация
08.01.2016
Сообщения
485
Благодарностей
107
Баллы
43
ах если бы я его знал так) Но так сложилось, что именно в зенке я с ним и познакомился)
Многие так начинают, но на начальном этапе стандартных кирпичей больше чем достаточно))))))
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
442
Баллы
63
Хорошая техническая статья.
Недавно реализовывал подобный функционал.
Конечно писать бота в шаблоне это еще то извращенство, когда существует куча библиотек под разные языки программирования.
Для новичков без знаний кодинга будет полезно, а для тех кто пишет код и так напишет бота без шаблона, который будет обмениватся командами с зенкой при помощи базы данных и триггеров комманд.
 

eliadsonet

Client
Регистрация
25.05.2012
Сообщения
120
Благодарностей
48
Баллы
28
@vierasen Можно обновить картинки в статье, есть 3 битые?
 
Последнее редактирование:

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63

eliadsonet

Client
Регистрация
25.05.2012
Сообщения
120
Благодарностей
48
Баллы
28
Код:
http://prntscr.com/dlpaff
 

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
Там иллюстрации, особого отношения к статье не имеют, так что смело можете не обращать на это вниманию. Не знаю, почему у вас они не грузятся. Еще может у кого-то эта проблема возникает?
 

evgen2522

Client
Регистрация
08.01.2016
Сообщения
485
Благодарностей
107
Баллы
43
Там иллюстрации, особого отношения к статье не имеют, так что смело можете не обращать на это вниманию. Не знаю, почему у вас они не грузятся. Еще может у кого-то эта проблема возникает?
нормально показывает в 4 браузерах это все какие бывают
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 208
Благодарностей
77
Баллы
48
Скажите, а подобным образом можно создать канал и сбрасывать инфу туда? Допустим стоит шаблон по расписанию и раз в 30 минут парсит значение N с сайта. Когда N становится меньше или больше какого-то числа, чтобы это в канале телеграма появлялось?
 

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
Скажите, а подобным образом можно создать канал и сбрасывать инфу туда? Допустим стоит шаблон по расписанию и раз в 30 минут парсит значение N с сайта. Когда N становится меньше или больше какого-то числа, чтобы это в канале телеграма появлялось?
Конечно можно, все методы которые в API телеграма описаны возможно использовать через zennoposter. Естественно, данный шаблон тут размещен в качестве примера, под канал и парсинг инфы надо менять некоторые моменты.
 
  • Спасибо
Реакции: Porosenok

Nikitos

Client
Регистрация
15.09.2016
Сообщения
46
Благодарностей
6
Баллы
8
Скажите, а подобным образом можно создать канал и сбрасывать инфу туда? Допустим стоит шаблон по расписанию и раз в 30 минут парсит значение N с сайта. Когда N становится меньше или больше какого-то числа, чтобы это в канале телеграма появлялось?
У меня все ошибки из всех проектов в телеграм приходят, и не только ошибки
 
  • Спасибо
Реакции: Sunny Friday

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 208
Благодарностей
77
Баллы
48
Начал изучать тему. Подскажите, а можно заставить бота постить в приватный канал, а не в публичный?
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
442
Баллы
63

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 208
Благодарностей
77
Баллы
48
Да спасибо, уже сам нагуглил и разобрался) Оказывается все очень легко реализуется. Но сама идея - бомба
 
  • Спасибо
Реакции: VerBin

vierasen

Client
Регистрация
10.12.2015
Сообщения
537
Благодарностей
265
Баллы
63
Сложностей с апи телеграма никаких, я когда писал проект, единственное над чем ломал голову, это над созданием красивых клавиатур для пользователя
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)