Совершенствуем тему беттинга с помощью связки Zennoposter - Telegram.

vicos

Client
Регистрация
06.02.2017
Сообщения
89
Благодарностей
275
Баллы
53
Тема взаимодействия Zennoposter и Telegram поднималась неоднократно. Но как говориться нет пределу совершенства.
Ни для кого не секрет, что телеграмм сейчас кишит всевозможными каналами связанными со ставками на спорт: прогнозы, прогрузы, сигналы и т.д.

Тема беттинга настолько широкая, что не обошла стороной и зенку.
Разрабатывая для заказчика бот по сигналам на теннис, была поставлена конкретная задача - менять входные настройки парсеров по ставкам НЕ ОСТАНАВЛИВАЯ их и выдавать сигналы в Telegram.
Суть в том, что заказчик хотел тестировать свои стратегии на теннис, постоянно меняя входные настройки и получать соответствующие сигналы.

Углубляться в их методику не буду - это отдельная тема и они об этом лучше расскажут.
Решение было найдено в связке Zennoposter-Telegram. Фишку с изменением настроек с помощью Telegram можно применять в ЛЮБОМ другом шаблоне где есть такая потребность. К статье прикладываю два бота. Парсер по ставкам конечно же не буду выкладывать. Сами понимаете это не ко мне - я лишь исполнитель.

Теперь собственно мое решение.

1.
Первый бот написан на C#. Это не большой и достаточно простой сниппет. Новичкам будет полезно использовать код в своих шаблонах.

Алгоритм также не сложный. Берем кубик, написанный мной, вставляем в свой уже рабочий, либо разрабатываемый шаблон.
Меняем в нем названия переменных и списков. В директории проекта создаем папку. Вот собственно и вся доработка.
Вот так выглядит бот.

рабочий бот.jpg


Вот так выглядит сам код.
C#:
//проверяем наличие файлов
var dir=new DirectoryInfo(project.Directory + @"\bet_example_files");// папка с файлами
var files = project.Lists["files"]; // список для имен файлов
foreach (FileInfo file in dir.GetFiles()) // извлекаем все файлы и ложим в список
{
    files.Add(file.FullName); // получаем полный путь к файлу и ложим в список
}

//получаем количество строк в списке файлов
project.Variables["number_files"].Value = project.Lists["files"].Count.ToString();

//проверяем пустой список или нет. Если пустой создаем файлы и вносим данные
if (project.Variables["number_files"].Value == string.Empty)
    {
File.Create(project.Directory + "\\bet_example_files/koef_max.txt");
File.Create(project.Directory + "\\bet_example_files/koef_min.txt");
File.Create(project.Directory + "\\bet_example_files/filter.txt");
        //чистим список "koef_min"
var koefminlist = project.Lists["koef_min"]; // список проекта
    for (int i = 0; i < koefminlist.Count; i++)
    {
        koefminlist.RemoveAt(i); i--;
    }
//переносим в список "koef_min" переменную из настроек
    var koef_min = project.Variables["koef_min"].Value;
    koefminlist.Add(koef_min);

//чистим список "koef_max"
var koefmaxlist = project.Lists["koef_max"]; // список проекта
    for (int i = 0; i < koefmaxlist.Count; i++)
    {
        koefmaxlist.RemoveAt(i); i--;
    }
//переносим в список "koef_max" переменную из настроек
    var koef_max = project.Variables["koef_max"].Value;
    koefmaxlist.Add(koef_max);
 

    //чистим список "filter"
var filterlist = project.Lists["filter"]; // список проекта
    for (int i = 0; i < filterlist.Count; i++)
    {
        filterlist.RemoveAt(i); i--;
    }
//переносим в список "filter" переменную из настроек
    var filter = project.Variables["filter"].Value;
    filterlist.Add(filter);
    }

 
    //Если файлы есть то просто записываем данные в них
else
{
//чистим список "koef_min"
var koefminlist = project.Lists["koef_min"]; // список проекта
    for (int i = 0; i < koefminlist.Count; i++)
    {
        koefminlist.RemoveAt(i); i--;
    }
//переносим в список "koef_min" переменную из настроек
    var koef_min = project.Variables["koef_min"].Value;
    koefminlist.Add(koef_min);

//чистим список "koef_max"
var koefmaxlist = project.Lists["koef_max"]; // список проекта
    for (int i = 0; i < koefmaxlist.Count; i++)
    {
        koefmaxlist.RemoveAt(i); i--;
    }
//переносим в список "koef_max" переменную из настроек
    var koef_max = project.Variables["koef_max"].Value;
    koefmaxlist.Add(koef_max);
 

    //чистим список "filter"
var filterlist = project.Lists["filter"]; // список проекта
    for (int i = 0; i < filterlist.Count; i++)
    {
        filterlist.RemoveAt(i); i--;
    }
//переносим в список "filter" переменную из настроек
    var filter = project.Variables["filter"].Value;
    filterlist.Add(filter);
}
Бот проверяет наличие списков в директории(создавать самому не обязательно, но прописать путь в самом шаблоне все же надо).
Если их там нет, то бот создает и записывает в них первоначальные данные настроек.
Поскольку основной бот будет работать с переменными через списки, чтобы не путаться названия переменных в настройках и названия списков лучше сделать одинаковыми.

Кубик должен стоять в том месте, где Ваш бот обращается в цикле к входящим настройкам.
И да важный момент, ставьте BadEnd в том же месте где воткнули кубик иначе когда бот слетит то подтянет настройки которые были при запуске.

Кстати, если кому будет интересно, дам сниппет для вывода в телеграм как вывести ошибки с названием бота и кодом ID.
Актуально тем у кого на сервере одновременно работает 20-30 ботов. Вот собственно и все. Теперь Вы даже без телеграм бота можете заходить в директорию и менять в файлах данные не прерывая работу бота. Но так было бы не интересно.

2. И вот тут нам на помощь приходит Telegram.
Вы берете мой бот прописываете те же переменные и списки что и в предыдущем боте.
И вуаля, смартфон Вашего заказчика превращается в пульт от телевизора.

46417


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

46420


Писал частично на стандартных кубиках Zennoposter и C#. Сниппеты не стал писать одним кубиком, чтобы был понятен алгоритм.

Итак к телеграму.
На форумах, да и в конкурсных статьях неоднократно писалось как создать телеграм бот и где вытащить токен и chatID.
Особо углубляться не буду, если кто не найдет, в комментариях дам ссылку или расскажу как это сделать.
Итак у Вас есть токен и ID чата.
Пишем свои клавиатуры.
Основная
Код:
&reply_markup=
{"keyboard": [["Текущие настройки"],["Коэффициент мин", "Коэффициент макс"],
["Фильтр Включить", "Фильтр Выключить"]],
"one_time_keyboard": true,"resize_keyboard": true}
И inline_keyboard которая будет приходить с ответом на Ваш запрос

Код:
&reply_markup=
{"inline_keyboard": [[{"text": "1.6","callback_data": "16"},{"text": "1.7","callback_data": "17"},
{"text": "1.8","callback_data": "18"},{"text": "1.9","callback_data": "19"}],
[{"text": "Свой вариант","callback_data": "21"}]]}
"text" - это то что появиться на экране Вашего бота
"callback_data" - это могут быть цифры либо названия, которые телеграм вернет в наш бот и обработчики сделают то, что Вы просите.

Меняете текст под свои потребности. Количество кнопок тоже. Можно добавить какие-нибудь emoji, чтобы заказчику было приятнее. В настройках только токен и chat_id. Плюс пауза запросов. Какую паузу решать Вам с заказчиком - насколько долго он готов ждать отклика телеграм бота.

И так, поехали.
Бот с периодичностью указанной в настройках отправляет api запрос и проверяет наличие обновлений.
Как только Вы нажали кнопку в телеграм боте, наш бот поймает обновление и начнет его обрабатывать.
Регулярками вытаскиваем все что нам надо для работы. Декодируем текст и дальше действуем согласно полученной команды.
Если пришла команда Текущие настройки, бот заходит в файлы и вытаскивает данные которые положил наш рабочий бот(см. выше).

Затем передает их обратно в телеграмм, заодно очищая список запросов.
Очистка запросов в телеграме происходит путем добавления 1 к последнему полученному ID сообщения.
Если пришла команда изменить параметр, действия те же, только теперь бот заходит в список, чистит его, добавляет новый параметр и возвращает назад в телеграм бот. Ну вот собственно и все.

В кубиках старался максимально прописать что к чему, не перегружая их, чтобы было понятно и новичку.

3. Ну и несколько полезных сниппетов C# из бота в Вашу коллекцию.
GET запрос

C#:
//делаем запрос обновлений
string url = "https://api.telegram.org/bot"+project.Variables["bot_token"].Value+"/getUpdates?offset="+project.Variables["last_ID"].Value+"";
var response = ZennoPoster.HttpGet(url);
return response;
Switch - чтобы избежать паутины и путаницы
C#:
switch (project.Variables["decode_text"].Value)
{
  
//+++++++++++++++++++++Основные кнопки++++++++++++++++++++++

     case "Текущие настройки":
        //получаем из списка "koef_min" и ложим в переменную koef
        var koefminList = project.Lists["koef_min"];
        string koef_min = koefminList[0];
      
        //получаем из списка "koef_max" и ложим в переменную bet
        var koefmaxList = project.Lists["koef_max"];
        string koef_max = koefmaxList[0];
                  
        //получаем из списка "filter" и ложим в переменную filter
        var filterList = project.Lists["filter"];
        string filter = filterList[0];
        return "Коэффициент мин:  " + koef_min + "\n" + "Коэффициент макс: " + koef_max    + "\n"    +"Фильтр: " + filter;

        break;
      
            
      
      
    default:
    
        throw new Exception("Выход по ошибке");
}
Декодер текста
C#:
var str = @""+project.Variables["text"].Value+"";
str = Regex.Replace(str, @"\\u([\da-f]{4})", m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString());
return str;
Проверка на ошибку ввода букв вместо цифры
C#:
var str = project.Variables["decode_text"].Value;
if (Regex.Match(str, @"\d").Success)
{
    //Содержит цифру, выход по зеленой
    return true;
}
else
{
    //Не содержит цифру, выход по красной
    throw new Exception();
}
Очистка списка и ввод нового значения
C#:
//чистим переменные и добавляем новые
string decode_text = project.Variables["decode_text"].Value;

string own_message = project.Variables["own_message"].Value;
if(own_message == "21")
    {
        //чистим список "koef_min"
var koefminlist = project.Lists["koef_min"]; // список проекта
    for (int i = 0; i < koefminlist.Count; i++)
    {
        koefminlist.RemoveAt(i); i--;
    }
    //добавляем новое значение
        koefminlist.Add(decode_text);
        return "Минимальный коэффициент изменен. Текущий: " + decode_text;
              
    }

//проверяем введенное значение на условие больше
if(own_message == "31")
    {
        //чистим список "koef_max"
var koefmaxlist = project.Lists["koef_max"]; // список проекта
    for (int i = 0; i < koefmaxlist.Count; i++)
    {
        koefmaxlist.RemoveAt(i); i--;
    }
    //добавляем новое значение
        koefmaxlist.Add(decode_text);
        return "Максимальный коэффициент изменен. Текущий: " + decode_text;
    }
  

  
else
    {
        throw new Exception("Выход");
    }
Ну вот собственно и все.

С помощью такой связки, мой заказчик получил очень удобный механизм управления сигналами на спорт и довольно успешно продвигает свой проект по беттингу.

Будут пожелания продолжить тематику пишите в комментарии.
И да пребудет с Вами удача.
 
Тема статьи
Другое
Номер конкурса статей
Двенадцатый конкурс статей

Вложения

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

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

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

Sanekk

Client
Регистрация
24.06.2016
Сообщения
999
Благодарностей
390
Баллы
63
ТС + в карму))) давно хотел подобное сделать, но времени как обычно не хватает)
 

DenisK

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

vicos

Client
Регистрация
06.02.2017
Сообщения
89
Благодарностей
275
Баллы
53
Да время для нас важный фактор. А такие фишки намного упрощают работу.
 
  • Спасибо
Реакции: tanichev

vicos

Client
Регистрация
06.02.2017
Сообщения
89
Благодарностей
275
Баллы
53
Пожалуйста.
 

vasyaya

Client
Регистрация
09.02.2015
Сообщения
555
Благодарностей
35
Баллы
28
Крутая статья! спасибо. Есть один вопрос, если ботом будут пользоваться несколько человек, разумеется каждый пользователь будет вводит свои данные (мин кф, макс кф) ? Получается под каждого человека нужно отдельного бота делать?
 

vicos

Client
Регистрация
06.02.2017
Сообщения
89
Благодарностей
275
Баллы
53
Не совсем понятна логика работы и взаимодействия пользователей. Если один бот на всех, то каким образом они согласовывать будут что менять? Как правило админ это делает и управляет процессом. Если 5 человек смотрят телевизор, то пульт должен быть у одного. Я так понимаю.
 
  • Спасибо
Реакции: vasyaya

vasyaya

Client
Регистрация
09.02.2015
Сообщения
555
Благодарностей
35
Баллы
28
Не совсем понятна логика работы и взаимодействия пользователей. Если один бот на всех, то каким образом они согласовывать будут что менять? Как правило админ это делает и управляет процессом. Если 5 человек смотрят телевизор, то пульт должен быть у одного. Я так понимаю.
Я понял) буду реализовывать у себя твою тему, ещё раз спасибо!
 

intagens

Client
Регистрация
28.09.2015
Сообщения
209
Благодарностей
31
Баллы
28
телеграм вернет в наш бот и обработчики сделают то, что Вы просите.
@vicos можешь чуть продробнее описать как происходит обработка ответа ...

я, вроде как, понимаю, что это происходит в этом кубике
55626
но не совсем ясно как данные попадают в project.Variables["decode_text"].Value и в "callback_data", если выше по коду они не встречаются

и еще вопрос ... вот в этих кубиках результат кладется в одну и ту же переменную, хотя кубики идут один за другим и с этой переменной никаких действий, в этих кубиках, больше не производится
55627
 

Вложения

intagens

Client
Регистрация
28.09.2015
Сообщения
209
Благодарностей
31
Баллы
28
разобрался)
 

Rahul0076

Новичок
Регистрация
07.10.2020
Сообщения
3
Благодарностей
0
Баллы
1
Sir create a project for controlling zennoposter from telegram bot.
Would like that thread too.
 

dedmoroz1987

Client
Регистрация
05.09.2015
Сообщения
59
Благодарностей
4
Баллы
8
Не пойму как получить последний ID этот в чистом чате /getUpdates?offset="+project.Variables["last_ID"].Value+"";
 
Регистрация
23.02.2021
Сообщения
2
Благодарностей
0
Баллы
1
Тема взаимодействия Zennoposter и Telegram поднималась неоднократно. Но как говориться нет пределу совершенства.
Ни для кого не секрет, что телеграмм сейчас кишит всевозможными каналами связанными со ставками на спорт: прогнозы, прогрузы, сигналы и т.д.

Тема беттинга настолько широкая, что не обошла стороной и зенку.
Разрабатывая для заказчика бот по сигналам на теннис, была поставлена конкретная задача - менять входные настройки парсеров по ставкам НЕ ОСТАНАВЛИВАЯ их и выдавать сигналы в Telegram.
Суть в том, что заказчик хотел тестировать свои стратегии на теннис, постоянно меняя входные настройки и получать соответствующие сигналы.

Углубляться в их методику не буду - это отдельная тема и они об этом лучше расскажут.
Решение было найдено в связке Zennoposter-Telegram. Фишку с изменением настроек с помощью Telegram можно применять в ЛЮБОМ другом шаблоне где есть такая потребность. К статье прикладываю два бота. Парсер по ставкам конечно же не буду выкладывать. Сами понимаете это не ко мне - я лишь исполнитель.

Теперь собственно мое решение.

1.
Первый бот написан на C#. Это не большой и достаточно простой сниппет. Новичкам будет полезно использовать код в своих шаблонах.

Алгоритм также не сложный. Берем кубик, написанный мной, вставляем в свой уже рабочий, либо разрабатываемый шаблон.
Меняем в нем названия переменных и списков. В директории проекта создаем папку. Вот собственно и вся доработка.
Вот так выглядит бот.

Посмотреть вложение 46410

Вот так выглядит сам код.
C#:
//проверяем наличие файлов
var dir=new DirectoryInfo(project.Directory + @"\bet_example_files");// папка с файлами
var files = project.Lists["files"]; // список для имен файлов
foreach (FileInfo file in dir.GetFiles()) // извлекаем все файлы и ложим в список
{
    files.Add(file.FullName); // получаем полный путь к файлу и ложим в список
}

//получаем количество строк в списке файлов
project.Variables["number_files"].Value = project.Lists["files"].Count.ToString();

//проверяем пустой список или нет. Если пустой создаем файлы и вносим данные
if (project.Variables["number_files"].Value == string.Empty)
    {
File.Create(project.Directory + "\\bet_example_files/koef_max.txt");
File.Create(project.Directory + "\\bet_example_files/koef_min.txt");
File.Create(project.Directory + "\\bet_example_files/filter.txt");
        //чистим список "koef_min"
var koefminlist = project.Lists["koef_min"]; // список проекта
    for (int i = 0; i < koefminlist.Count; i++)
    {
        koefminlist.RemoveAt(i); i--;
    }
//переносим в список "koef_min" переменную из настроек
    var koef_min = project.Variables["koef_min"].Value;
    koefminlist.Add(koef_min);

//чистим список "koef_max"
var koefmaxlist = project.Lists["koef_max"]; // список проекта
    for (int i = 0; i < koefmaxlist.Count; i++)
    {
        koefmaxlist.RemoveAt(i); i--;
    }
//переносим в список "koef_max" переменную из настроек
    var koef_max = project.Variables["koef_max"].Value;
    koefmaxlist.Add(koef_max);


    //чистим список "filter"
var filterlist = project.Lists["filter"]; // список проекта
    for (int i = 0; i < filterlist.Count; i++)
    {
        filterlist.RemoveAt(i); i--;
    }
//переносим в список "filter" переменную из настроек
    var filter = project.Variables["filter"].Value;
    filterlist.Add(filter);
    }


    //Если файлы есть то просто записываем данные в них
else
{
//чистим список "koef_min"
var koefminlist = project.Lists["koef_min"]; // список проекта
    for (int i = 0; i < koefminlist.Count; i++)
    {
        koefminlist.RemoveAt(i); i--;
    }
//переносим в список "koef_min" переменную из настроек
    var koef_min = project.Variables["koef_min"].Value;
    koefminlist.Add(koef_min);

//чистим список "koef_max"
var koefmaxlist = project.Lists["koef_max"]; // список проекта
    for (int i = 0; i < koefmaxlist.Count; i++)
    {
        koefmaxlist.RemoveAt(i); i--;
    }
//переносим в список "koef_max" переменную из настроек
    var koef_max = project.Variables["koef_max"].Value;
    koefmaxlist.Add(koef_max);


    //чистим список "filter"
var filterlist = project.Lists["filter"]; // список проекта
    for (int i = 0; i < filterlist.Count; i++)
    {
        filterlist.RemoveAt(i); i--;
    }
//переносим в список "filter" переменную из настроек
    var filter = project.Variables["filter"].Value;
    filterlist.Add(filter);
}
Бот проверяет наличие списков в директории(создавать самому не обязательно, но прописать путь в самом шаблоне все же надо).
Если их там нет, то бот создает и записывает в них первоначальные данные настроек.
Поскольку основной бот будет работать с переменными через списки, чтобы не путаться названия переменных в настройках и названия списков лучше сделать одинаковыми.

Кубик должен стоять в том месте, где Ваш бот обращается в цикле к входящим настройкам.
И да важный момент, ставьте BadEnd в том же месте где воткнули кубик иначе когда бот слетит то подтянет настройки которые были при запуске.

Кстати, если кому будет интересно, дам сниппет для вывода в телеграм как вывести ошибки с названием бота и кодом ID.
Актуально тем у кого на сервере одновременно работает 20-30 ботов. Вот собственно и все. Теперь Вы даже без телеграм бота можете заходить в директорию и менять в файлах данные не прерывая работу бота. Но так было бы не интересно.

2. И вот тут нам на помощь приходит Telegram.
Вы берете мой бот прописываете те же переменные и списки что и в предыдущем боте.
И вуаля, смартфон Вашего заказчика превращается в пульт от телевизора.

Посмотреть вложение 46417

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

Посмотреть вложение 46420

Писал частично на стандартных кубиках Zennoposter и C#. Сниппеты не стал писать одним кубиком, чтобы был понятен алгоритм.

Итак к телеграму.
На форумах, да и в конкурсных статьях неоднократно писалось как создать телеграм бот и где вытащить токен и chatID.
Особо углубляться не буду, если кто не найдет, в комментариях дам ссылку или расскажу как это сделать.
Итак у Вас есть токен и ID чата.
Пишем свои клавиатуры.
Основная
Код:
&reply_markup=
{"keyboard": [["Текущие настройки"],["Коэффициент мин", "Коэффициент макс"],
["Фильтр Включить", "Фильтр Выключить"]],
"one_time_keyboard": true,"resize_keyboard": true}
И inline_keyboard которая будет приходить с ответом на Ваш запрос

Код:
&reply_markup=
{"inline_keyboard": [[{"text": "1.6","callback_data": "16"},{"text": "1.7","callback_data": "17"},
{"text": "1.8","callback_data": "18"},{"text": "1.9","callback_data": "19"}],
[{"text": "Свой вариант","callback_data": "21"}]]}
"text" - это то что появиться на экране Вашего бота
"callback_data" - это могут быть цифры либо названия, которые телеграм вернет в наш бот и обработчики сделают то, что Вы просите.

Меняете текст под свои потребности. Количество кнопок тоже. Можно добавить какие-нибудь emoji, чтобы заказчику было приятнее. В настройках только токен и chat_id. Плюс пауза запросов. Какую паузу решать Вам с заказчиком - насколько долго он готов ждать отклика телеграм бота.

И так, поехали.
Бот с периодичностью указанной в настройках отправляет api запрос и проверяет наличие обновлений.
Как только Вы нажали кнопку в телеграм боте, наш бот поймает обновление и начнет его обрабатывать.
Регулярками вытаскиваем все что нам надо для работы. Декодируем текст и дальше действуем согласно полученной команды.
Если пришла команда Текущие настройки, бот заходит в файлы и вытаскивает данные которые положил наш рабочий бот(см. выше).

Затем передает их обратно в телеграмм, заодно очищая список запросов.
Очистка запросов в телеграме происходит путем добавления 1 к последнему полученному ID сообщения.
Если пришла команда изменить параметр, действия те же, только теперь бот заходит в список, чистит его, добавляет новый параметр и возвращает назад в телеграм бот. Ну вот собственно и все.

В кубиках старался максимально прописать что к чему, не перегружая их, чтобы было понятно и новичку.

3. Ну и несколько полезных сниппетов C# из бота в Вашу коллекцию.
GET запрос

C#:
//делаем запрос обновлений
string url = "https://api.telegram.org/bot"+project.Variables["bot_token"].Value+"/getUpdates?offset="+project.Variables["last_ID"].Value+"";
var response = ZennoPoster.HttpGet(url);
return response;
Switch - чтобы избежать паутины и путаницы
C#:
switch (project.Variables["decode_text"].Value)
{
 
//+++++++++++++++++++++Основные кнопки++++++++++++++++++++++

     case "Текущие настройки":
        //получаем из списка "koef_min" и ложим в переменную koef
        var koefminList = project.Lists["koef_min"];
        string koef_min = koefminList[0];
     
        //получаем из списка "koef_max" и ложим в переменную bet
        var koefmaxList = project.Lists["koef_max"];
        string koef_max = koefmaxList[0];
                 
        //получаем из списка "filter" и ложим в переменную filter
        var filterList = project.Lists["filter"];
        string filter = filterList[0];
        return "Коэффициент мин:  " + koef_min + "\n" + "Коэффициент макс: " + koef_max    + "\n"    +"Фильтр: " + filter;

        break;
     
           
     
     
    default:
   
        throw new Exception("Выход по ошибке");
}
Декодер текста
C#:
var str = @""+project.Variables["text"].Value+"";
str = Regex.Replace(str, @"\\u([\da-f]{4})", m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString());
return str;
Проверка на ошибку ввода букв вместо цифры
C#:
var str = project.Variables["decode_text"].Value;
if (Regex.Match(str, @"\d").Success)
{
    //Содержит цифру, выход по зеленой
    return true;
}
else
{
    //Не содержит цифру, выход по красной
    throw new Exception();
}
Очистка списка и ввод нового значения
C#:
//чистим переменные и добавляем новые
string decode_text = project.Variables["decode_text"].Value;

string own_message = project.Variables["own_message"].Value;
if(own_message == "21")
    {
        //чистим список "koef_min"
var koefminlist = project.Lists["koef_min"]; // список проекта
    for (int i = 0; i < koefminlist.Count; i++)
    {
        koefminlist.RemoveAt(i); i--;
    }
    //добавляем новое значение
        koefminlist.Add(decode_text);
        return "Минимальный коэффициент изменен. Текущий: " + decode_text;
             
    }

//проверяем введенное значение на условие больше
if(own_message == "31")
    {
        //чистим список "koef_max"
var koefmaxlist = project.Lists["koef_max"]; // список проекта
    for (int i = 0; i < koefmaxlist.Count; i++)
    {
        koefmaxlist.RemoveAt(i); i--;
    }
    //добавляем новое значение
        koefmaxlist.Add(decode_text);
        return "Максимальный коэффициент изменен. Текущий: " + decode_text;
    }
 

 
else
    {
        throw new Exception("Выход");
    }
Ну вот собственно и все.

С помощью такой связки, мой заказчик получил очень удобный механизм управления сигналами на спорт и довольно успешно продвигает свой проект по беттингу.

Будут пожелания продолжить тематику пишите в комментарии.
И да пребудет с Вами удача.
шикарная работа
 

alexsandroid

Client
Регистрация
06.08.2018
Сообщения
93
Благодарностей
28
Баллы
18
В предлагаемом варианте бот опрашивает сервер телеги о поступлении новых команд пользователя через заданный промежуток времени. В таком варианте работы пользователи бота ощущают его тормознутость и это может стать раздражающим моментом.
Все кто хочет получить моментальную реакцию бота на каждую введенную команду, могут использовать длинный метод запроса («Long Polling»).

API telegram для работы через «Long Polling»

Нужно воспользоваться методом getUpdates и отправить на сервера телеграм запрос следующего вида:
где YOUR_BOT_TOKEN — токен вашего бота, options — список дополнительных опций.

Опции могут быть следующими:
  • offset — идентификатор первого запрашиваемого апдейта. С этой опцией будут получены все апдейты, начиная с апдейта с указанным в поле offset идентификатором. То есть, для того, чтобы получать все апдейты — мы должны каждый раз в запросе указывать идентификатор на единицу больше, чем идентификатор (update_id) последнего полученного апдейта. Все апдейты с идентификаторами меньше присланного значения offset «забываются»;
  • limit — максимальное количество апдейтов, которое будет прислано за один раз. Может принимать значения от 1 до 100 (по умолчанию 100).
  • timeout — время ожидания для «длинного» запроса. По умолчанию = 0 (то есть по умолчанию используется обычный опрос);
  • allowed_updates — тип сообщений, которые мы хотели бы получать (например можно получать только сообщения типа message). Эта опция добавлена недавно и на момент написания этой статьи мне не удалось добиться её заявленной работы (выбранные типы сообщений приходят не от всех пользователей).
Я в своих ботах использую такой GET-запрос:
https://api.telegram.org/bot{-Variable.bot_token-}/getUpdates?offset={-Variable.update_id-}&timeout={-Variable.timeout-}

{-Variable.update_id-}
- это идентификатор последнего обновления (плюс единица)
{-Variable.timeout-} - это число указывающее сколько секунд ожидать ответа от сервера телеги.
При истечении таймаута я опять повторяю запрос.
Получается, что наш бот (проект зеннопостера) постоянно прослушивает сервер телеги на получение новых команд и при получении команды моментально реагирует.

75832
 

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