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...
debes tener razón, y la captura de pantalla de postman, donde el par de salida se escribe en la cabecera de la solicitud http se explica de manera diferente )
sospecho que seguimos hablando de lo mismo, pero con palabras diferentes )
No sé qué tan mal escrito está el cartero, qué es y qué tiene que ver con tu problema...
pero el 90% se resuelve leyendo, y es la persona que resuelve el problema la que debe leerlo.
Es algo bastante típico - hay documentación del servicio Rest-API (¿lo has leído por cierto?) , tienes la suerte de que dieron un ejemplo con curl y no hay que parsear otros lenguajes... y tienes que usar WebRequest MT.
El curl se inicia, el protocolo se muestra en la pantalla - qué cabeceras de parámetros se generan y envían, qué se recibe de vuelta, cómo se entiende y dónde se pone.
Y es directamente visible lo que hay que enviar a WebRequest
No sé qué tan mal escrito está el cartero, ni qué es, ni qué tiene que ver con tu problema...
pero el 90% se resuelve leyendo, y es la persona que resuelve el problema la que debe leerlo.
Es algo bastante típico - hay documentación del servicio Rest-API (¿lo has leído por cierto?) , tienes la suerte de que dieron un ejemplo con curl y no hay que parsear otros lenguajes... y tienes que usar WebRequest MT.
El curl se inicia, el protocolo se muestra en la pantalla - qué cabeceras de parámetros se generan y envían, qué se recibe de vuelta, cómo se entiende y dónde se pone.
Y es directamente visible lo que hay que enviar a WebRequest
Creo que estoy llegando a algo con la autorización.
Roman, ¡gracias por el comentario! Creo que también nos las arreglaremos con la autorización.
Ahora sobre algunos parámetros. En la ayuda de WebRequest dice
[en] Cabeceras de consulta del tipo "clave: valor", separadas por un salto de línea "\r\n".
La propia variable headers es de tipo string
¿A qué te refieres con que la cadena contiene un carácter de salto de línea?
La cabecera puede contener más de una cadena de clave/valor, por lo que se utiliza un salto de línea. El doble guión"\N" debe colocarse al final de la cabecera. Así es como el servidor entiende el final de la cabecera, que es un estándar de http. Después del doble guión viene el cuerpo de la solicitud o respuesta. La funciónWebRequest separa estos bloques por comodidad. Para las cabeceras su propio parámetro, para el cuerpo el suyo propio. Pero la sintaxis de escribir la solicitud, requiere el cumplimiento de la norma 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 |//+------------------------------------------------------------------+voidOnStart()
{
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 Financeint 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");
}
elsePrint("Ошибка в FileOpen. Код ошибки =",GetLastError());
}
elsePrintFormat("Ошибка загрузки '%s', код %d",url,res);
}
}
//+------------------------------------------------------------------+
de este sitio webhttps://example-files.online-convert.com/audio/wav/example.wav
descarga este archivo "example.wav"
y después de descargarlo, reproducePlaySound("\Files\\\\ de ejemplo.wav");
-------------------------------------------------
Pero el significado de esta función es el de una función de la que no se puede prescindir. ¡No lo creo!
//+------------------------------------------------------------------+//| 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 |//+------------------------------------------------------------------+voidOnStart()
{
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");
}
elseprintf("Ошибка в FileOpen. Код ошибки =",GetLastError());
}
elseprintf("Ошибка загрузки '%s', код %d",url,res);
}
}
//+------------------------------------------------------------------+
En primer lugar, simplifiquemos al máximo el código de la propia solicitud. Dejemos sólo una cabecera: la autorización propiamente dicha, que sigue funcionando. En este caso, sin ninguna cabecera adicional, el servidor de IBM nos dará un flujo en formato de audio .ogg. Al diablo, pensamos, hagamos algo que funcione primero. Abandonemos los intentos inútiles de formatear el flujo a wav con cabeceras adicionales y tratemos con .ogg (por cierto, error similar con la sintaxis de WebRequesthttps://www.mql5.com/en/forum/310891#comment_16643324 )
El script se registra en el servidor y se cuelga. Bien, ejecutémoslo en modo de depuración o algo así...
¿Ves, no? )
Soltamos el script del gráfico, pero por alguna razón no deja de ejecutarse por completo, sino que interrumpe la WebRequest sincrónica y continúa, lo que generalmente nos beneficia.
Sigamos adelante. En char result[] tenemos ahora un flujo .ogg y lo escribimos en un archivo.
El archivo obtiene 6Kb también (además, porque la petición de curl o postman con los mismos parámetros devuelve un archivo .ogg de 6Kb, ¡que se reproduce correctamente! Es bueno escuchar la palabra Test ))))
Ahora escribimos toda la matriz de caracteres en el archivo. Especificar especialmente que no debemos medir el tamaño del array, sino tomarWHOLE_ARRAY.
Así es como se ve ahora:
El único problema es que el archivo curl se reproduce bien, pero nuestro archivo, por alguna razón, no.
Veamos el interior de ambos archivos
Archivo descargado por curl en la parte inferior, rellenado desde el flujo de WebRequest en el binario en la parte superior
¿Ves estas manchas 00000089, 00000004 en el archivo superior testmql5.ogg? ))) ¿Es un programa de bonos o qué? ))) ¿De dónde viene todo esto? ))))))))
Resumiendo
1. La sintaxis sigue siendo un misterio para mí. Sólo se ha conseguido autentificar al servidor, los intentos de añadir otras cabeceras han fallado hasta ahora
2. me pregunto si WebRequest recibe el flujo con salpicaduras, o si lo estoy escribiendo en un archivo de forma incorrecta, pero el formato de archivo .ogg obtenido del resultado de la matriz de caracteres mediante el método WebRequest es incorrecto.
Todo genial, ¡gracias! Pero el archivo wav debe ser generado por el motor TTS (TextToSpeech)
Lo tengo - debería funcionar ???
Синтез в реальном времени
Отправив текст для синтеза, ваш сервис или приложение сразу же получит в ответ аудиозапись: задержка настолько мала, что позволяет создавать программное обеспечение с потоковым воспроизведением.
1. La sintaxis sigue siendo un misterio para mí. Sólo se ha conseguido autentificar al servidor, los intentos de añadir otras cabeceras han fallado hasta ahora
2. me pregunto si WebRequest recibe el flujo con salpicaduras, o si lo estoy escribiendo en un archivo de forma incorrecta, pero el formato de archivo .ogg obtenido del resultado de la matriz de caracteres mediante el método WebRequest es incorrecto.
Los tomates podridos son bienvenidos.
Pensemos con lógica. Alexander demostró que el script descarga y reproduce el archivo desde el otro servidor normalmente. Por lo tanto, la webrequest está configurada correctamente. El único problema es la especificidad del servidor de IBM. Las peculiaridades de sus respuestas a las peticiones.
Creo que estoy llegando a algo con la autorización.
Así que pregúntale a Roman cómo hacer la autorización en el servidor de IBM conWebRequest, ¡esa es la pregunta clave!
Roman, ¡gracias por el comentario! Creo que también nos las arreglaremos con la autorización.
Ahora sobre algunos parámetros. En la ayuda de WebRequest se indica
[en] Cabeceras de consulta del tipo "clave: valor", separadas por un salto de línea "\r\n".
La propia variable headers es de tipo string
¿Qué quiere decir que la cadena contiene un carácter de salto de línea, es decir, el final de la cadena?
debes tener razón, y la captura de pantalla de postman, donde el par de salida se escribe en la cabecera de la solicitud http se explica de manera diferente )
sospecho que seguimos hablando de lo mismo, pero con palabras diferentes )
No sé qué tan mal escrito está el cartero, qué es y qué tiene que ver con tu problema...
pero el 90% se resuelve leyendo, y es la persona que resuelve el problema la que debe leerlo.
Es algo bastante típico - hay documentación del servicio Rest-API (¿lo has leído por cierto?) , tienes la suerte de que dieron un ejemplo con curl y no hay que parsear otros lenguajes... y tienes que usar WebRequest MT.
El curl se inicia, el protocolo se muestra en la pantalla - qué cabeceras de parámetros se generan y envían, qué se recibe de vuelta, cómo se entiende y dónde se pone.
Y es directamente visible lo que hay que enviar a WebRequest
---
No sé qué tan mal escrito está el cartero, ni qué es, ni qué tiene que ver con tu problema...
pero el 90% se resuelve leyendo, y es la persona que resuelve el problema la que debe leerlo.
Es algo bastante típico - hay documentación del servicio Rest-API (¿lo has leído por cierto?) , tienes la suerte de que dieron un ejemplo con curl y no hay que parsear otros lenguajes... y tienes que usar WebRequest MT.
El curl se inicia, el protocolo se muestra en la pantalla - qué cabeceras de parámetros se generan y envían, qué se recibe de vuelta, cómo se entiende y dónde se pone.
Y es directamente visible lo que hay que enviar a WebRequest
---
leer, leer ) Se están haciendo progresos.
Creo que estoy llegando a algo con la autorización.
Roman, ¡gracias por el comentario! Creo que también nos las arreglaremos con la autorización.
Ahora sobre algunos parámetros. En la ayuda de WebRequest dice
[en] Cabeceras de consulta del tipo "clave: valor", separadas por un salto de línea "\r\n".
La propia variable headers es de tipo string
¿A qué te refieres con que la cadena contiene un carácter de salto de línea?
La cabecera puede contener más de una cadena de clave/valor, por lo que se utiliza un salto de línea.
El doble guión"\N" debe colocarse al final de la cabecera.
Así es como el servidor entiende el final de la cabecera, que es un estándar de http.
Después del doble guión viene el cuerpo de la solicitud o respuesta.
La funciónWebRequest separa estos bloques por comodidad.
Para las cabeceras su propio parámetro, para el cuerpo el suyo propio.
Pero la sintaxis de escribir la solicitud, requiere el cumplimiento de la norma http.
de este sitio webhttps://example-files.online-convert.com/audio/wav/example.wav
descarga este archivo "example.wav"
y después de descargarlo, reproducePlaySound("\Files\\\\ de ejemplo.wav");
-------------------------------------------------
Pero el significado de esta función es el de una función de la que no se puede prescindir. ¡No lo creo!
Bueno, señores, sigamos adelante, ¿quieren?
En primer lugar, simplifiquemos al máximo el código de la propia solicitud. Dejemos sólo una cabecera: la autorización propiamente dicha, que sigue funcionando. En este caso, sin ninguna cabecera adicional, el servidor de IBM nos dará un flujo en formato de audio .ogg. Al diablo, pensamos, hagamos algo que funcione primero. Abandonemos los intentos inútiles de formatear el flujo a wav con cabeceras adicionales y tratemos con .ogg (por cierto, error similar con la sintaxis de WebRequesthttps://www.mql5.com/en/forum/310891#comment_16643324 )
El script se registra en el servidor y se cuelga. Bien, ejecutémoslo en modo de depuración o algo así...
¿Ves, no? )
Soltamos el script del gráfico, pero por alguna razón no deja de ejecutarse por completo, sino que interrumpe la WebRequest sincrónica y continúa, lo que generalmente nos beneficia.
Sigamos adelante. En char result[] tenemos ahora un flujo .ogg y lo escribimos en un archivo.
El archivo obtiene 6Kb también (además, porque la petición de curl o postman con los mismos parámetros devuelve un archivo .ogg de 6Kb, ¡que se reproduce correctamente! Es bueno escuchar la palabra Test ))))
Ahora escribimos toda la matriz de caracteres en el archivo. Especificar especialmente que no debemos medir el tamaño del array, sino tomarWHOLE_ARRAY.
Así es como se ve ahora:
El único problema es que el archivo curl se reproduce bien, pero nuestro archivo, por alguna razón, no.
Veamos el interior de ambos archivos
Archivo descargado por curl en la parte inferior, rellenado desde el flujo de WebRequest en el binario en la parte superior
¿Ves estas manchas 00000089, 00000004 en el archivo superior testmql5.ogg? ))) ¿Es un programa de bonos o qué? ))) ¿De dónde viene todo esto? ))))))))
Resumiendo
1. La sintaxis sigue siendo un misterio para mí. Sólo se ha conseguido autentificar al servidor, los intentos de añadir otras cabeceras han fallado hasta ahora
2. me pregunto si WebRequest recibe el flujo con salpicaduras, o si lo estoy escribiendo en un archivo de forma incorrecta, pero el formato de archivo .ogg obtenido del resultado de la matriz de caracteres mediante el método WebRequest es incorrecto.
Los tomates podridos son bienvenidos.
de este sitio webhttps://example-files.online-convert.com/audio/wav/example.wav
descarga este archivo "example.wav"
y después de descargarlo, reproducePlaySound("\Files\\\\ de ejemplo.wav");
-------------------------------------------------
Pero el significado de esta función es el de una función de la que no se puede prescindir. ¡No creo que tenga ningún sentido!
Alexsandr,
es genial, ¡gracias! Pero el archivo wav debe ser generado por el motor TTS (TextToSpeech)
Alexsandr,
Todo genial, ¡gracias! Pero el archivo wav debe ser generado por el motor TTS (TextToSpeech)
Lo tengo - debería funcionar ???
aquí hay algo similarhttps://cloud.yandex.ru/docs/speechkit/tts/request
...
Resumiendo
1. La sintaxis sigue siendo un misterio para mí. Sólo se ha conseguido autentificar al servidor, los intentos de añadir otras cabeceras han fallado hasta ahora
2. me pregunto si WebRequest recibe el flujo con salpicaduras, o si lo estoy escribiendo en un archivo de forma incorrecta, pero el formato de archivo .ogg obtenido del resultado de la matriz de caracteres mediante el método WebRequest es incorrecto.
Los tomates podridos son bienvenidos.