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

vicos

Client
Регистрация
06.02.2017
Сообщения
4
Благодарностей
28
Баллы
13
Тема взаимодействия 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("Выход");
    }
Ну вот собственно и все.

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

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

Вложения

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

Sanekk

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

DenisK

Client
Регистрация
28.06.2016
Сообщения
351
Благодарностей
142
Баллы
43
Спасибо за статью!
 

vicos

Client
Регистрация
06.02.2017
Сообщения
4
Благодарностей
28
Баллы
13
Да время для нас важный фактор. А такие фишки намного упрощают работу.
 

vicos

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

vasyaya

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

vicos

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

vasyaya

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

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