- Регистрация
- 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;
}
}
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.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование: