English Русский 中文 Español Deutsch Português
ネイティブTwitterクライアント: 第2部

ネイティブTwitterクライアント: 第2部

MetaTrader 5 | 21 9月 2020, 09:35
13 543 0
Soewono Effendi
Soewono Effendi

はじめに

最初の記事「DLLなしのMT4およびMT5のネイティブTwitterクライアント」で約束したように、この記事ではTwitter APIを使用して写真付きのツイートの送信を試みます。記事を理解しやすく簡単に保つために、画像のアップロードのみに焦点を当てます。この記事の終わりまでには、外部DLLを使用せずに機能するTwitterクライアントができて、最大4枚の写真つきのメッセージをツイートできます。写真の枚数の上限(4枚)は、パラメータmedia_idsで説明されているように、Twitter APIによって設定されています。


写真のアップロード

動画またはアニメーションGIFのような大きなメディアファイルをアップロードするためにはチャンクアップロードと呼ばれる新しい、より適した方法がありますが、ここでは、画像のアップロードのみに制限されているシンプルな方法に焦点を当てます。

Twitterのメディアタイプとサイズの制限をよく理解してください。

Twitterへの写真のアップロードは、基本的にシンプルなOAuth認証のPOSTされたHTTP multipartとform-dataです。これについては、次の段落で説明します。アップロードされた写真はそれぞれmedia_idを返します。このmedia_idは、ツイートに含めて公開できるようにするために、一定の時間内のみ有効です。

最大4枚の写真を公開するために、返されるすべてのmedia_idは、カンマ区切りのリストとして単純に結合されます。

写真付きのメッセージをツイートする手順は次のとおりです。

  1. 写真をアップロードし、返されたmedia_idを収集します。
  2. 最大4枚をアップロートするまでアップロードを繰り返します。常に返されたmedia_idを収集します。
  3. ツイートメッセージを準備します。
  4. 含めるすべてのmedia_idのコンマ区切りリストを使用してツイートを送信するときに、media_idsを指定します。
注意事項:
コードをシンプルでわかりやすくするために、エラー処理は省略されています。


HTTP multipart/form-data

Twitterに写真をアップロードするには、生のバイナリデータまたはBase64エンコード文字列として写真をアップロードできます。Base64でエンコードされた文字列はサイズが約3倍大きくなるため、生のバイナリデータの使用をお勧めします。

HTTP multipart / form-dataメソッドはRFC-2388で明確に定義されていますが、このcurlの素敵なチュートリアルを読むと理解しやすいかもしれません。基本的に、前述の記事から引用すると、「これは、MIME境界で区切られた一連の「パーツ」として特別にフォーマットされたリクエスト本文で送信されるHTTP POSTリクエストです。」

POST /submit.cgi HTTP/1.1
Host: example.com
User-Agent: curl/7.46.0
Accept: */*
Content-Length: 313
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------d74496d66958873e

--------------------------d74496d66958873e
Content-Disposition: form-data; name="person"

anonymous
--------------------------d74496d66958873e
Content-Disposition: form-data; name="secret"; filename="file.txt"
Content-Type: text/plain

contents of the file
--------------------------d74496d66958873e--


Twitterクラスの実装は次のとおりです。

   void              appendPhoto(string filename, string hash, uchar &data[],
                                 bool common_flag=false)
     {
      int flags=FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ;
      if(common_flag)
         flags|=FILE_COMMON;
      //---
      int handle=FileOpen(filename,flags);
      if(handle==INVALID_HANDLE)
         return;
      //---
      int size=(int)FileSize(handle);
      uchar img[];
      ArrayResize(img,size);
      FileReadArray(handle,img,0,size);
      FileClose(handle);
      int pos = ArraySize(data);
      int offset = pos + size;
      int hlen = StringLen(hash)+6;
      int newlen = offset + hlen;
      ArrayResize(data, newlen);
      ArrayCopy(data, img, pos);
      StringToCharArray("\r\n--"+hash+"\r\n", data, offset, hlen);
     }

上記のコードは、画像ファイルの未加工のバイナリデータをHTTP multipart / form-data POSTの「パーツ」に追加します。POSTの「エンベロープ」は、TwitterアップロードAPIパラメータ「media」が指定された次のコードで実行されます。

   string              uploadPhoto(string filename)
     {
      // POST multipart/form-data
      string url = "https://upload.twitter.com/1.1/media/upload.json";
      //string url = "https://httpbin.org/anything";
      string params[][2];
      string query = oauthRequest(params, url, "POST");
      string o = getOauth(params);
      string custom_headers = "Content-Type: multipart/form-data;"
                              " boundary=";
      string boundary = getNonce();
      StringAdd(custom_headers, boundary); // use nonce as boundary string
      StringAdd(custom_headers, "\r\n");
      string headers = getHeaders(o, custom_headers, "upload.twitter.com");

      //string query = getQuery(params, url);
      //Print(query);
      uchar data[];
      string part = "\r\n--";
      StringAdd(part, boundary);
      StringAdd(part, "\r\nContent-Disposition: form-data;"
                " name=\"media\"\r\n\r\n");
      StringToCharArray(part, data, 0, StringLen(part));
      appendPhoto(filename, boundary, data);
      string resp = SendRequest("POST", url, data, headers);;
      if(m_verbose)
        {
         SaveToFile(filename + "_post.txt", data);
         Print(resp);
        }
      return (getTokenValue(resp, "media_id"));
     }

構築されたHTTP multipart / form-dataをさらに検査および検証するには、HTTPリクエストをファイルとしてMT端末のデータフォルダに保存できます。


写真付きツイート

単純な目的で、単純な関数getTokenValue()を使用して、TwitterアップロードAPIによって返されたmedia_idを取得します。MQL5.comで入手可能な優れたJSONライブラリの使用を検討してください。 

次のコードは、Twitterクラスを使用する非常に単純な方法を示しています。関数Screenshots()は、現在開いているチャートのスクリーンショットを取得し、単純なツイートメッセージを作成します。最大4つのチャートが選択されます。
各スクリーンショットはファイルとして保存され、そのファイル名は文字列配列fnamesに返されます。

スクリーンショットは1つずつアップロードされ、返されたmedia_idが収集され、カンマ区切りのリストとしてまとめられます。
このカンマ区切りのリストでmedia_idsパラメータを指定することにより、ツイートにスクリーンショットを添付してツイートメッセージを投稿します。

これだけです。

   CTwitter tw(consumer_key, consumer_secret,
               access_token, access_secret, verbose);

   // Gather information
   string fnames[4];
   string msg;
   Screenshots(fnames, msg);

   // Upload screenshots
   int n = ArraySize(fnames);
   int i = n - 1;
   // create comma separated media_ids
   string medias = tw.uploadPhoto(fnames[i]);
   for(i= n - 2; i>=0; i--)
   {
      StringAdd(medias, ",");
      StringAdd(medias, tw.uploadPhoto(fnames[i]));
   }
   
   // Send Tweet with photos' ids
   string resp = tw.tweet(msg, medias);
   Print(resp);


Twitterクラス

Twitter.mqhにあるTwitterクラスは、他のインクルードファイルから独立して自己完結することを目標に開発されています。写真付きのツイートを送信するには、1つのファイルで十分です。

まず、開発中のデバッグに役立つオプションの詳細フラグを使用して、コンシューマーとアクセストークンを指定してTwitterオブジェクトをインスタンス化します。

   CTwitter tw(consumer_key, consumer_secret,
               access_token, access_secret, verbose);

次に、利用可能なパブリック関数の呼び出しを試みます。

  • verifyCredentials() 
    アクセストークンのTwitter IDを返します。
  • uploadPhoto()
    写真をアップロードし、そのmedia_idを返します。
  • tweet()
    オプションのmedia_idsを付けてツイートを送信します。

いくつかのヘルパー関数があります。

  • getTokenValue()
    json文字列からトークン/パラメータの値を返します。
    : これは非常に単純な文字列解析です。jsonとの完全な互換性は期待できません。
  • unquote()
    文字列から引用符を削除します。


チャートをツイートする

添付されているのは、最大4つのチャートのスクリーンショットを取り、チャートの銘柄とOHLCV値の簡単なツイートメッセージを作成する、機能するMT5スクリプトです。
これは、独自のエキスパートやスクリプトの開発を始めるための簡単な例です。
注:

コンシューマー、アクセストークン、シークレットは独自に指定してください。

以下は、スクリプトによって送信されるツイートの例です。

MT5から送信された写真付きツイート

図1: MT5から送信された写真付きツイート


TwitterでのフルサイズMT5チャート

図2: TwitterでのフルサイズMT5チャート 


もちろん、写真を添付することもできます;)

招き猫のツイート

図3.招き猫のツイート


結論

チャートとシグナルを簡単に公開するために、自己完結型のインクルードファイルとして簡単で使いやすいTwitterクラスを用意しました。関連する技術的な詳細は、容易に理解できるように提示されています。

このTwitterクラスは完成には程遠く、クラスに追加できる他の多くのTwitter APIがあります。MQL5コミュニティの利益のためにコメントに改善を投稿してください。

この記事をお楽しみください。書くのは楽しかったです。
提供したコードを楽しさとそして利益のため使用できることを願っています。

お楽しみください。


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/8318

添付されたファイル |
Twitter.mqh (19.77 KB)
TwitterDemo.mq5 (4.87 KB)
手動のチャート作成および取引ツールキット(第I部)準備: 構造の説明とヘルパークラス 手動のチャート作成および取引ツールキット(第I部)準備: 構造の説明とヘルパークラス
これは連載最初の記事で、キーボードショートカットを使用してチャートグラフィックを手動で適用できるツールキットについて説明します。1つのキーを押すとトレンドラインが表示され、別のキーを押すと、必要なパラメータを備えたフィボナッチファンが作成されるという、非常に便利なものです。時間枠の切り替え、レイヤーの再配置、チャートのすべてのオブジェクトの削除もおこなえます。
DLLなしのMT4およびMT5用ネイティブTwitterクライアント DLLなしのMT4およびMT5用ネイティブTwitterクライアント
ツイートにアクセスしたり、Twitterに取引シグナルを投稿したりしたかったことがおありですか?検索をおやめください。この連載では、DLLを使用せずにそれを行う方法を示します。MQLを使用してTweeter APIを実装する旅をお楽しみください。この第1部では、Twitter APIにアクセスする際の認証と承認の栄光の道をたどります。
DoEasyライブラリの時系列(第44部): 指標バッファオブジェクトのコレクションクラス DoEasyライブラリの時系列(第44部): 指標バッファオブジェクトのコレクションクラス
この記事では、指標バッファオブジェクトのコレクションクラスの作成について説明しています。指標用の任意の数のバッファを作成して操作する機能をテストします(MQL指標で作成できるバッファの最大数は512です)。
MQLプログラムをグラフィカルに表示するためのマークアップツールとしてのMQL(その3)。 フォームデザイナー MQLプログラムをグラフィカルに表示するためのマークアップツールとしてのMQL(その3)。 フォームデザイナー
本論文では、MQLの構造を利用してMQLプログラムのウィンドウインタフェースを構築する概念の説明をします。 特殊なグラフィカル・エディタでは、GUI要素の基本クラスで構成されるレイアウトをインタラクティブに設定し、MQLにエクスポートしてMQLプロジェクトで使用することができます。 本論文では、エディタの内部設計とユーザーガイドを紹介します。 ソースコードも添付します。