質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

解決済

2回答

2937閲覧

【MT4】LineNotifyの画像送信方法で400Error

t-_.

総合スコア55

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2022/03/25 06:08

前提・実現したいこと

WebRequestを使って、画像を送りたいです。
APIdocを参考に書いたのですが、400エラーになりうまくいきません。
https://notify-bot.line.me/doc/ja/

発生している問題・エラーメッセージ

result_text : {status:400,message:message: 遨コ隕∫エ縺ッ險ア蜿ッ縺輔l縺ヲ縺・∪縺帙s}

該当のソースコード

#define END_POINT_URL "https://notify-api.line.me/api/notify" #define LINE_TOKEN "TOKEN" void line() { //string img = "Screenshot.jpg"; //string path = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\" + img; char message_data[], result[], temp[]; int filehandle = FileOpen( "Screenshot.jpg", FILE_READ | FILE_BIN ); if( filehandle != INVALID_HANDLE ) { FileReadArray( filehandle, temp ); Alert( "size : " + ArraySize( temp ) ); }else{ Alert( "error" ); } string message_text = ""; string RequestMethod = "POST"; //string headers = "Content-Type: image/jpg" + "\r\n"; //string headers = "Content-Type: application/x-www-form-urlencoded" + "\r\n"; //string headers = "Content-Type: application/json" + "\r\n"; string headers = "Content-Type: multipart/form-data" + "\r\n"; headers += "Authorization: Bearer " + LINE_TOKEN + "\r\n\r\n"; int timeout = 10000; string result_headers = NULL; message_text = "message="; message_text += "testmessage"; message_text += "&imageFile="; message_text += CharArrayToString( temp ); Alert( message_text ); StringToCharArray( message_text,message_data, 0 );//,0, StringLen(message_text) ); int res = WebRequest(RequestMethod, END_POINT_URL, headers, timeout, message_data, result, result_headers); if(res==-1) { Print("Error in WebRequest. Error code =",GetLastError()); return; } else { string result_text = StringConcatenate(CharArrayToString(result,0,ArraySize(result))); int replaced = StringReplace(result_text,"\"",""); Alert( "result_text : " + result_text ); } }

試したこと

APIを見て思った事
・Content-Typeは2種類しか使えない
・画像は、jpg, pngしか送信できない。
・messageは必須
これを踏まえて書いたのですが、うまくいきませんでした。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Content-Dispositionなどのヘッダも指定する必要があります。

c++

1// スクリプト 2#property strict 3 4#define END_POINT_URL "https://notify-api.line.me/api/notify" 5#define LINE_TOKEN "TOKEN" 6 7void sendImage(const string message, const string imagePath) 8{ 9 char imageData[]; 10 11 int filehandle = FileOpen(imagePath, FILE_READ | FILE_BIN); 12 if (filehandle != INVALID_HANDLE) 13 { 14 FileReadArray(filehandle, imageData); 15 FileClose(filehandle); 16 } 17 else 18 { 19 PrintFormat("Error %d", GetLastError()); 20 return; 21 } 22 23 string RequestMethod = "POST"; 24 25 string boundary = "boundary-data-123456789"; // 区切り用の文字列 26 27 string imageHeader; 28 imageHeader += StringFormat("--%s\r\n", boundary); 29 imageHeader += StringFormat("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n", "imageFile", imagePath); 30 imageHeader += StringFormat("Content-Type: image/jpeg\r\n\r\n", ""); 31 32 string messageHeader; 33 messageHeader += StringFormat("--%s\r\n", boundary); 34 messageHeader += StringFormat("Content-Disposition: form-data; name=\"%s\"\r\n", "message"); 35 messageHeader += StringFormat("Content-Type: text/plain; charset=\"utf-8\"\r\n\r\n", ""); 36 37 string messageText = StringFormat("%s\r\n", message); 38 39 string footer = StringFormat("\r\n--%s--\r\n", boundary); 40 41 // 日本語を含むのでバイナリ化してから終端文字を削除する 42 char messageData[]; 43 StringToCharArray(messageText, messageData, 0, WHOLE_ARRAY, CP_UTF8); 44 ArrayResize(messageData, ArraySize(messageData) - 1); 45 46 char messageHeaderData[]; 47 StringToCharArray(messageHeader, messageHeaderData, 0, StringLen(messageHeader), CP_UTF8); 48 49 char imageHeaderData[]; 50 StringToCharArray(imageHeader, imageHeaderData, 0, StringLen(imageHeader), CP_UTF8); 51 52 char footerData[]; 53 StringToCharArray(footer, footerData, 0, StringLen(footer), CP_UTF8); 54 55 int length = ArraySize(messageHeaderData) + ArraySize(messageData) + ArraySize(imageHeaderData) + ArraySize(imageData) + ArraySize(footerData); 56 57 string headers; 58 headers += StringFormat("Content-Type: multipart/form-data; boundary=%s\r\n", boundary); 59 headers += StringFormat("Content-Length: %d\r\n", length); 60 headers += StringFormat("Authorization: Bearer %s\r\n\r\n", LINE_TOKEN); 61 62 char sendData[]; 63 ArrayCopy(sendData, messageHeaderData, ArraySize(sendData)); 64 ArrayCopy(sendData, messageData, ArraySize(sendData)); 65 ArrayCopy(sendData, imageHeaderData, ArraySize(sendData)); 66 ArrayCopy(sendData, imageData, ArraySize(sendData)); 67 ArrayCopy(sendData, footerData, ArraySize(sendData)); 68 69 char result[]; 70 string result_headers = NULL; 71 int timeout = 10000; 72 int res = WebRequest(RequestMethod, END_POINT_URL, headers, timeout, sendData, result, result_headers); 73 74 if(res == -1) 75 { 76 Print("Error in WebRequest. Error code = ", GetLastError()); 77 } 78 else 79 { 80 string result_text = StringConcatenate(CharArrayToString(result, 0, ArraySize(result))); 81 int replaced = StringReplace(result_text, "\"", ""); 82 Print("result_text : " + result_text); 83 } 84} 85 86void OnStart() 87{ 88 sendImage("画像テスト", "Screenshot.jpg"); 89} 90

投稿2022/03/25 10:36

mah

総合スコア591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t-_.

2022/03/25 19:41

苦労したので、感動しました。 ありがとうございます!!
guest

0

自己解決

miss
---###

投稿2022/03/25 19:29

編集2022/03/25 19:43
t-_.

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問