Обсуждение статьи "Создание бота для Telegram на языке MQL5" - страница 32

 

Привет всем,

Может быть, кто-то из вас может помочь, я отчаянно пытаюсь найти решение для отправки локального скриншота через MT4 в Telegram.

Быстрый снимок кода

int res=bot.SendMessage(-100135482 xxx,"Running a test " +TimeToString(TimeCurrent()));
int ac=bot.SendChatAction(-100135482 xxx,ACTION_UPLOAD_PHOTO);
int pic=bot.SendPhoto(filepath+"\mypic.gif",-100135482 xxx,filepath);

Первый работает, так как я получаю сообщение, даже если я использую @channelname

Второй работает только с chatID, что нормально, я могу с этим жить

Третий выдает ошибку:

2020.08.07 21:40:15.175 xxx1: {"ok":false, "error_code":400, "description": "Bad Request: chat not found"}.

Есть идеи, что я делаю не так?


 
Tomasz Maria Burzanowski:

Привет всем,

Может быть, кто-то из вас сможет помочь, я отчаянно пытаюсь найти решение для отправки локального скриншота через MT4 в Telegram.

Быстрый снимок кода

Первый вариант работает, так как я получаю сообщение, даже если использую @channelname

Второй работает только с chatID, что нормально, я могу с этим жить

Третий вариант выдает ошибку:

2020.08.07 21:40:15.175 xxx1: { "ok":false, "error_code":400, "description": "Bad Request: chat not found"}

Есть идеи, что я делаю не так?


Да, вам нужно изменить файл mqh так, чтобы он принимал отрицательное число.

 

@Marco vd Heijden Спасибо!

Это интересно, я посмотрел на Telegram.mqh и вижу три функции для SendPhoto, из которых мне интересно, как код знает, какую из них использовать. Третья в любом случае не может быть использована.


Первая:

   int SendPhoto(string &_photo_id,
                 const long _chat_id,
                 const string _local_path,
                 const string _caption=NULL,
                 const bool _common_flag=false,
                 const int _timeout=10000)

Вторая:

int SendPhoto(string &_photo_id,
                 const string _channel_name,
                 const string _local_path,
                 const string _caption=NULL,
                 const bool _common_flag=false,
                 const int _timeout=10000)

Может ли быть так, что код не знает, какую из них я хочу использовать? Я пытаюсь задействовать первый, но на самом деле второй был бы лучше.

Во-вторых, я пытался найти в первой функции, что происходит с _chat_id, но я вижу только простое преобразование целого числа в строку:

ArrayAdd(data,"\r\n");
      ArrayAdd(data,"--"+hash+"\r\n");
      ArrayAdd(data,"Content-Disposition: form-data; name=\"chat_id\"\r\n");
      ArrayAdd(data,"\r\n");
      ArrayAdd(data,IntegerToString(_chat_id));
      ArrayAdd(data,"\r\n");
 
Tomasz Maria Burzanowski:

обратите внимание на второй параметр: один - длинный, другой - строка

 const long _chat_id,

и

const string _channel_name,

Это часть основ mql, у вас может быть миллион функций с одним и тем же именем с разными параметрами или количеством параметров

 

@Jefferson Metha да, я понимаю это, это была просто моя мысль, так как было так трудно найти проблемы.

Я воспользовался советами, описанными в https://www.mql5.com/en/forum/89826/page15#comment_17079865, но все равно ничего не добился.

Я хотел бы сосредоточиться на функции sendPhoto, где в качестве входных данных используется имя канала, а не ID чата, поэтому давайте сосредоточимся только на одной вещи.


Что я сделал на данный момент, в Telegarm.mqh в функции

   int SendPhoto(string &_photo_id,
                 const string _channel_name,
                 const string _local_path,
                 const string _caption=NULL,
                 const bool _common_flag=false,
                 const int _timeout=10000)

Я изменил следующую строку:

      string name=StringTrim(_channel_name);
      name=_channel_name;
      /*if(StringGetCharacter(name,0)!='@') TB 09.08
 name="@"+name;*/

В принципе, я удалил функцию StringTrim, но лучше от этого не стало.

Discussion of article "How to create bots for Telegram in MQL5"
Discussion of article "How to create bots for Telegram in MQL5"
  • 2020.06.26
  • www.mql5.com
New article How to create bots for Telegram in MQL5 has been published: Author: Andrey Voytenko...
 

Наконец-то разобрался.

Изменения:

int SendPhoto(string &_photo_id,
                 const string _channel_name,
                 const string _local_path,
                 const string _caption=NULL,
                 const int _common_flag=0,//Изменено на int, а не bool
                 const int _timeout=10000)

Удалено:

string name=StringTrim(_channel_name);
      if(StringGetCharacter(name,0)!='@')
         name="@"+name;

И, наконец, в советнике, так же просто, как:

string filepath = "mypic.gif";
string photo_id;
int pic=bot.SendPhoto(photo_id,InpChannelName,filepath);
 
в виндовс 7 , 8 и 8.1 не работает ни через вебреквест в мт , ни через вининет .виндовс сервер 2012 и все что выше - работает нормально.Проверил также доступ к апи через Интернет Експлоер в этих системах , так вот на 7 и 8 и 8,1 даже браузер не получает ответ .
 
Спасибо за ваши усилия по написанию этой статьи! Чрезвычайно полезно для новичка
 

Добрый день.

Спасибо за подробную статью. Очень помогла.

Столкнулся с тем, что WEB запрос  не отрабатывался.

Выдает ошибку

2020.08.19 15:56:04.830 Moving Average Signal To Alert (RTSRIU0,M1) Error: URL does not allowed for WebRequest

2020.08.19 15:54:01.332 Moving Average Signal To Alert (RTSRIU0,M1) выход канал https://api.telegram.org/bot1234567:AAHwDJwwrh-m16O0EoIA7--3BG0I5ayk3E0/sendMessage chat_id=@MyTestSignal&text=HELLO

После исследований оказалось что пропущен ?( вопрос) после /sendmessage?

Это уже исправлено было? Есть новая версия ?

Сам то я исправлю. 

 

Делаю отправку текста в телеграм из индикатора. Но пришлось изменить POST на GET  тип запроса.

Если отправляю с POST то возникает ошибка 400. Если отправляю из советника такой же код(но использу.ю не _WebRequest а WebRequest) то код работает в режиме POST. Подскажите куда стоит посмотреть, так как в методе GET у меня есть ограничение на длину запроса?

Ошибка и с GET тоже ошибка 400...

2020.08.21 08:52:20.138 testWININET GBPUSD,M1: Ошибка загрузки 'https://api.telegram.org/bot123123123:ываываыукаыва /sendMessage?chat_id=-123123123123123&parse_mode=HTML&text=Привет', код 400

Если отправляю через браузер запрос проходит.



#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

#property indicator_chart_window


//#include <Wininet.mqh>

#include <Webrequest_dll.mqh>



#define telegramBaseURL   "https://api.telegram.org"


//https://tlgrm.ru/docs/bots/api почитать как что отправлять

input string inpToken="11111212:вапвапапЫВВАEFfer";//Token

input string inpChat_id ="-3123123123123213";

bool inpParsMode =true;


int OnInit()

  {

    string data;

    string url="https://api.telegram.org/bot" + inpToken + "/sendMessage?chat_id="+inpChat_id;

   

   if(inpParsMode){

      url = url + "&parse_mode=HTML";

   } 

   

  //  url = url + "&text= " + "<b>1114</b>";

  //  url = url + "&text= " + "<i>1114</i>";

    url = url + "&text=" + "1118";

    

    Print (url);

    string cookie=NULL,headers;

    char   post[],result[];

    int res=_WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);

   if(res==-1)

     {

      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());

      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления

      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);

     }

   else

     {

      if(res==200)

        {

         //--- успешная загрузка

         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));

         //PrintFormat("Заголовки сервера: %s",headers);

         //--- сохраняем данные в файл

         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);

         if(filehandle!=INVALID_HANDLE)

           {

            //--- сохраняем содержимое массива result[] в файл

            FileWriteArray(filehandle,result,0,ArraySize(result));

            //--- закрываем файл

            FileClose(filehandle);

           }

         else

            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());

        }

      else

         PrintFormat("Ошибка загрузки '%s', код %d",url,res);

     }   

   // ReadUrl(url,data);


    return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//---

   

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+


Bots: An introduction for developers
  • core.telegram.org
Bots are third-party applications that run inside Telegram. Users can interact with bots by sending them messages, commands and inline requests. You control your bots using HTTPS requests to our Bot API. 1. What can I do with bots? To name just a few things, you could use bots to: Get customized notifications and news . A bot can act as a smart...