記事"MQL5言語でのTelegram用ボットの作成"についてのディスカッション - ページ 31 1...242526272829303132333435363738...55 新しいコメント Marco vd Heijden 2020.06.26 21:34 #301 写真を送る このクラスは、2つのアプリケーションの方法で写真を送信する機会を実装しています。 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 チャット番号 ローカルパス <dataフォルダ>内のフォルダへのローカルパス。 photo_id サーバーにアップロードされた写真の識別子 キャプション 写真の下の署名テキスト 共通フラグ 全クライアント端末の共通フォルダ内のファイル配置フラグ。 タイムアウト 操作タイムアウト時間(ミリ秒 写真を送信する方法はいくつかある。 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)); マイナス記号がありますね。 Telegram.mqhファイルを見てください。 //+------------------------------------------------------------------+ 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) { //--- 解析結果 CJAVal js(NULL,jtUNDEF); bool done=js.Deserialize(out); if(!done) return(ERR_JSON_PARSING); //--- エラーの説明を取得する bool ok=js["ok"].ToBool(); long err_code=js["error_code"].ToInt(); string err_desc=js["description"].ToStr(); } //--- 完了 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(); //--- メモリ・バッファにファイルをコピーする 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); //--- 境界の作成:(データ→base64→1024バイト→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を追加する 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 { //--- BOMを削除する 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); //--- 解析結果 CJAVal js(NULL,jtUNDEF); bool done=js.Deserialize(out); if(!done) return(ERR_JSON_PARSING); //--- エラーの説明を取得する 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); //印刷(out); return(_LastError); } else { if(res>=100 && res<=511) { string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8); //印刷(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(); //--- メモリ・バッファにファイルをコピーする 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); //--- 境界の作成:(データ→base64→1024バイト→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を追加する 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 { //--- BOMを削除する 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); //--- 解析結果 CJAVal js(NULL,jtUNDEF); bool done=js.Deserialize(out); if(!done) return(ERR_JSON_PARSING); //--- エラーの説明を取得する 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); //印刷(out); return(_LastError); } else { if(res>=100 && res<=511) { string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8); //印刷(out); return(ERR_HTTP_ERROR_FIRST+res); } return(res); } } //--- return(0); } //+------------------------------------------------------------------+ mqhファイルを見てください。 string name=StringTrim(_channel_name); if(StringGetCharacter(name,0)!='@') name="@"+name; あなたの場合、次のように変更してみてください。 string name = _channel_name; //if(StringGetCharacter(name,0)!='@') // name="@"+name; Keith Watford 2020.06.26 23:35 #302 tdbguy: 二重投稿はしないでください! トピックを削除し、返信をこちらに移動します。 RedProviders 2020.06.29 13:18 #303 John Progton:Andrey Voytenko 基本的に、私はあなたが使用しているファイルを追加し、私が持っているスクリプトを修正しました。トレードを開始するときにメッセージが複数回送信されることを除いてはうまくいきました。 同じ問題 huwa 2020.07.07 21:03 #304 投稿番号46のコードを少し修正するだけで、MT5でチャンネルにアラートを送信するコードが正常に動作することを確認しました。 また、EAを制御する ためのボットへのリクエスト送信も機能していることを確認した。 しかし、ボットからEAへのリクエストをいくつかの "from_id "だけにロックすることに成功した人はいますか? そうすれば、ボットは特定のIDからのリクエストだけを聞くことができます。 huwa 2020.07.11 19:14 #305 huwa:投稿番号46のコードを少し修正するだけで、MT5でチャンネルにアラートを送信するコードが正常に動作することを確認しました。また、EAを制御するためのボットへのリクエスト送信も機能していることを確認した。しかし、ボットからEAへのリクエストをいくつかの "from_id "だけにロックすることに成功した人はいますか? そうすれば、ボットは特定のIDからのリクエストだけを聞くことができます。 ボットのリクエストをTelegramのアカウントIDにロックしたい場合は、Telegram.mqhの以下の行を見つける: //--- フィルター //if(m_users_filter.Total()==0 || (m_users_filter.Total()>0 && m_users_filter.SearchLinear(msg.from_username)>=0)) //コードからこの行を削除する。 if(msg.from_id==??????????) //コードに次の行を追加する。 ade kurniawan 2020.07.21 15:32 #306 Andrey Voytenkoさん、知識の共有ありがとうございます。 Telegram_Bot_EAとTelegram_Search_EAはとてもうまく動いていますが、最後のもの(Telegram_signal_EA)はうまくいきません。 私のチャンネルにシグナルが届きません。 私がしたことは - ボットを作成し、私のチャンネルに追加し、管理者に設定する。 - 私のインジケーターであなたのコードを変更 - Telegram.mqhを変更してプライベートチャンネルにする。 Telegram_singal_EAを実行すると、ボット名が表示されるようになりましたが、シグナルは届きません。 ティック毎に エラーが出る: Telegram_Signal_EA GBPUSD,M1:エラー:Bad Request Telegram_Signal_EA GBPUSD,M1: {"ok":false, "error_code":400, "description": "Bad Request: chat not found"}. 何か提案はありますか? Andriy Voitenko 2020.07.21 16:10 #307 @ade kurniawan さん、プライベートチャンネルではチャンネル名ではなくチャットIDを使ってください。 Ade Kurniawan 2020.07.21 16:12 #308 Andrey Voytenko:プライベート・チャンネルでは、チャートID(チャンネル名ではない)を使ってください。 はい、すでに変更しました。それでも同じエラーです。すべてをパブリックチャンネルに変更しても Herman Makmur 2020.08.01 06:25 #309 このライブラリを使って太字や斜体のフォントを試した人はいますか? 以下のように、マークダウンで**太字** __italic__を試しましたが、ダメでした...。"n**boldtext** __italictext__ Balance: $%s parse_mode=MARKDOWN" 結果はこうです:**ボールドテキスト** __italictext__ 残高:10056.21ドルparse_mode=MARKDOWN Herman Makmur 2020.08.01 06:44 #310 AsHTMLフラグをtrueに設定することで答えが見つかりました... bot.SendMessage(InpTelegramId,"<b>Balance: $10056.21</b>",true); すみません... spottypegasus:どなたか、このライブラリを使って太字やイタリック体のフォントを試された方はいらっしゃいますか? 私は以下のように、**bold** __italic__をメッセージ内のマークダウンで試してみましたが、ダメでした..."n**boldtext** __italictext__ Balance: $%s parse_mode=MARKDOWN" 結果はこうです:**ボールドテキスト** __italictext__ 残高:10056.21ドルparse_mode=MARKDOWN 1...242526272829303132333435363738...55 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
写真を送る
このクラスは、2つのアプリケーションの方法で写真を送信する機会を実装しています。
写真を送信する方法はいくつかある。
マイナス記号がありますね。
Telegram.mqhファイルを見てください。
mqhファイルを見てください。
あなたの場合、次のように変更してみてください。
二重投稿はしないでください!
トピックを削除し、返信をこちらに移動します。
Andrey Voytenko 基本的に、私はあなたが使用しているファイルを追加し、私が持っているスクリプトを修正しました。トレードを開始するときにメッセージが複数回送信されることを除いてはうまくいきました。
投稿番号46のコードを少し修正するだけで、MT5でチャンネルにアラートを送信するコードが正常に動作することを確認しました。
また、EAを制御する ためのボットへのリクエスト送信も機能していることを確認した。
しかし、ボットからEAへのリクエストをいくつかの "from_id "だけにロックすることに成功した人はいますか? そうすれば、ボットは特定のIDからのリクエストだけを聞くことができます。
投稿番号46のコードを少し修正するだけで、MT5でチャンネルにアラートを送信するコードが正常に動作することを確認しました。
また、EAを制御するためのボットへのリクエスト送信も機能していることを確認した。
しかし、ボットからEAへのリクエストをいくつかの "from_id "だけにロックすることに成功した人はいますか? そうすれば、ボットは特定のIDからのリクエストだけを聞くことができます。
ボットのリクエストをTelegramのアカウントIDにロックしたい場合は、Telegram.mqhの以下の行を見つける:
ティック毎に エラーが出る:
Telegram_Signal_EA GBPUSD,M1:エラー:Bad Request
Telegram_Signal_EA GBPUSD,M1: {"ok":false, "error_code":400, "description": "Bad Request: chat not found"}.
何か提案はありますか?
@ade kurniawan さん、プライベートチャンネルではチャンネル名ではなくチャットIDを使ってください。
プライベート・チャンネルでは、チャートID(チャンネル名ではない)を使ってください。
このライブラリを使って太字や斜体のフォントを試した人はいますか?
以下のように、マークダウンで**太字** __italic__を試しましたが、ダメでした...。
"n**boldtext** __italictext__ Balance: $%s parse_mode=MARKDOWN"
**ボールドテキスト** __italictext__ 残高:10056.21ドルparse_mode=MARKDOWN結果はこうです:
AsHTMLフラグをtrueに設定することで答えが見つかりました...
bot.SendMessage(InpTelegramId,"<b>Balance: $10056.21</b>",true);
すみません...
どなたか、このライブラリを使って太字やイタリック体のフォントを試された方はいらっしゃいますか?
私は以下のように、**bold** __italic__をメッセージ内のマークダウンで試してみましたが、ダメでした...
"n**boldtext** __italictext__ Balance: $%s parse_mode=MARKDOWN"
**ボールドテキスト** __italictext__ 残高:10056.21ドルparse_mode=MARKDOWN結果はこうです: