Контролируем работу Zennoposter'а через мобильный телефон

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Вижу, что здесь многим интересны взаимодействие Зеннопостера с различными сервисами. Понимаю, мне самому это дико интересно. В результате выложенная сегодня статья одного из участников конкурса, натолкнула меня на мысль написать этот маааааленький, но очень полезный шаблон.


Для начала создадим бота Telegramm:
В телеграмме находим бота @BotFather. Заходим к нему в чат. Вызываем команду /start
Далее /newbot
Теперь набираем имя бота. После чего зачем-то снова еще одно имя бота, которое должно заканчиваться на bot или Bot


Теперь обязательно надо написать боту любое сообщение. Далее нам надо определить ID чата.
Открываем в браузере ссылку:
https://api.telegram.org/bot374964613:AAEEzn_JNZAigRvnVsbj5vXJUw0RqpyqiHA/getUpdates
374964613:AAEEzn_JNZAigRvnVsbj5vXJUw0RqpyqiHA - наш токен из чата от @BotFather

Нам нужен ID чата:


Собственно все! Бот готов. Теперь через зеннопостер нам надо отсылать запрос:
https://api.telegram.org/bot374964613:AAEEzn_JNZAigRvnVsbj5vXJUw0RqpyqiHA/sendMessage?chat_id=282881994&text=Hello,world!

374964613:AAEEzn_JNZAigRvnVsbj5vXJUw0RqpyqiHA - наш токен
282881994 - ID чата
Hello,world! - сообщение

Переходим к написанию шаблона:
PHP:
string strToken = project.Variables["cfg_token"].Value; //помещаем токен из переменной уровня проекта в переменную strToken уровня снипета
string strChatId = project.Variables["cfg_chat_id"].Value; //аналогично с ID чата
string strMsg = project.Variables["cfg_msg"].Value; // наше сообщение

//Формирование строки запроса
string strUrl = String.Format("https://api.telegram.org/bot{0}/sendMessage?chat_id={1}&text={2}", strToken, strChatId, strMsg);

//Сам запрос
string strGet = ZennoPoster.HttpGet(strUrl, "utf-8", respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody);
Я даже не знаю, что тут особо комментировать. Т.к. из моей предыдущей статьи здесь все должно быть предельно понятно.

Get-запрос:
string strGet = ZennoPoster.HttpGet(strUrl, "utf-8", respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody);

В переменную strGet вернется результат ответа.
Варианты получения ответа:

.HeaderOnly - только заголовок ответа Get-запроса
.BodyOnly - только тело ответа
.HeaderAndBody - заголовок и тело
.File - положить ответ в файл

string strGet = ZennoPoster.HttpGet(strUrl, "", "utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File, 5000, DownloadPath: project.Path);

Давайте теперь сделаем более продвинутое логирование.
И одной строкой будем сразу выводить данные в лог Зеннопостера, сохранять в файл и отправлять в телеграмм.


Добавим директивы и общий код:


В общий код запихиваем:
PHP:
        public static void loger(string msgLog, Boolean tele, Boolean info, Boolean logfile, IZennoPosterProjectModel project) {
            IZennoList log = project.Lists["log"];
      
            if(logfile&&Convert.ToBoolean(project.Variables["cfg_blnLog_txt"].Value))
            {
                lock(SyncObjects.ListSyncer){
                    log.Add(DateTime.Now.ToShortTimeString() + " " + msgLog);
                }
            }
      
            if(info&&Convert.ToBoolean(project.Variables["cfg_blnLog_zp"].Value))
            {
                project.SendInfoToLog(msgLog, true);
            }
      
            if(tele&&Convert.ToBoolean(project.Variables["cfg_blnLog_telegramm"].Value))
            {
                string strToken = project.Variables["cfg_token"].Value;
                string strChatId = project.Variables["cfg_chat_id"].Value;
                string strMsg = project.Variables["cfg_msg"].Value;

                string strUrl = String.Format("https://api.telegram.org/bot{0}/sendMessage?chat_id={1}&text={2}", strToken, strChatId, strMsg);
                string strGet = ZennoPoster.HttpGet(strUrl, "utf-8", respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody);
            }
        }
Теперь мы можем логировать все и вся одной строкой:
PHP:
string strMsg = project.Variables["cfg_msg"].Value; //наше сообщение из настроек проекта
CommonCode.loger(strMsg, true, true, true, project);
strMsg - наше сообщение. Берем его откуда угодно. Из снипета, результатов работы шаблона, переменных.

CommonCode.loger(strMsg, true, true, true, project);

Перегрузки true/false - это включение/отключение вида логирования:

//Первая перегрузка: true - отправлять логи в Telegramm, false - не отправлять
//Вторая перегрузка: true - отправлять логи в Zennoposter, false - не отправлять
//Третья перегрузка: true - отправлять логи в текстовый файл log.txt, false - не отправлять


В общем коде:
if(logfile&&Convert.ToBoolean(project.Variables["cfg_blnLog_txt"].Value))

logfile&&Convert.ToBoolean... && - означает что условие выполнится только, если верны оба условия.
Т.е. когда у нас при вызове метода мы указали true и настройках проекта у нас тоже true.

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


Пожинаем плоды:

Сообщения будут приходить либо на Рабочий стол ПК, либо в телефон.

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

Давайте сделаем выполнение команд Зеннопостером, которые он получает из телефона:


Снипет в цикле опрашивает телеграм на предмет заданий. Как только появляется задание, он его выполняет. Если появляется задание break - цикл завершается.

PHP:
string strToken = project.Variables["cfg_token"].Value; //помещаем токен из переменной уровня проекта в переменную strToken уровня снипета
string strChatId = project.Variables["cfg_chat_id"].Value; //аналогично с ID чата
string strMsg = project.Variables["cfg_msg"].Value; // наше сообщение
int intIdMsgOld = 0;
Tab tab = instance.ActiveTab;

while(true){
    string strUrl = String.Format("https://api.telegram.org/bot{0}/getUpdates", strToken);
    //Сам запрос
    string strGet = ZennoPoster.HttpGet(strUrl, "", "utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);

    JObject objParsedJson = JObject.Parse(strGet); //создаем объект Json
    IEnumerable<JToken> jTokens = objParsedJson.SelectTokens("result[*]", false); //получаем коллекцию токенов (элементов)
    int intTokens = jTokens.Count()-1; //определяем количество токенов находящихся в result[]
    //и берем последний токен
    string textNew = (string)objParsedJson.SelectToken("result["+intTokens+"].message.text");
    int intIdMsg = (int)objParsedJson.SelectToken("result["+intTokens+"].update_id");

    project.SendInfoToLog(Convert.ToString(intIdMsg));
    if(textNew=="break"){
        break;
    }
    if(intIdMsg!=intIdMsgOld){
        project.SendInfoToLog(textNew);

        tab.Navigate("https://yandex.ru/search/?text="+textNew);
        tab.WaitDownloading();
   
        Thread.Sleep(2000);
        intIdMsgOld=intIdMsg;
    }
}
Посылаем запрос телеграму и кладем его ответ в переменную strGet
string strGet = ZennoPoster.HttpGet(strUrl, "", "utf-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly);


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

JObject objParsedJson = JObject.Parse(strGet); //создаем объект Json
IEnumerable<JToken> jTokens = objParsedJson.SelectTokens("result[*]", false); //получаем коллекцию токенов (элементов)

https://jsonformatter.curiousconcept.com/

int intTokens = jTokens.Count()-1; //определяем количество токенов находящихся в result[]
И берем последний токен
string textNew = (string)objParsedJson.SelectToken("result["+intTokens+"].message.text");
(string)
- приводим полученные данные к строковому типу

result["+intTokens+"].message.text - это всё путь до нужного токена, в котором лежит сообщение (см. картинку выше)

Получаем update_id чтобы потом сравнивать после каждого запроса и определять мы уже выполняли это задание или нет
int intIdMsg = (int)objParsedJson.SelectToken("result["+intTokens+"].update_id");

if(textNew=="break"){
break;
}

если у нас в сообщении будет слово break, то выполнится команда break; - что означает завершение бесконечного цикла

Следующую проверку сделал, чтобы снипет на выполнял одну и туже команду бесконечно. Т.е. если новое значение intIdMsg не совпадает со старым intIdMsgOld, то выполняем задание.
if(intIdMsg!=intIdMsgOld)

project.SendInfoToLog(textNew);
- выводим в лог зеннопостера наше задание


intIdMsgOld=intIdMsg; - после выполнения задания присваиваем переменной intIdMsgOld значение intIdMsg , т.е. следующие update_id мы будем сравнивать именно с этим значением.

Снипет, который нужен всем.

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

Создаем кружок BadEnd и от него ведем стрелочку к новому снипету:
Код:
LastError error = project.GetLastError();
if(error != null){
    string tmp = string.Format("ActionComment: {0}.\r\nActionGroupId: {1}.\r\nActionId: {2}", error.ActionComment, error.ActionGroupId, error.ActionId);
   
    CommonCode.loger(tmp, true, true, true, project);
}


PS Не забудьте добавить библиотеку Newtonsoft.Json.dll в Progs\ExternalAssemblies\
 
Тема статьи
Другое
Номер конкурса статей
Седьмой конкурс статей

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

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

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

djjurok

Client
Регистрация
11.09.2016
Сообщения
3
Благодарностей
5
Баллы
3
Очень полезно, респектос) может уже спалишь(не в целях рекламы) , что за тренинг проходил?
 
  • Спасибо
Реакции: Karamzin

Nord

Client
Регистрация
22.03.2012
Сообщения
2 406
Благодарностей
1 473
Баллы
113
Управляю Зеннкой через RDC с телефона, очень удобно, хоть редактируй шаблон.
Но так- для размышлений - очень интересно, много идей
 
  • Спасибо
Реакции: Karamzin

instacash

Client
Регистрация
22.12.2016
Сообщения
61
Благодарностей
4
Баллы
8
Интересно , хоть и поднимали подобные темы.Но общий код , думаю будет полезен многим :bi:
 
  • Спасибо
Реакции: Karamzin

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
мне нравится, но было бы вообще прекрасно и вообще замечательно, если бы весь код комментировался
 
  • Спасибо
Реакции: Karamzin

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Очень полезно, респектос) может уже спалишь(не в целях рекламы) , что за тренинг проходил?
Пузата
мне нравится, но было бы вообще прекрасно и вообще замечательно, если бы весь код комментировался
Так я, вроде, все откомментировал.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Так я, вроде, все откомментировал.
ты например пишешь - В общий код запихиваем:бла бла бла
но это бла бла бла без комментариев, я ж не говорю, что оно работать не будет, я сказал, что было бы вообще замечательно, если бы каждый этап В КОДЕ был закоментирован
кое-где комментарии есть, но кое-где нет
в си шарпе я пока не такой уж и проф и мне было бы удобно всё с комментами смотреть, так просто - на заметку (и как для себя на будущее напоминание)
 

Борат Сагдиев

Пользователь
Регистрация
09.05.2017
Сообщения
61
Благодарностей
36
Баллы
8

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

Так была же телега вроде ?
 
  • Спасибо
Реакции: Karamzin

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Последнее редактирование:

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 657
Благодарностей
656
Баллы
113
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
 

instacash

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

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Обновил статью. Добавил выполнение команд зеннопостером.
 

Вложения

  • Спасибо
Реакции: barkasian и Geograph

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
Не знаю.
было бы круто добавить клавиатуру , допустим ,что бы был выбор узнать сколько выполнено и сколь готово
Ни чего не понял
 

Geograph

Client
Регистрация
16.02.2014
Сообщения
209
Благодарностей
114
Баллы
43
Спасибо за статью
 
Последнее редактирование модератором:

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
Была в прошлом конкурсе статья про то, как подключить Зенку к эмулятору андроида и управлять любым приложением на уровне вызовов элементов экрана. Это можно и с Телеграммой сделать
 

DenisK

Client
Регистрация
28.06.2016
Сообщения
591
Благодарностей
289
Баллы
63

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Добавил заключение в первый пост.

Форум жестко тупит. Все время капча лезет, и обновить пост не дает нормально. Постоянно ошибки. Шаблон из первого поста потерялся и не могу туда добавить...
 

Вложения

  • Спасибо
Реакции: gelu4 и Geograph

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
Последнее редактирование:

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
@Karamzin

@instacash наверное, хотел уточнить про использование
https://core.telegram.org/bots/api#replykeyboardmarkup
https://core.telegram.org/bots/api#inlinekeyboardmarkup
В шаблоне, чтобы запилить, что-то типо такого
а откуда скрин? Это реальный какой-то бот можно сделать с подобным функционалом? Как?
 

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
а откуда скрин? Это реальный какой-то бот можно сделать с подобным функционалом? Как?
Да была тема на складчике с аналогичным ботом. Как делать, у ZennoPoster есть свой API, используя его можно реализовывать подобные фишки.
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
читал, но там нету как именно сделать взаимодействие зенно - телеграм, чтобы стопать и запускать шабы, делать количество попыток и тд
Наверное тут нужно АПИ о котором выше написали, но как там его юзать хз
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
зачем так сложно :-)
когда можно все делать через teamviewer
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48

ZHAG

Client
Регистрация
01.05.2014
Сообщения
228
Благодарностей
220
Баллы
43
В шаблоне, чтобы запилить, что-то типо такого
Эта вкладка уже давно обзавелась еще одной кнопкой :-)

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

Zzom

Client
Регистрация
23.05.2016
Сообщения
238
Благодарностей
66
Баллы
28
Подсказал бы кто, как через апи юзеров парсить, было бы неплохо.
 
  • Спасибо
Реакции: Valiksim

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

Advert31337

Client
Регистрация
18.12.2016
Сообщения
53
Благодарностей
38
Баллы
18

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

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