MQL5からのGoogleAppsScriptアプリケーションへのWebRequestが404エラーとなる

 

※teratailで同様の質問をしておりますが、回答を得られず、こちらでも質問させていただいております。

MT4、MT5からGoogleAppsScript(GAS)で作成したウェブアプリケーションへHttpsリクエストでアクセスし、スプレッドシートの値を取得するというシステムを構築しております。

MT4からのリクエストは正常にレスポンスを受信できるのですが、MT5からの呼出しのみ、レスポンスが以下の返却値とともに404エラーとなります。特定のアプリケーションからの呼出しはGoogle側でエラーを返却するなどの制約があるのでしょうか。ネットワーク周りの知見が不足しているため、お詳しい方にご助力いただきたいです。

MT5からの呼出しの場合も、リクエストは受信され、GASの処理は正常に終了している(MT4からの呼出し時と同じ結果となっている)ことはGASのログ出力より確認済みです。
したがって、GASの処理終了後、Google側のサーバからの返却時に、MT5からの呼出しの場合のみ何らかの理由でレスポンス内容がエラーページに差し替えられていると考えております。


MQL4(レスポンス値200)

//---
   string URL ="https://script.google.com/macros/s/AKfycbzPK3PZHrEDJLHuWfa02HC8JYz_gupr7afNJx3vldhzYOQvWF5ZYGqG2A/exec";
   string cookie=NULL,headers;
   char post[],result[];
   int res;
   string getURL=URL;
   res=WebRequest("GET",URL,cookie,NULL,500,post,0,result,headers);
   string resultstr="";
   for(int j=0; j<ArraySize(result); j++)
     {
      resultstr+=CharToStr(result[j]);

     }
   Print("res : "+IntegerToString(res));
   Print("result : "+resultstr);
   Print("headers : "+headers);


MQL5(レスポンス値404)

//---
   string URL ="https://script.google.com/macros/s/AKfycbzPK3PZHrEDJLHuWfa02HC8JYz_gupr7afNJx3vldhzYOQvWF5ZYGqG2A/exec";
   string cookie=NULL,headers;
   char post[],result[];
   int res;
   string getURL=URL;
   res=WebRequest("GET",URL,cookie,NULL,500,post,0,result,headers);
   string resultstr="";
   resultstr=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
   Print("res : "+IntegerToString(res));
   Print("result : "+resultstr);
   Print("headers : "+headers);

GAS(共通。doGet()内の戻り値返却箇所のみ抜粋)
MT5からの呼出し時も下記console.logに到達していること、および出力内容に問題がないことを確認済み

//スプレッドシート取得結果をjson変換
  var returnValue = JSON.stringify(rowData);
//返却値をログ出力
    console.log("【PJ_CPF_AuthUserGAS】"+returnValue);

  return ContentService.createTextOutput(returnValue);

MT5側(レスポンス404)のレスポンス内容は以下となります。

2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    res : 404
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    result : <!DOCTYPE html><html lang="ja"><head><meta name="description" content="ウェブ ワープロ、プレゼンテーション、スプレッドシート"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"><link rel="shortcut icon" href="//docs.google.com/favicon.ico"><title>ページが見つかりません</title><meta name="referrer" content="origin"><link href="//fonts.googleapis.com/css?family=Product+Sans" rel="stylesheet" type="text/css" nonce="QcLBj5wqchgMkSTHYCYHOQ"><style nonce="QcLBj5wqchg
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    .goog-inline-block{position:relative;display:-moz-inline-box;display:inline-block}* html .goog-inline-block{display:inline}*:first-child+html .goog-inline-block{display:inline}#drive-logo{margin:18px 0;position:absolute;white-space:nowrap}.docs-drivelogo-img{background-image:url('//ssl.gstatic.com/images/branding/googlelogo/1x/googlelogo_color_116x41dp.png');background-size:116px 41px;display:inline-block;height:41px;vertical-align:bottom;width:116px}.docs-drivelogo-text{color:#000;display:inline-block;opa
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    headers : Access-Control-Allow-Origin: *
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Pragma: no-cache
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Expires: Mon, 01 Jan 1990 00:00:00 GMT
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Date: Tue, 06 Jul 2021 17:45:28 GMT
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Content-Type: text/html; charset=utf-8
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Content-Encoding: gzip
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Referrer-Policy: origin
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    X-Content-Type-Options: nosniff
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    X-XSS-Protection: 1; mode=block
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Server: GSE
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
2021.07.07 02:45:27.937    HttpsTestGet (EURUSD,M1)    Transfer-Encoding: chunked


MT4(レスポンス200)内容は以下です。(MT5との仕様の違いにより出力順序が逆になっています。resultに"paramError"と出力されていますが、こちらはGASプログラムにおける業務例外のハンドリングのため想定通りの出力で、MT5からの呼出し時の期待結果でもあります)

2021.07.09 03:43:16.262 HttpsGetTest GBPUSD,H1: headers : HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Date: Thu, 08 Jul 2021 18:43:16 GMT
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/plain; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Accept-Ranges: none
Server: GSE
Vary: Accept-Encoding
Access-Control-Allow-Origin: *
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
X-XSS-Protection: 1; mode=block

2021.07.09 03:43:16.262 HttpsGetTest GBPUSD,H1: result : {"paramError":"E0002"}
2021.07.09 03:43:16.262 HttpsGetTest GBPUSD,H1: res : 200


宜しくお願い致します。

 

同じWebRequestですから、端末の種類で違いが出るとは思えません。

プログラムで異なるのはresultstrの取得方法だけですが、この部分をMT4と同じ方法で試してみましたか?

これ以外何も思いつかないので、これでもダメなら分かりません。

以下は関係あるかどうか分かりませんが、気になる部分です。

result[]はcharではなくucharです。

WHOLE_ARRAYは-1ですが、マニュアルにはWHOLE_ARRAYの使用に関しては記述がありません。

MetaTraderのUTF-8は日本語環境で使うと文字化けすることがあります。

 
Nagisa Unada:

同じWebRequestですから、端末の種類で違いが出るとは思えません。

プログラムで異なるのはresultstrの取得方法だけですが、この部分をMT4と同じ方法で試してみましたか?

これ以外何も思いつかないので、これでもダメなら分かりません。

以下は関係あるかどうか分かりませんが、気になる部分です。

result[]はcharではなくucharです。

WHOLE_ARRAYは-1ですが、マニュアルにはWHOLE_ARRAYの使用に関しては記述がありません。

MetaTraderのUTF-8は日本語環境で使うと文字化けすることがあります

ご回答ありがとうございます。

> 同じWebRequestですから、端末の種類で違いが出るとは思えません。

回答者様と同じ認識です。アプリケーション以外は同じ環境で実施しているため、完全に行き詰っている状況です。。

>プログラムで異なるのはresultstrの取得方法だけですが、この部分をMT4と同じ方法で試してみましたか?

はい、もともと同じコード(厳密にはMQL5はCharToStrがないためCharToString)にしており、レスポンスコードは同じく404でした。返却されたhtmlの日本語部分が文字化けしたため、QAに添付した内容に差し替えています。

>result[]はcharではなくucharです。

WebRequest - ネットワーク関数 - MQL5 リファレンス - MetaTrader 5 のためのアルゴリズムの/自動化されたトレーディング言語のリファレンス

上記ですとcharでの定義なのですが、ucharを使用すべきでしょうか?参照先のリファレンスなどあればご教示いただけると助かります。

※念のためucharでも試してみましたが、結果変わらず、本件との関連はなさそうです。

>WHOLE_ARRAYは-1ですが、マニュアルにはWHOLE_ARRAYの使用に関しては記述がありません。

おっしゃる通り定数での使用がリファレンスに記載されていないため、-1をオンコーディングしてみましたが、結果は変わらずでした。

>MetaTraderのUTF-8は日本語環境で使うと文字化けすることがあります。

ありがとうございます。本件とは関連ありませんでしたが、今後留意いたします。

MQL5のドキュメンテーション: ネットワーク関数 / WebRequest
MQL5のドキュメンテーション: ネットワーク関数 / WebRequest
  • www.mql5.com
WebRequest - ネットワーク関数 - MQL5 リファレンス - MetaTrader 5 のためのアルゴリズムの/自動化されたトレーディング言語のリファレンス
 

> 上記ですとcharでの定義なのですが、ucharを使用すべきでしょうか?参照先のリファレンスなどあればご教示いただけると助かります。

間違い。CharArrayToString の result でした。

理由: