Diskussion zum Artikel "Die Erstellung des Bots für Telegram in der Sprache MQL5" - Seite 32

 

Hallo zusammen,

Vielleicht können einige von euch helfen, ich versuche verzweifelt eine Lösung zu finden, um einen lokalen Screenshot über MT4 an Telegram zu senden.

Kurzer Code-Schnipsel

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

Der erste funktioniert, da ich die Nachricht erhalte, auch wenn ich @channelname verwende

Der zweite funktioniert nur mit chatID, was ok ist, ich kann damit leben

Beim dritten bekomme ich den Fehler:

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

Irgendeine Idee, was ich falsch mache?


 
Tomasz Maria Burzanowski:

Hallo zusammen,

Vielleicht können einige von euch helfen, ich bin verzweifelt versucht, eine Lösung zu finden, um einen lokalen Screenshot über MT4 zu Telegram zu senden.

Schnell Code schnippelte

Der erste funktioniert, da ich die Nachricht erhalte, auch wenn ich @channelname verwende

Der zweite funktioniert nur mit chatID, was ok ist, ich kann damit leben

Bei der dritten bekomme ich den Fehler:

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

Irgendeine Idee, was ich falsch mache?


Ja, Sie müssen die mqh-Datei so ändern, dass sie diese negative Zahl akzeptiert.

 

@Marco vd Heijden danke!

Das ist interessant, ich habe mir Telegram.mqh angeschaut und ich sehe drei Funktionen für SendPhoto, von denen ich mich frage, wie der Code weiß, welche er verwenden soll. Die dritte kommt jedenfalls nicht in Frage.


Erstens:

   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)

Zweitens:

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)

Könnte es sein, dass der Code nicht weiß, welche ich nehmen will? Ich versuche, den ersten auszulösen, aber eigentlich wäre der zweite besser.

Zweitens habe ich versucht, in der ersten Funktion zu suchen, was mit _chat_id passiert, aber ich kann nur eine einfache Integer-zu-String-Konvertierung sehen:

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:

Der zweite Parameter ist ein Long und der zweite ein String

 const long _chat_id,

und

const string _channel_name,

Dies ist Teil der Mql-Grundlagen. Man kann Millionen von Funktionen mit demselben Namen und unterschiedlichen Parametern oder einer unterschiedlichen Anzahl von Parametern haben.

 

@Jefferson Metha ja das verstehe ich, das war nur mein Gedanke, da es so schwierig war, die Probleme zu finden.

Ich habe jetzt die Tipps, die in https://www.mql5.com/en/forum/89826/page15#comment_17079865 beschrieben sind, benutzt, aber ich komme immer noch nicht weiter.

Ich möchte mich auf die Funktion sendPhoto konzentrieren, wo die Eingabe der Name des Kanals ist, nicht die Chat-ID, also konzentrieren wir uns nur auf eine Sache.


Was ich bis jetzt gemacht habe, in Telegarm.mqh in der Funktion

   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)

Ich habe die folgende Zeile geändert:

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

Im Grunde genommen habe ich die StringTrim-Funktion entfernt, aber es wird nicht besser.

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

Endlich habe ich es herausgefunden.

Änderungen:

int SendPhoto(string &_photo_id,
                 const string _channel_name,
                 const string _local_path,
                 const string _caption=NULL,
                 const int _common_flag=0,//Änderung in int statt bool
                 const int _timeout=10000)

Entfernt:

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

Und schließlich in der EA, so einfach wie:

string filepath = "mypic.gif";
string photo_id;
int pic=bot.SendPhoto(photo_id,InpChannelName,filepath);
 
In vindows 7, 8 und 8.1 funktioniert nicht weder durch webquest in mt, noch durch vininet .vindows server 2012 und alles oben - funktioniert normal.überprüft auch den Zugriff auf api durch Internet Explorer in diesen Systemen, so dass auf 7 und 8 und 8.1 auch der Browser nicht die Antwort erhalten.
 
Vielen Dank für die Mühe, die Sie sich mit dem Verfassen dieses Artikels gemacht haben! Äußerst hilfreich für einen Neuling
 

Guten Tag!

Danke für den ausführlichen Artikel. Sehr hilfreich.

Ich bin darauf gestoßen, dass die WEB-Anfrage nicht funktioniert hat.

Es gibt einen Fehler

2020.08.19 15:56:04.830 Moving Average Signal To Alert (RTSRIU0,M1) Fehler: URL ist für WebRequest nicht erlaubt

2020.08.19 15:54:01.332 Gleitendes Durchschnittssignal zum Alarm (RTSRIU0,M1) Kanal verlassen https://api.telegram.org/bot1234567:AAHwDJwwrh-m16O0EoIA7--3BG0I5ayk3E0/sendMessage chat_id=@MyTestSignal&text=HELLO

Nach Recherchen stellte sich heraus, dass es sich um ein fehlendes ?( Frage) nach /sendmessage?

Wurde dies schon behoben? Gibt es eine neue Version?

Ich werde es selbst beheben.

 

Ich sende Text an Telegram aus dem Indikator. Aber ich musste die Art der Anfrage von POST auf GET ändern.

Wenn ich mit POST sende, erhalte ich Fehler 400. Wenn ich den gleichen Code aus dem EA sende (aber ich verwende WebRequest anstelle von _WebRequest), funktioniert der Code im POST-Modus. Können Sie mir sagen, wo zu suchen, wie in der GET-Methode habe ich eine Grenze für die Länge der Anforderung?

Fehler und bei GET auch Fehler 400...

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

Wenn ich sie über den Browser sende, geht die Anfrage durch.



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

#Eigenschaft 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 zu lesen, wie was zu senden ist

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

input string inpChat_id="-3123123123123213";

bool inpParsMode =true;


int OnInit()

{

string Daten;

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("Fehler in WebRequest. Fehlercode =",GetLastError());

//--- die URL fehlt wahrscheinlich in der Liste, drucken Sie eine Meldung über die Notwendigkeit, sie hinzuzufügen.

MessageBox("Es ist notwendig, die Adresse '"+url+"' zur Liste der erlaubten URLs in der Registerkarte 'Advisors' hinzuzufügen", "Fehler",MB_ICONINFORMATION);

}

sonst

{

if(res==200)

{

//--- erfolgreicher Download

PrintFormat("Datei erfolgreich hochgeladen, Größe %d Bytes.",ArraySize(result));

//DruckFormat("Server-Kopfzeilen: %s",Kopfzeilen);

//--- Daten in Datei speichern

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

if(filehandle!=INVALID_HANDLE)

{

//--- den Inhalt des result[]-Arrays in einer Datei speichern

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

//--- die Datei schließen

FileClose(filehandle);

}

sonst

Print("Fehler bei FileOpen. Fehlercode =",GetLastError());

}

sonst

PrintFormat("Fehler beim Laden von '%s', Code %d",url,res);

}

// ReadUrl(url,data);


return(INIT_SUCCEEDED);

}

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

//| Benutzerdefinierte Indikator-Iterationsfunktion |

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

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 &Volumen[],

const int &spread[])

{

//---

//--- Rückgabewert von prev_calculated für den nächsten Aufruf

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