Discussão do artigo "Como criar bots para Telegram em MQL5" - página 32

 

Olá a todos,

Talvez alguns de vocês possam ajudar, estou tentando desesperadamente encontrar uma solução para enviar uma captura de tela local via MT4 para o Telegram.

Código rápido e resumido

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);

O primeiro funciona, pois estou recebendo a mensagem, mesmo se eu usar @channelname

O segundo funciona apenas com o chatID, o que está ok, posso viver com isso

O terceiro está me dando um erro:

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

Alguma ideia do que estou fazendo de errado?


 
Tomasz Maria Burzanowski:

Olá a todos,

Talvez alguns de vocês possam ajudar, estou tentando desesperadamente encontrar uma solução para enviar uma captura de tela local via MT4 para o Telegram.

Código rápido

O primeiro funciona, pois estou recebendo a mensagem, mesmo se eu usar @channelname

O segundo funciona somente com o chatID, o que é aceitável, posso viver com isso

A terceira está me dando um erro:

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

Alguma ideia do que estou fazendo de errado?


Sim, você precisa modificar o arquivo mqh para que ele aceite esse número negativo.

 

@Marco vd Heijden, obrigado!

Isso é interessante. Dei uma olhada no Telegram.mqh e vi três funções para SendPhoto, das quais estou me perguntando como o código sabe qual delas usar. De qualquer forma, a terceira está fora de questão.


Primeira:

   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)

Segundo:

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)

É possível que o código não saiba qual delas eu quero usar? Estou tentando acionar a primeira, mas na verdade a segunda seria melhor.

Em segundo lugar, tentei pesquisar na primeira função o que está acontecendo com _chat_id, mas só consigo ver uma simples conversão de inteiro para cadeia de caracteres:

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:

observe o segundo parâmetro: um é um long e o outro é uma string

 const long _chat_id,

e

const string _channel_name,

isso faz parte dos princípios básicos do mql, você pode ter milhões de funções com o mesmo nome com parâmetros ou número de parâmetros diferentes

 

@Jefferson Metha, sim, eu entendo isso, foi apenas um pensamento meu, pois tem sido muito difícil encontrar os problemas.

Usei agora as dicas descritas em https://www.mql5.com/en/forum/89826/page15#comment_17079865, mas ainda não consegui chegar a lugar algum.

Gostaria de me concentrar na função sendPhoto, em que a entrada é o nome do canal, não o ID do chat, portanto, vamos nos concentrar apenas em uma coisa.


O que fiz até agora, no Telegarm.mqh, na função

   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)

Modifiquei a seguinte linha:

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

Basicamente, removendo a função StringTrim, mas não está melhorando.

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...
 

Finalmente descobri.

Alterações:

int SendPhoto(string &_photo_id,
                 const string _channel_name,
                 const string _local_path,
                 const string _caption=NULL,
                 const int _common_flag=0,//Alterado para int e não bool
                 const int _timeout=10000)

Removido:

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

E, finalmente, no EA, tão simples quanto:

string filepath = "mypic.gif";
string photo_id;
int pic=bot.SendPhoto(photo_id,InpChannelName,filepath);
 
No windows 7, 8 e 8.1 não funciona nem pelo webquest no mt, nem pelo vininet .vindows server 2012 e tudo acima - funciona normalmente.Verifiquei também o acesso à api pelo Internet Explorer nesses sistemas, portanto no 7 e 8 e 8.1 nem mesmo o navegador obtém a resposta.
 
Obrigado por seu esforço em escrever este artigo! Extremamente útil para um novato
 

Boa tarde.

Obrigado pelo artigo detalhado. Muito útil.

Descobri que a solicitação WEB não funcionou.

Ela apresenta um erro

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

2020.08.19 15:54:01.332 Moving Average Signal To Alert (RTSRIU0,M1) exit channel https://api.telegram.org/bot1234567:AAHwDJwwrh-m16O0EoIA7--3BG0I5ayk3E0/sendMessage chat_id=@MyTestSignal&text=HELLO

Depois de pesquisar, descobri que estava faltando um ?( pergunta) depois de /sendmessage?

Isso já foi corrigido? Existe uma nova versão?

Eu mesmo vou consertar isso.

 

Estou enviando texto para o telegrama a partir do indicador. Mas tive de alterar o tipo de solicitação POST para GET.

Se eu enviar com POST, recebo o erro 400. Se eu enviar o mesmo código do EA (mas usar WebRequest em vez de _WebRequest), o código funcionará no modo POST. Você pode me dizer onde procurar, já que no método GET eu tenho um limite para o tamanho da solicitação?

Erro e com GET também erro 400...

2020.08.21 08:52:20.138 testWININET GBPUSD,M1: Erro ao carregar 'https://api.telegram.org/bot123123123:ываываыукаыва /sendMessage?chat_id=-123123123123123&parse_mode=HTML&text=Hello', código 400

Se eu enviar pelo navegador, a solicitação será concluída.



#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 para ler como enviar o quê

input string inpToken="11111212:vapvapYVVAEFfer";//Token

string de entrada inpChat_id="-3123123123123213";

bool inpParsMode =true;


int OnInit()

{

string data;

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

se(inpParsMode){

url = url + "&parse_mode=HTML"

}

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

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

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

Imprimir (url);

string cookie=NULL,headers;

char post[],result[];

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

if(res==-1)

{

Print("Erro no WebRequest. Código de erro =",GetLastError());

//--- o URL provavelmente está faltando na lista, imprima uma mensagem sobre a necessidade de adicioná-lo.

MessageBox("É necessário adicionar o endereço '"+url+"' à lista de URLs permitidos na guia 'Advisors'", "Error",MB_ICONINFORMATION);

}

else

{

if(res==200)

{

//--- download bem-sucedido

PrintFormat("File successfully uploaded, size %d bytes.",ArraySize(result));

//PrintFormat("Server headers: %s",headers);

//--- salvar dados no arquivo

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

if(filehandle!=INVALID_HANDLE)

{

//--- salvar o conteúdo da matriz result[] em um arquivo

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

//--- fechar o arquivo

FileClose(filehandle);

}

else

Print("Erro em FileOpen. Código de erro =",GetLastError());

}

else

PrintFormat("Erro ao carregar '%s', código %d",url,res);

}

// ReadUrl(url,data);


return(INIT_SUCCEEDED);

}

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

//| Função de iteração de indicador personalizado

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

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[])

{

//---

//--- retorna o valor de prev_calculated para a próxima chamada

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...