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

  • Автор темы Автор темы Karamzin
  • Дата начала Дата начала

Karamzin

Client
Регистрация
24.05.2016
Сообщения
213
Реакции
432
Баллы
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\
 
Номер конкурса статей
  1. Седьмой конкурс статей
Тема статьи
  1. Другое
Последнее редактирование:
Очень полезно, респектос) может уже спалишь(не в целях рекламы) , что за тренинг проходил?
 
  • Спасибо
Реакции: Karamzin
Управляю Зеннкой через RDC с телефона, очень удобно, хоть редактируй шаблон.
Но так- для размышлений - очень интересно, много идей
 
  • Спасибо
Реакции: Karamzin
Интересно , хоть и поднимали подобные темы.Но общий код , думаю будет полезен многим :bi:
 
  • Спасибо
Реакции: Karamzin
мне нравится, но было бы вообще прекрасно и вообще замечательно, если бы весь код комментировался
 
  • Спасибо
Реакции: Karamzin
Очень полезно, респектос) может уже спалишь(не в целях рекламы) , что за тренинг проходил?
Пузата
мне нравится, но было бы вообще прекрасно и вообще замечательно, если бы весь код комментировался
Так я, вроде, все откомментировал.
 
Так я, вроде, все откомментировал.
ты например пишешь - В общий код запихиваем:бла бла бла
но это бла бла бла без комментариев, я ж не говорю, что оно работать не будет, я сказал, что было бы вообще замечательно, если бы каждый этап В КОДЕ был закоментирован
кое-где комментарии есть, но кое-где нет
в си шарпе я пока не такой уж и проф и мне было бы удобно всё с комментами смотреть, так просто - на заметку (и как для себя на будущее напоминание)
 
Последнее редактирование:
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
 
Обновил статью. Добавил выполнение команд зеннопостером.
 

Вложения

  • Спасибо
Реакции: barkasian и Geograph
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
Не знаю.
было бы круто добавить клавиатуру , допустим ,что бы был выбор узнать сколько выполнено и сколь готово
Ни чего не понял
 
Спасибо за статью
 
Последнее редактирование модератором:
А как то можно собрать IDшники чатов телеги и потом собрать их юзеров по апи?
Была в прошлом конкурсе статья про то, как подключить Зенку к эмулятору андроида и управлять любым приложением на уровне вызовов элементов экрана. Это можно и с Телеграммой сделать
 
Добавил заключение в первый пост.

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

Вложения

  • Спасибо
Реакции: gelu4 и Geograph
@Karamzin
Ни чего не понял
@instacash наверное, хотел уточнить про использование
https://core.telegram.org/bots/api#replykeyboardmarkup
https://core.telegram.org/bots/api#inlinekeyboardmarkup
В шаблоне, чтобы запилить, что-то типо такого
d700580d40.png
 
Последнее редактирование:
@Karamzin

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

Эта вкладка уже давно обзавелась еще одной кнопкой :-)
gmvR3Egi6Xz3ma.png

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

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