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

 

SendPhoto

Die Klasse hat die Möglichkeit implementiert, Fotos mit zwei Anwendungsmöglichkeiten zu versenden.

int SendPhoto(const long   chat_id,
              const string local_path,
              string       &photo_id,
              const string caption=NULL,
              const bool   common_flag=false,
              const int    timeout=10000)
chat_id Chat-Nummer
lokaler_pfad lokaler Pfad zu dem Ordner in <Datenordner>\MQL5\Files
photo_id Kennung des auf den Server hochgeladenen Fotos
Bildunterschrift Signaturtext unter dem Foto
common_flag Kennzeichen für den Dateispeicherort im gemeinsamen Ordner aller Client-Terminals \Terminal\Common\Files
Zeitüberschreitung Zeitüberschreitung des Vorgangs in Millisekunden

Es gibt mehrere Möglichkeiten, ein Foto zu senden.

CCustomBot bot;

string token = "208375865:AAFnuOjlZ3Wsdan6PAjeqqUtBybe0Di1or8";

bot.Token(token);

string photo_id;
int result=bot.SendPhoto(198289825,"EURUSD1.gif",photo_id,"screenshot");
if(result==0)
   Print("Photo ID: ",photo_id);
else
   Print("Error: ",GetErrorDescription(result));

Ich kann sehen, dass Sie ein Minuszeichen haben.

Sie können in der Datei Telegram.mqh nachsehen.

//+------------------------------------------------------------------+
   int SendPhoto(const long   _chat_id,
                 const string _photo_id,
                 const string _caption=NULL)
     {
      if(m_token==NULL)
         return(ERR_TOKEN_ISEMPTY);

      string out;
      string url=StringFormat("%s/bot%s/sendPhoto",TELEGRAM_BASE_URL,m_token);
      string params=StringFormat("chat_id=%lld&photo=%s",_chat_id,_photo_id);
      if(_caption!=NULL)
         params+="&caption="+UrlEncode(_caption);

      int res=PostRequest(out,url,params,WEB_TIMEOUT);
      if(res!=0)
        {
         //--- Ergebnis parsen
         CJAVal js(NULL,jtUNDEF);
         bool done=js.Deserialize(out);
         if(!done)
            return(ERR_JSON_PARSING);

         //--- Fehlerbeschreibung erhalten
         bool ok=js["ok"].ToBool();
         long err_code=js["error_code"].ToInt();
         string err_desc=js["description"].ToStr();
        }
      //--- erledigt
      return(res);
     }

   //+------------------------------------------------------------------+
   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)
     {
      if(m_token==NULL)
         return(ERR_TOKEN_ISEMPTY);

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

      if(m_token==NULL)
         return(ERR_TOKEN_ISEMPTY);

      ResetLastError();
      //--- Datei in Speicherpuffer kopieren
      if(!FileIsExist(_local_path,_common_flag))
         return(ERR_FILE_NOT_EXIST);

      //---
      int flags=FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ;
      if(_common_flag)
         flags|=FILE_COMMON;

      //---
      int file=FileOpen(_local_path,flags);
      if(file<0)
         return(_LastError);

      //---
      int file_size=(int)FileSize(file);
      uchar photo[];
      ArrayResize(photo,file_size);
      FileReadArray(file,photo,0,file_size);
      FileClose(file);

      //--- Grenze erstellen: (Daten -> base64 -> 1024 Bytes -> md5)
      uchar base64[];
      uchar key[];
      CryptEncode(CRYPT_BASE64,photo,key,base64);
      //---
      uchar temp[1024]={0};
      ArrayCopy(temp,base64,0,0,1024);
      //---
      uchar md5[];
      CryptEncode(CRYPT_HASH_MD5,temp,key,md5);
      //---
      string hash=NULL;
      int total=ArraySize(md5);
      for(int i=0;i<total;i++)
         hash+=StringFormat("%02X",md5[i]);
      hash=StringSubstr(hash,0,16);

      //--- WebRequest
      uchar result[];
      string result_headers;

      string url=StringFormat("%s/bot%s/sendPhoto",TELEGRAM_BASE_URL,m_token);

      //--- 1
      uchar data[];

      //--- chart_id hinzufügen
      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,name);
      ArrayAdd(data,"\r\n");

      if(StringLen(_caption)>0)
        {
         ArrayAdd(data,"--"+hash+"\r\n");
         ArrayAdd(data,"Content-Disposition: form-data; name=\"caption\"\r\n");
         ArrayAdd(data,"\r\n");
         ArrayAdd(data,_caption);
         ArrayAdd(data,"\r\n");
        }

      ArrayAdd(data,"--"+hash+"\r\n");
      ArrayAdd(data,"Content-Disposition: form-data; name=\"photo\"; filename=\"lampash.gif\"\r\n");
      ArrayAdd(data,"\r\n");
      ArrayAdd(data,photo);
      ArrayAdd(data,"\r\n");
      ArrayAdd(data,"--"+hash+"--\r\n");

      // SaveToFile("debug.txt",data);

      //---
      string headers="Content-Type: multipart/form-data; boundary="+hash+"\r\n";
      int res=WebRequest("POST",url,headers,_timeout,data,result,result_headers);
      if(res==200)//OK
        {
         //--- Stückliste löschen
         int start_index=0;
         int size=ArraySize(result);
         for(int i=0; i<fmin(size,8); i++)
           {
            if(result[i]==0xef || result[i]==0xbb || result[i]==0xbf)
               start_index=i+1;
            else
               break;
           }

         //---
         string out=CharArrayToString(result,start_index,WHOLE_ARRAY,CP_UTF8);

         //--- Ergebnis parsen
         CJAVal js(NULL,jtUNDEF);
         bool done=js.Deserialize(out);
         if(!done)
            return(ERR_JSON_PARSING);

         //--- Fehlerbeschreibung erhalten
         bool ok=js["ok"].ToBool();
         if(!ok)
            return(ERR_JSON_NOT_OK);

         total=ArraySize(js["result"]["photo"].m_e);
         for(int i=0; i<total; i++)
           {
            CJAVal image=js["result"]["photo"].m_e[i];

            long image_size=image["file_size"].ToInt();
            if(image_size<=file_size)
               _photo_id=image["file_id"].ToStr();
           }

         return(0);
        }
      else
        {
         if(res==-1)
           {
            string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
            //Drucken(out);
            return(_LastError);
           }
         else
           {
            if(res>=100 && res<=511)
              {
               string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
               //Drucken(out);
               return(ERR_HTTP_ERROR_FIRST+res);
              }
            return(res);
           }
        }
      //--- 
      return(0);
     }

   //+------------------------------------------------------------------+
   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)
     {
      if(m_token==NULL)
         return(ERR_TOKEN_ISEMPTY);

      ResetLastError();
      //--- Datei in Speicherpuffer kopieren
      if(!FileIsExist(_local_path,_common_flag))
         return(ERR_FILE_NOT_EXIST);

      //---
      int flags=FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ;
      if(_common_flag)
         flags|=FILE_COMMON;

      //---
      int file=FileOpen(_local_path,flags);
      if(file<0)
         return(_LastError);

      //---
      int file_size=(int)FileSize(file);
      uchar photo[];
      ArrayResize(photo,file_size);
      FileReadArray(file,photo,0,file_size);
      FileClose(file);

      //--- Grenze erstellen: (Daten -> base64 -> 1024 Bytes -> md5)
      uchar base64[];
      uchar key[];
      CryptEncode(CRYPT_BASE64,photo,key,base64);
      //---
      uchar temp[1024]={0};
      ArrayCopy(temp,base64,0,0,1024);
      //---
      uchar md5[];
      CryptEncode(CRYPT_HASH_MD5,temp,key,md5);
      //---
      string hash=NULL;
      int total=ArraySize(md5);
      for(int i=0;i<total;i++)
         hash+=StringFormat("%02X",md5[i]);
      hash=StringSubstr(hash,0,16);

      //--- WebRequest
      uchar result[];
      string result_headers;

      string url=StringFormat("%s/bot%s/sendPhoto",TELEGRAM_BASE_URL,m_token);

      //--- 1
      uchar data[];

      //--- chart_id hinzufügen
      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");

      if(StringLen(_caption)>0)
        {
         ArrayAdd(data,"--"+hash+"\r\n");
         ArrayAdd(data,"Content-Disposition: form-data; name=\"caption\"\r\n");
         ArrayAdd(data,"\r\n");
         ArrayAdd(data,_caption);
         ArrayAdd(data,"\r\n");
        }

      ArrayAdd(data,"--"+hash+"\r\n");
      ArrayAdd(data,"Content-Disposition: form-data; name=\"photo\"; filename=\"lampash.gif\"\r\n");
      ArrayAdd(data,"\r\n");
      ArrayAdd(data,photo);
      ArrayAdd(data,"\r\n");
      ArrayAdd(data,"--"+hash+"--\r\n");

      // SaveToFile("debug.txt",data);

      //---
      string headers="Content-Type: multipart/form-data; boundary="+hash+"\r\n";
      int res=WebRequest("POST",url,headers,_timeout,data,result,result_headers);
      if(res==200)//OK
        {
         //--- Stückliste löschen
         int start_index=0;
         int size=ArraySize(result);
         for(int i=0; i<fmin(size,8); i++)
           {
            if(result[i]==0xef || result[i]==0xbb || result[i]==0xbf)
               start_index=i+1;
            else
               break;
           }

         //---
         string out=CharArrayToString(result,start_index,WHOLE_ARRAY,CP_UTF8);

         //--- Ergebnis parsen
         CJAVal js(NULL,jtUNDEF);
         bool done=js.Deserialize(out);
         if(!done)
            return(ERR_JSON_PARSING);

         //--- Fehlerbeschreibung erhalten
         bool ok=js["ok"].ToBool();
         if(!ok)
            return(ERR_JSON_NOT_OK);

         total=ArraySize(js["result"]["photo"].m_e);
         for(int i=0; i<total; i++)
           {
            CJAVal image=js["result"]["photo"].m_e[i];

            long image_size=image["file_size"].ToInt();
            if(image_size<=file_size)
               _photo_id=image["file_id"].ToStr();
           }

         return(0);
        }
      else
        {
         if(res==-1)
           {
            string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
            //Drucken(out);
            return(_LastError);
           }
         else
           {
            if(res>=100 && res<=511)
              {
               string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
               //Drucken(out);
               return(ERR_HTTP_ERROR_FIRST+res);
              }
            return(res);
           }
        }
      //--- 
      return(0);
     }
   //+------------------------------------------------------------------+

Wenn Sie in der mqh-Datei nachsehen, können Sie sehen

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

In Ihrem Fall können Sie also eine Änderung wie diese versuchen

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

Bitte keine Doppelposts!

Ich werde Ihr Thema löschen und die Antworten hierher verschieben.

 
John Progton:

Andrey Voytenko im Grunde fügte ich die Dateien, die Sie verwenden und dann modifiziert das Skript, das ich habe, um zu Telegramm anstelle von E-Mail zu senden, wenn die Ausführung eines Handels Aktion. Das funktioniert, außer wenn ein Handel zu öffnen, wird es die Nachricht mehrere Male senden

Gleiche Probleme
 

Ich comfirm, dass mit wenig modifaction von Post #46, der Code funktioniert gut auf MT5 für senden Alarme an Kanäle.

Bestätigen Sie auch, dass senden Sie Anfragen an den Bot für die Kontrolle EA funktioniert.

Aber jemand succedd, diese Anfragen von Bot zu EA auf nur einige "from_id" zu sperren? So der Bot nur hören Anfragen von bestimmten ID.

 
huwa:

Ich comfirm, dass mit wenig modifaction aus Beitrag #46, der Code funktioniert gut auf MT5 für senden Alarme an Kanäle.

Bestätigen Sie auch, dass senden Sie Anfragen an den Bot für die Kontrolle EA funktioniert.

Aber jemand succedd, diese Anfragen von Bot zu EA auf nur einige "from_id" zu sperren? So der Bot nur hören Anfragen von bestimmten ID.

Für diejenigen, die die Bot-Anfrage an Telegram Account ID sperren wollen, finden Sie diese Zeile in Telegram.mqh :


//--- Filter
   //if(m_users_filter.Total()==0 || (m_users_filter.Total()>0 && m_users_filter.SearchLinear(msg.from_username)>=0)) //Entferne diese Zeile aus dem Code
   if(msg.from_id==??????????)   //Einfügen dieser Zeile in den Code, wobei ?????????? Ihre Telegram-Konto-ID ist


 
Wow, danke Andrey Voytenko für das Teilen deines Wissens, es ist sehr hilfreich für Anfänger wie mich

Telegram_Bot_EA und Telegram_Search_EA laufen sehr gut, aber nicht mit dem letzten ( Telegram_signal_EA ).
Ich habe kein Signal in meinem Kanal bekommen.

Was ich gemacht habe ist:
- Erstellen Sie einen Bot, fügen Sie ihn zu meinem Kanal hinzu und setzen Sie ihn auf Administrator
- Ändern Sie Ihren Code mit meinem Indikator
- Ändern von Telegram.mqh, um einen privaten Kanal zu erstellen

Nachdem ich Telegram_singal_EA ausgeführt habe, kann ich meinen Bot-Namen sehen, aber ich bekomme immer noch kein Signal.


Bei jedem Tick bekomme ich eine Fehlermeldung:

Telegram_Signal_EA GBPUSD,M1: Fehler:Schlechte Anfrage

Telegram_Signal_EA GBPUSD,M1: {"ok":false, "error_code":400, "description": "Bad Request: chat not found"}


Haben Sie irgendwelche Vorschläge?

 

@ade kurniawan Sie sollten bei privaten Channels mit der Chat-ID arbeiten (nicht mit dem Channel-Namen).

 
Andrey Voytenko:

@ade kurniawan Sie sollten bei privaten Kanälen mit der Chart-ID arbeiten (nicht mit dem Kanalnamen).

Ja, das habe ich bereits geändert. Immer noch mit dem gleichen Fehler. Auch wenn ich alles auf öffentliche Kanäle ändere
 

Hat jemand versucht BOLD oder ITALIC Schriften mit dieser Bibliothek?
Ich habe versucht **bold** __italic__ mit Markdown in der Nachricht wie folgt, aber keine Zigarre...


"n**boldtext** __italictext__ Balance: $%s parse_mode=MARKDOWN"

Das Ergebnis ist:

**boldtext** __italictext__ Kontostand: $10056.21 parse_mode=MARKDOWN
 

Macht nichts....

Ich habe die Antwort gefunden, indem ich das AsHTML-Flag auf true gesetzt habe...

bot.SendMessage(InpTelegramId,"<b>Balance: $10056.21</b>",true);

Sorry...


spottypegasus:

Hat jemand die Schriftarten BOLD oder ITALIC mit dieser Bibliothek ausprobiert?
Ich habe **bold** __italic__ mit Markdown in der Nachricht wie folgt versucht, aber ohne Erfolg...


"n**boldtext** __italictext__ Balance: $%s parse_mode=MARKDOWN"

Das Ergebnis ist:

**boldtext** __italictext__ Kontostand: $10056.21 parse_mode=MARKDOWN