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

Karamzin

Client
Joined
May 24, 2016
Messages
213
Reaction score
432
Points
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 и от него ведем стрелочку к новому снипету:
Code:
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.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

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

Last edited:

djjurok

Client
Joined
Sep 11, 2016
Messages
3
Reaction score
5
Points
3
Очень полезно, респектос) может уже спалишь(не в целях рекламы) , что за тренинг проходил?
 
  • Thank you
Reactions: Karamzin

Nord

Client
Joined
Mar 22, 2012
Messages
2,418
Reaction score
1,484
Points
113
Управляю Зеннкой через RDC с телефона, очень удобно, хоть редактируй шаблон.
Но так- для размышлений - очень интересно, много идей
 
  • Thank you
Reactions: Karamzin

instacash

Client
Joined
Dec 22, 2016
Messages
61
Reaction score
4
Points
8
Интересно , хоть и поднимали подобные темы.Но общий код , думаю будет полезен многим :bi:
 
  • Thank you
Reactions: Karamzin

arhip1985

Client
Joined
Oct 31, 2011
Messages
2,995
Reaction score
789
Points
113
мне нравится, но было бы вообще прекрасно и вообще замечательно, если бы весь код комментировался
 
  • Thank you
Reactions: Karamzin

Karamzin

Client
Joined
May 24, 2016
Messages
213
Reaction score
432
Points
63
Очень полезно, респектос) может уже спалишь(не в целях рекламы) , что за тренинг проходил?
Пузата
мне нравится, но было бы вообще прекрасно и вообще замечательно, если бы весь код комментировался
Так я, вроде, все откомментировал.
 

arhip1985

Client
Joined
Oct 31, 2011
Messages
2,995
Reaction score
789
Points
113
Так я, вроде, все откомментировал.
ты например пишешь - В общий код запихиваем:бла бла бла
но это бла бла бла без комментариев, я ж не говорю, что оно работать не будет, я сказал, что было бы вообще замечательно, если бы каждый этап В КОДЕ был закоментирован
кое-где комментарии есть, но кое-где нет
в си шарпе я пока не такой уж и проф и мне было бы удобно всё с комментами смотреть, так просто - на заметку (и как для себя на будущее напоминание)
 

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

Пользователь
Joined
May 9, 2017
Messages
61
Reaction score
36
Points
8

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

Так была же телега вроде ?
 
  • Thank you
Reactions: Karamzin

Karamzin

Client
Joined
May 24, 2016
Messages
213
Reaction score
432
Points
63
Last edited:

Roman*

Client
Joined
Sep 25, 2013
Messages
1,658
Reaction score
656
Points
113
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
 

instacash

Client
Joined
Dec 22, 2016
Messages
61
Reaction score
4
Points
8
Точно. Нашел статью. Несколько отличается. Но про тоже...

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

Karamzin

Client
Joined
May 24, 2016
Messages
213
Reaction score
432
Points
63
Обновил статью. Добавил выполнение команд зеннопостером.
 

Attachments

Karamzin

Client
Joined
May 24, 2016
Messages
213
Reaction score
432
Points
63
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
Не знаю.
было бы круто добавить клавиатуру , допустим ,что бы был выбор узнать сколько выполнено и сколь готово
Ни чего не понял
 

Geograph

Client
Joined
Feb 16, 2014
Messages
207
Reaction score
114
Points
43
Спасибо за статью
 
Last edited by a moderator:

Nick

Client
Joined
Jul 22, 2014
Messages
1,987
Reaction score
819
Points
113
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
Была в прошлом конкурсе статья про то, как подключить Зенку к эмулятору андроида и управлять любым приложением на уровне вызовов элементов экрана. Это можно и с Телеграммой сделать
 

DenisK

Client
Joined
Jun 28, 2016
Messages
591
Reaction score
289
Points
63

Karamzin

Client
Joined
May 24, 2016
Messages
213
Reaction score
432
Points
63
Добавил заключение в первый пост.

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

Attachments

  • Thank you
Reactions: gelu4 and Geograph

Valiksim

Client
Joined
Apr 14, 2012
Messages
1,344
Reaction score
298
Points
83
Форум жестко тупит. Все время капча лезет, и обновить пост не дает нормально
Это просто он тебя не любит. Ищи, в чём согрешил? Может прокси пора сменить?
 

Sz5

Client
Joined
Dec 10, 2012
Messages
157
Reaction score
186
Points
43
Last edited:

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48

Sz5

Client
Joined
Dec 10, 2012
Messages
157
Reaction score
186
Points
43
а откуда скрин? Это реальный какой-то бот можно сделать с подобным функционалом? Как?
Да была тема на складчике с аналогичным ботом. Как делать, у ZennoPoster есть свой API, используя его можно реализовывать подобные фишки.
 

Koqpe

Client
Joined
Dec 23, 2014
Messages
1,099
Reaction score
648
Points
113

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48
читал, но там нету как именно сделать взаимодействие зенно - телеграм, чтобы стопать и запускать шабы, делать количество попыток и тд
Наверное тут нужно АПИ о котором выше написали, но как там его юзать хз
 

backoff

Client
Joined
Apr 20, 2015
Messages
6,193
Reaction score
6,547
Points
113
зачем так сложно :-)
когда можно все делать через teamviewer
 

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,281
Reaction score
96
Points
48

ZHAG

Client
Joined
May 1, 2014
Messages
228
Reaction score
220
Points
43
В шаблоне, чтобы запилить, что-то типо такого
Эта вкладка уже давно обзавелась еще одной кнопкой :-)

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

Zzom

Client
Joined
May 23, 2016
Messages
238
Reaction score
66
Points
28
Подсказал бы кто, как через апи юзеров парсить, было бы неплохо.
 
  • Thank you
Reactions: Valiksim

Valiksim

Client
Joined
Apr 14, 2012
Messages
1,344
Reaction score
298
Points
83
Подсказал бы кто, как через апи юзеров парсить, было бы неплохо.
API была бы нужная вещь, если бы кто-то описал принципы работы
 

Advert31337

Client
Joined
Dec 18, 2016
Messages
53
Reaction score
38
Points
18

Valiksim

Client
Joined
Apr 14, 2012
Messages
1,344
Reaction score
298
Points
83
Пузата
Всё-таки, несмотря на много водички, много полезного всё-таки есть.
 

Users Who Are Viewing This Thread (Total: 2, Members: 0, Guests: 2)