Discusión sobre el artículo "Cómo crear un bot para Telegram en el lenguaje MQL5" - página 32

 

Hola a todos,

Tal vez algunos de ustedes pueden ayudar, estoy tratando desesperadamente de encontrar una solución para enviar una captura de pantalla local a través de MT4 a Telegram.

Código rápido snipped

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

El primero funciona, ya que recibo el mensaje, incluso si uso @nombredelcanal

El segundo sólo funciona con chatID, lo cual está bien, puedo vivir con ello.

El tercero me da error:

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

¿Alguna idea de lo que estoy haciendo mal?


 
Tomasz Maria Burzanowski:

Hola a todos,

Tal vez alguno de ustedes pueda ayudar, estoy tratando desesperadamente de encontrar una solución para enviar una captura de pantalla local a través de MT4 a Telegram.

Código rápido snipped

El primero funciona, ya que recibo el mensaje, incluso si uso @nombredelcanal

El segundo funciona sólo con chatID, que está bien, puedo vivir con ella

La tercera me da error:

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

¿Alguna idea de lo que estoy haciendo mal?


sí tienes que modificar el archivo mqh para que acepte ese número negativo.

 

@Marco vd Heijden ¡gracias!

Es interesante, he echado un vistazo a Telegram.mqh y veo tres funciones para SendPhoto, de las cuales me pregunto cómo sabe el código cuál usar. De todas formas la tercera está descartada.


Primera:

   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)

Segunda:

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)

¿Podría ser que el código no sabe cuál quiero tomar? Estoy tratando de activar la primera, pero en realidad la segunda sería mejor.

En segundo lugar he intentado buscar en la primera función lo que ocurre con _chat_id, pero sólo veo una simple conversión de entero a cadena:

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 el segundo parámetro uno es un long el otro es una cadena

 const long _chat_id,

y

const string _channel_name,

esto es parte de los fundamentos de mql u puede tener millones de funciones con el mismo nombre con diferentes parámetros o número de parámetros

 

@Jefferson Metha sí lo entiendo, era sólo mi pensamiento, ya que ha sido tan difícil encontrar los problemas.

He utilizado ahora los consejos descritos en https://www.mql5.com/en/forum/89826/page15#comment_17079865, pero todavía no llegar a ninguna parte.

Me gustaría centrarme en la función sendPhoto donde la entrada es el nombre del canal, no ID de chat, así que vamos a centrarnos únicamente en una cosa.


Lo que he hecho hasta ahora, en Telegarm.mqh en la función

   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)

He modificado la siguiente línea:

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

Básicamente quitar la función StringTrim, pero no mejora.

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

Por fin lo he resuelto.

Cambios:

int SendPhoto(string &_photo_id,
                 const string _channel_name,
                 const string _local_path,
                 const string _caption=NULL,
                 const int _common_flag=0,//Cambiado a int no bool
                 const int _timeout=10000)

Eliminado:

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

Y finalmente en el EA, tan simple como:

string filepath = "mypic.gif";
string photo_id;
int pic=bot.SendPhoto(photo_id,InpChannelName,filepath);
 
En vindows 7, 8 y 8.1 no funciona ni a través de webquest en mt, ni a través de vininet .vindows server 2012 y todo lo anterior - funciona normalmente.Comprobado también el acceso a la api a través de Internet Explorer en estos sistemas, por lo que en 7 y 8 y 8.1 incluso el navegador no obtiene la respuesta.
 
Gracias por su esfuerzo en la redacción de este artículo. Extremadamente útil para un novato
 

Buenas tardes.

Gracias por el detallado artículo. Muy útil.

Me he encontrado con que la petición WEB no funciona.

Da un error

2020.08.19 15:56:04.830 Moving Average Signal To Alert (RTSRIU0,M1) Error: URL no permitida para WebRequest

2020.08.19 15:54:01.332 Media móvil de la señal de alerta (RTSRIU0,M1) salir del canal https://api.telegram.org/bot1234567:AAHwDJwwrh-m16O0EoIA7--3BG0I5ayk3E0/sendMessage chat_id=@MyTestSignal&text=HELLO

Después de investigar resultó que faltaba ?( pregunta) después de /sendmessage?

¿Se ha solucionado ya? ¿Hay una nueva versión?

Lo arreglaré yo mismo.

 

Estoy enviando texto a telegram desde el indicador. Pero tuve que cambiar POST a GET tipo de solicitud.

Si envío con POST, obtengo el error 400. Si envío el mismo código desde el EA (pero utilizando WebRequest en lugar de _WebRequest), el código funciona en modo POST. ¿Me podéis decir dónde tengo que mirar, ya que en el método GET tengo un límite en la longitud de la petición?

Error y con GET también error 400...

2020.08.21 08:52:20.138 testWININET GBPUSD,M1: Error loading 'https://api.telegram.org/bot123123123:ываываыукаыва /sendMessage?chat_id=-123123123123123&parse_mode=HTML&text=Hello', code 400

Si lo envío a través del navegador, la petición pasa.



#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 leer cómo enviar qué

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

cadena de entrada inpChat_id="-3123123123123213";

bool inpParsMode =true;


int OnInit()

{

cadena 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";

Imprimir (url);

string cookie=NULL,cabeceras;

char post[],resultado[];

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

if(res==-1)

{

Print("Error en WebRequest. Código de error =",GetLastError());

//--- probablemente falte la URL en la lista, imprime un mensaje sobre la necesidad de añadirla.

MessageBox("Es necesario añadir la dirección '"+url+"' a la lista de URLs permitidas en la pestaña 'Asesores'", "Error",MB_ICONINFORMATION);

}

else

{

if(res==200)

{

//--- descarga con éxito

PrintFormat("Archivo cargado con éxito, tamaño %d bytes.",ArraySize(result));

//PrintFormat("Cabeceras del servidor: %s",cabeceras);

//--- guardar los datos en el archivo

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

if(filehandle!=INVALID_HANDLE)

{

//--- guardar el contenido de la matriz result[] en un archivo

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

//--- cerrar el fichero

FileClose(filehandle);

}

else

Print("Error en FileOpen. Código de error =",GetLastError());

}

else

PrintFormat("Error al cargar '%s', código %d",url,res);

}

// ReadUrl(url,data);


return(INIT_SUCCEED);

}

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

//| Función de iteración del indicador personalizada |

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

int OnCalculate(const int tasas_total,

const int prev_calculado,

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

{

//---

//--- devuelve el valor de prev_calculado para la siguiente llamada

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