そしてまた、DellとMarket - ページ 18

 

オーソライズでなんとなくわかってきた気がする。

Реter Konow:

IBMのサーバーでWebRequestを使って どのように認証を行うか、それが重要な問題 なのです。

Romanさん、コメント ありがとうございます! オーソライズもなんとかなりそうですね。

さて、いくつかのパラメータについて。WebRequestのヘルプには、次のように記載されています。

[クエリヘッダーのタイプは "key: value "で、改行で区切られる "week"。

変数 headers 自身は文字列型である

文字列に改行文字が含まれている、つまり文字列の終端があるというのはどういうことでしょうか?

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • www.mql5.com
Dozens of new automated trading applications appear in the MQL5 Market every day. Choose the right app among 10,000 products and forget about unnecessary routine operations of manual trading. Sell your algorithmic trading programs through the largest store of trading applications! Kiss on billions on EURUSD The provided robot (KOB) is a result...
 
Nikolai Karetnikov:

というのは、postmanのスクリーンショットでは、httpリクエストヘッダに出力ペアが書かれていますが、これとは別の説明になっていますね )

同じことを話しているようで、違う言葉になっていますね )

postmanの書き方が悪いのか、何が悪いのか、あなたの問題とどう関係があるのか、わからないのですが...。

が、9割は読めば解決するもので、読むのは解決する人次第。

Rest-APIサービスのドキュメントがあり(読んだことある?)、curlを使った例があり、他の言語を解析する必要がないのが幸いで、WebRequest MTを使わなければならない、というごく典型的なものです。

curlが起動すると、パラメータからどのようなヘッダを生成して送信し、何が返ってきて、それをどのように理解し、どこに置くかというプロトコルが画面に表示されます。

そして、WebRequest に何を送信するかが直接表示されます。

---

 
Maxim Kuznetsov:

ポストマンの書き方が悪いのか、何なのか、あなたの問題とどう関係があるのかわかりませんが...。

が、9割は読めば解決するもので、読むのは解決する人次第です。

Rest-APIサービスのドキュメントがあり(読んだことある?)、curlを使った例があり、他の言語を解析する必要がないのが幸いで、WebRequest MTを使わなければならない、というごく典型的なものです。

curlが起動すると、パラメータからどのようなヘッダを生成して送信し、何が返ってきて、それをどのように理解し、どこに置くかというプロトコルが画面に表示されます。

そして、WebRequest に何を送信するかが直接表示されます。

---

read, read )把握し、前進している。

 
Nikolai Karetnikov:

そこまで行っているつもりです。

Romanさん、コメント ありがとうございます。オーソライズもなんとかなりそうですね。

さて、いくつかのパラメータについて。WebRequestのヘルプには、次のように書かれています。

[クエリヘッダーのタイプは "key: value "で、改行で区切られる "week"。

変数 headers 自身は文字列型である

文字列に改行文字が含まれている、つまり、改行文字があるというのはどういうことですか?

ヘッダには複数のキー/バリュー文字列が含まれる場合があるため、改行が使用される。
ヘッダーの最後には必ずダブルハイフン" \rn" を入れてください。
これはサーバーがヘッダーの終わりを理解する方法であり、httpの規格である。
ダブルハイフンの後には、リクエストまたはレスポンスのボディが来る。

WebRequest
関数では、利便性を考慮してこれらのブロックを分離しています。
ヘッダは独自のパラメータ、ボディは独自のパラメータ。
しかし、リクエストを書く構文は、標準的なhttpに準拠する必要があります。

 
続けてくれ、中尉
 

//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://example-files.online-convert.com/audio/wav/example.wav";
//--- для работы с сервером необходимо добавить URL "https://finance.yahoo.com"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,5000,post,0,result,headers);
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
         //PrintFormat("Заголовки сервера: %s",headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("example.wav",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- закрываем файл
            FileClose(filehandle);
            Sleep(1*1000);
            PlaySound("\\Files\\example.wav");
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,res);
     }
  }
//+------------------------------------------------------------------+

本サイトよりhttps://example-files.online-convert.com/audio/wav/example.wav

このexample.wav ファイルをダウンロードします。

で、ダウンロードした後にPlaySound("gucci.wav") を再生します。

-------------------------------------------------

しかし、この機能の意味するところは?そんなことはない!

 

さて、皆さん、次にいきましょうか。


//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   char cost_char_data[];
   string  result_headers;
   
   ResetLastError();
   ArrayFree(result);
  // headers = "Authorization: Basic YXBpa2V5OkdSMWJiM3pWTXM5ZmNOS0w2cEE5LTV6ajlwdFdsaUN1NmVoOW91cFVucFpC/r/n";
   headers = "Authorization: Basic YXBpa2V5OkdSMWJiM3pWTXM5ZmNOS0w2cEE5LTV6ajlwdFdsaUN1NmVoOW91cFVucFpC";
//   headers = headers + "Accept: audio/wav";
   //headers = headers + "Accept: audio/wav/r/n";
  // headers = headers + "Accept: audio/wav/r/n";
 
   string url="https://api.eu-gb.text-to-speech.watson.cloud.ibm.com/instances/9886a3ce-5734-455f-8f78-7a56381da686/v1/synthesize?text=TEST";
               
   int res = WebRequest("GET",url,headers,1000,cost_char_data,result,result_headers);

   if(res==-1)
     {
      printf("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         printf("Файл успешно загружен, размер %d байт.",ArraySize(result));
         printf("Заголовки сервера: %s",result_headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("testmql5.ogg",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,WHOLE_ARRAY);
            //--- закрываем файл
            FileClose(filehandle);
            printf("FileClose");
            
           }
         else
            printf("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         printf("Ошибка загрузки '%s', код %d",url,res);
     }
  }
//+------------------------------------------------------------------+


まず、リクエストのコード自体をできるだけ簡略化しましょう。ヘッダーは1つだけにして、認証そのものを残しておきましょう。この場合、追加のヘッダなしで、IBMサーバーは.oggオーディオフォーマットのストリームを提供します。そんなことより、まずは何か作ってみよう、と考えるのです。ヘッダを追加してストリームをwavにフォーマットする無駄な試みはやめて、.oggに対応しましょう(ちなみに、WebRequest構文でも同様のミスがありましたhttps://www.mql5.com/en/forum/310891#comment_16643324 )

スクリプトがサーバーにログインしてハングアップしてしまう。よし、デバッグモードとかで動かしてみよう...。

ほらね)


グラフからスクリプトを削除しましたが、なぜか完全に実行を停止せず、同期 WebRequest を中断して続行します。

前に進みましょう。char result[]に.oggのストリームがあるので、それをファイルに書き出します。

ファイルも6Kbになります(同じパラメータでcurlやpostmanのクエリが6Kbの.oggファイルを返すので、ちゃんと再生されます!)。テストという言葉が聞けてよかったです ))))


ここで、すべてのchar配列をファイルに書き出します。配列のサイズを測定するのではなく、WHOLE_ARRAYを 取ることを特別に指定します。

それが今の姿です。

ただ、問題は、curlのファイルは問題なく再生されるのですが、私たちのファイルは、なぜか再生されないのです。

両ファイルの中身を見てみましょう。



下側にcurlでダウンロードしたファイル、上側にWebRequestのストリームからバイナリに充填されたファイル

トップファイルtestmql5.oggにある00000089, 00000004のブロブを見てください。)))ボーナスプログラムか何かですか?)))どこから来たんだろう )))))))))))))))))))))))))))))))))))))


まとめ

1.構文がまだ謎です。サーバーへの認証にのみ成功し、他のヘッダーを追加する試みは今のところ失敗しています。

2. WebRequestがふりかけ付きのストリームを受信しているのか、ファイルへの書き込みが間違っているのか、WebRequestメソッドでchar配列の結果から得られる.oggファイルフォーマットが間違っている。

ロッテトマト大歓迎

Send headers via WebRequest()
Send headers via WebRequest()
  • 2019.04.15
  • www.mql5.com
Hi, I am trying to use WebRequest to send a header and get a response. Basically I have the follow parameters: url: "http://www.b3.com.br/main...
 
Alexsandr San:

本サイトよりhttps://example-files.online-convert.com/audio/wav/example.wav

このexample.wav ファイルをダウンロードします。

で、ダウンロードした後にPlaySound("gucci.wav") を再生します。

-------------------------------------------------

しかし、この機能の意味するところは?意味がないと思う!?

アレクサンドル

それは素晴らしい、ありがとうございますただし、wavファイルはTTSエンジン(TextToSpeech)で生成する必要があります。

 
Nikolai Karetnikov:

アレクサンドル

すべて素晴らしい、ありがとうございますただし、wavファイルはTTSエンジン(TextToSpeech)で生成する必要があります。

私はそれを得た - それは動作するはずです?

Синтез в реальном времени
Отправив текст для синтеза, ваш сервис или приложение сразу же получит в ответ аудиозапись: задержка настолько мала, что позволяет создавать программное обеспечение с потоковым воспроизведением.

撮影者

以下は類似のものですhttps://cloud.yandex.ru/docs/speechkit/tts/request

 
Nikolai Karetnikov:

...

まとめ

1.構文がまだ謎です。サーバーへの認証にのみ成功し、他のヘッダーを追加する試みは今のところ失敗しています。

2. WebRequestがふりかけ付きのストリームを受信しているのか、ファイルへの書き込みが間違っているのか、WebRequestメソッドでchar配列の結果から得られる.oggファイルフォーマットが間違っている。

ロッテトマト大歓迎

論理的に考えよう。Alexanderは、スクリプトが他のサーバーからファイルを正常にダウンロードし、再生することを示しました。したがって、Webrequestは正しく設定されています。ただ、問題はIBMのサーバーの仕様です。要求に対する応答の特殊性。