- Регистрация
- 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! - сообщение
Переходим к написанию шаблона:
Я даже не знаю, что тут особо комментировать. Т.к. из моей предыдущей статьи здесь все должно быть предельно понятно.
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);
Давайте теперь сделаем более продвинутое логирование.
И одной строкой будем сразу выводить данные в лог Зеннопостера, сохранять в файл и отправлять в телеграмм.

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


В общий код запихиваем:
Теперь мы можем логировать все и вся одной строкой:
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 - цикл завершается.
Посылаем запрос телеграму и кладем его ответ в переменную 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 и от него ведем стрелочку к новому снипету:

PS Не забудьте добавить библиотеку Newtonsoft.Json.dll в Progs\ExternalAssemblies\

Для начала создадим бота 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);
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\
- Номер конкурса статей
- Седьмой конкурс статей
- Тема статьи
- Другое
Последнее редактирование:






