JonF Posted November 11 Share Posted November 11 (edited) I'm trying to upload to a text-to-speech website. (Beege rewrite of Curl.au3). expandcollapse popup#include <Date.au3> #include <WinAPIDiag.au3> #include <Curl\Curl.au3> Test() Func Test() ;Create an array of request headers Local $arrHeaders = Curl_Slist_Append(0, "Accept: application/json") $arrHeaders = Curl_Slist_Append($arrHeaders, "Content-Type: application/json") ;Set up and execute cURL request $hCurl = Curl_Easy_Init() If Not $hCurl Then Return MsgBox($MB_ICONERROR, "Error", "Curl_Easy_Init() failed.") Curl_Easy_Setopt($hCurl, $CURLOPT_URL, "https://speechgen.io/index.php?r=api/text") Curl_Easy_Setopt($hCurl, $CURLOPT_HTTPHEADER, $aHeaders) Curl_Easy_Setopt($hCurl, $CURLOPT_USERAGENT, "AutoIt/cURL") Curl_Easy_Setopt($hCurl, $CURLOPT_VERBOSE, 1) Curl_Easy_Setopt($hCurl, $CURLOPT_SSL_VERIFYPEER, 0) Curl_Easy_Setopt($hCurl, $CURLOPT_READFUNCTION, Curl_DataReadCallback()) Curl_Easy_Setopt($hCurl, $CURLOPT_CUSTOMREQUEST, "PUT") Curl_Easy_Setopt($hCurl, $CURLOPT_UPLOAD, 1) $data = '{"Token":"{redacted}","email":"email@gmail.com","voice":"Ostap","format":"mp3","speed":"0.8","emotion":"good", _ "pause_sentence":"300","pause_paragraph":"400","bitrate":"48000",' $data = $data & '"text":"' & 'Heo світ' & '"}' ConsoleWrite(@crlf & $data & @crlf & @crlf) Curl_Easy_Setopt($hCurl, $CURLOPT_POSTFIELDS, $data) ;Get response code and response $iRespCode = Curl_Easy_Perform($hCurl) If $iRespCode <> $CURLE_OK Then Return ConsoleWrite("Status Message: " & Curl_Easy_StrError($iRespCode) & @LF) $sResponse = BinaryToString(Curl_Data_Get($hCurl)) ;Clean up curl environment Curl_Easy_Cleanup($hCurl) Curl_Data_Cleanup($hCurl) ;Display response ConsoleWrite($sResponse & @CRLF) EndFunc ;==>Test The result is: expandcollapse popup* Host speechgen.io:443 was resolved. * IPv6: (none) * IPv4: 5.45.72.182 * Trying 5.45.72.182:443... * ALPN: curl offers h2,http/1.1 * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / [blank] / UNDEF * ALPN: server accepted http/1.1 * Server certificate: * subject: CN=speechgen.io * start date: Sep 15 23:13:56 2024 GMT * expire date: Dec 14 23:13:55 2024 GMT * subjectAltName: host "speechgen.io" matched cert's "speechgen.io" * issuer: C=US; O=Let's Encrypt; CN=R10 * SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway. * Certificate level 0: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * Certificate level 1: Public key type ? (2048/112 Bits/secBits), signed using sha256WithRSAEncryption * Connected to speechgen.io (5.45.72.182) port 443 * using HTTP/1.x > PUT /index.php?r=api/text HTTP/1.1 Host: speechgen.io User-Agent: AutoIt/cURL Accept: */* Content-Type: application/json Content-Length: 4 * upload completely sent off: 4 bytes < HTTP/1.1 200 OK < Server: nginx/1.14.1 < Date: Mon, 11 Nov 2024 16:06:28 GMT < Content-Type: text/html; charset=UTF-8 < Transfer-Encoding: chunked < Connection: keep-alive < X-Powered-By: PHP/7.3.33 < Access-Control-Allow-Origin: * < Access-Control-Allow-Methods: GET, POST < Access-Control-Allow-Headers: X-Requested-With < Expires: Thu, 19 Nov 1981 08:52:00 GMT < Cache-Control: no-store, no-cache, must-revalidate < Pragma: no-cache < Set-Cookie: PHPSESSID=e271ada2cc0504802aa013ef915dfc55; path=/ < * Connection #0 to host speechgen.io left intact {"id":0,"status":-1,"file":"","file_cors":"","parts":0,"parts_done":0,"duration":0,"format":"mp3","error":"Data is empty , use Post or Get request","balans":0} Apparently it's not getting my data as a POST request?? Edited November 11 by JonF Link to comment Share on other sites More sharing options...
ioa747 Posted November 11 Share Posted November 11 Is this ok? Curl_Easy_Setopt($hCurl, $CURLOPT_HTTPHEADER, $aHeaders) I know that I know nothing Link to comment Share on other sites More sharing options...
JonF Posted November 11 Author Share Posted November 11 It appears to be correct. CURLOPT_HTTPHEADER explained Link to comment Share on other sites More sharing options...
JonF Posted November 11 Author Share Posted November 11 I got the base code from the bottom of https://www.autoitscript.com/forum/topic/207859-curl-udf-libcurl-with-x64-support/page/2/#comments. It wasn't working. The coment that fixed it was on the next page. Quote Try using copy post field instead of post field But I can't figure out what that means. Link to comment Share on other sites More sharing options...
ioa747 Posted November 11 Share Posted November 11 (edited) I don't know about the script, it just clicked my eye, that $aHeaders is not defined anywhere in the script. Did you mean $arrHeaders ? Edited November 11 by ioa747 I know that I know nothing Link to comment Share on other sites More sharing options...
JonF Posted November 12 Author Share Posted November 12 Ah, you're right. It's a mistake from the original source. Thanks. Alas, fixing it doesn't change anything. Link to comment Share on other sites More sharing options...
Developers Jos Posted November 12 Developers Share Posted November 12 Did you also fix this line?: $data = '{"Token":"{redacted}","email":"email@gmail.com","voice":"Ostap","format":"mp3","speed":"0.8","emotion":"good", _ "pause_sentence":"300","pause_paragraph":"400","bitrate":"48000",' which should be: $data = '{"Token":"{redacted}","email":"email@gmail.com","voice":"Ostap","format":"mp3","speed":"0.8","emotion":"good",' & _ '"pause_sentence":"300","pause_paragraph":"400","bitrate":"48000",' Try something like this and see what that does: expandcollapse popup#include <Date.au3> #include <WinAPIDiag.au3> #include <Curl\Curl.au3> Test() Func Test() ;Create an array of request headers Local $arrHeaders = Curl_Slist_Append(0, "Accept: application/json") $arrHeaders = Curl_Slist_Append($arrHeaders, "Content-Type: application/json") ;Set up and execute cURL request $hCurl = Curl_Easy_Init() If Not $hCurl Then Return MsgBox($MB_ICONERROR, "Error", "Curl_Easy_Init() failed.") Curl_Easy_Setopt($hCurl, $CURLOPT_URL, "https://speechgen.io/index.php?r=api/text") Curl_Easy_Setopt($hCurl, $CURLOPT_HTTPHEADER, $arrHeaders) Curl_Easy_Setopt($hCurl, $CURLOPT_USERAGENT, "AutoIt/cURL") Curl_Easy_Setopt($hCurl, $CURLOPT_VERBOSE, 1) Curl_Easy_Setopt($hCurl, $CURLOPT_SSL_VERIFYPEER, 0) Curl_Easy_Setopt($hCurl, $CURLOPT_READFUNCTION, Curl_DataReadCallback()) ;Curl_Easy_Setopt($hCurl, $CURLOPT_CUSTOMREQUEST, "PUT") ;Curl_Easy_Setopt($hCurl, $CURLOPT_UPLOAD, 1) $data = '{"Token":"-redacted-","email":"email@gmail.com","voice":"Ostap","format":"mp3","speed":"0.8","emotion":"good",' & _ '"pause_sentence":"300","pause_paragraph":"400","bitrate":"48000",' & _ '"text":"Heo світ"}' ConsoleWrite(@crlf & $data & @crlf & @crlf) Curl_Easy_Setopt($hCurl, $CURLOPT_POSTFIELDS, $data) ;Get response code and response $iRespCode = Curl_Easy_Perform($hCurl) If $iRespCode <> $CURLE_OK Then Return ConsoleWrite("Status Message: " & Curl_Easy_StrError($iRespCode) & @LF) $sResponse = BinaryToString(Curl_Data_Get($hCurl)) ;Clean up curl environment Curl_Easy_Cleanup($hCurl) Curl_Data_Cleanup($hCurl) ;Display response ConsoleWrite($sResponse & @CRLF) EndFunc ;==>Test SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
JonF Posted November 14 Author Share Posted November 14 Thanks for catching another error, but that's not it. It's the value of CURLOPT_POSTFIELDS. I've discovered that the site wants the data URI encoded in a weird format with the only header "Content-Type: application/x-www-form-urlencoded". I have had success with ShellExecuteWait with curl.exe: #include <FileConstants.au3> #include <StringConstants.au3> Func _URIEncode($sData) ; Prog@ndy Local $aData = StringSplit(BinaryToString(StringToBinary($sData, 4), 1), "") Local $nChar $sData = "" For $i = 1 To $aData[0] ; ConsoleWrite($aData[$i] & @CRLF) $nChar = Asc($aData[$i]) Switch $nChar Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126 $sData &= $aData[$i] Case 32 $sData &= "+" Case Else $sData &= "%" & Hex($nChar, 2) EndSwitch Next Return $sData EndFunc ;==>_URIEncode Global $Text,$data, $sAddress = 'https://speechgen.io/index.php?r=api/text', $cURLPath = "C:\Program Files\curl-8.11.0_1\bin\curl" $Text = 'Привіт шановний' $Command = ' --data "token=-redacted-&email=email%40gmail.com&' & _ 'voice=Ostap&format=mp3&speed=0.8&emotion=good&pause_sentence=300&pause_paragraph=400&bitrate=48000&text=' & _ _URIEncode($Text) & '" -k -H "Content-Type: application/x-www-form-urlencoded" ' _ & $sAddress & ' >' & @ScriptDir & '\Result.txt' $Result = ShellExecuteWait($cURLPath, $Command, "", "", @SW_MINIMIZE) (Note the encoded "@" in the email adress.) Which produces: {"id":"32796442","status":1,"file":"https:\/\/speechgen.io\/texttomp3\/20241104\/p_32107758_128.mp3","file_cors":"https:\/\/speechgen.io\/index.php?r=site\/download&prj=32796442&cors=28ee739ca163e1cb41b3b241d677d499","parts":0,"parts_done":0,"duration":"2","format":"mp3","error":"","balans":"19691","cost":"0"} However, this: expandcollapse popup#include <WinAPIDiag.au3> #include <Curl\Curl.au3> ; Beege rewrite #include <Constants.au3> Func _URIEncode($sData) Local $aData = StringSplit(BinaryToString(StringToBinary($sData,4),1),"") Local $nChar $sData="" For $i = 1 To $aData[0] $nChar = Asc($aData[$i]) Switch $nChar Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126 $sData &= $aData[$i] Case 32 $sData &= "+" Case Else $sData &= "%" & Hex($nChar,2) EndSwitch Next Return $sData EndFunc Test() Func Test() Local $arrHeaders = Curl_Slist_Append(0, "Content-Type: application/x-www-form-urlencoded") $Text = "Привіт шановний" ;Set up and execute cURL request $hCurl = Curl_Easy_Init() If Not $hCurl Then Return MsgBox($MB_ICONERROR, "Error", "Curl_Easy_Init() failed.") Curl_Easy_Setopt($hCurl, $CURLOPT_URL, "https://speechgen.io/index.php?r=api/text") Curl_Easy_Setopt($hCurl, $CURLOPT_HTTPHEADER, $arrHeaders) Curl_Easy_Setopt($hCurl, $CURLOPT_VERBOSE, 1) Curl_Easy_Setopt($hCurl, $CURLOPT_USERAGENT, "AutoIt/cURL") Curl_Easy_Setopt($hCurl, $CURLOPT_SSL_VERIFYPEER, 0) Curl_Easy_Setopt($hCurl, $CURLOPT_READFUNCTION, Curl_DataReadCallback()) Curl_Easy_Setopt($hCurl, $CURLOPT_CUSTOMREQUEST, "PUT") Curl_Easy_Setopt($hCurl, $CURLOPT_UPLOAD, 1) Curl_Easy_Setopt($hCurl, $CURLOPT_POST, 1) $data = '"token=-redacted-&email=email%40gmail.com&', & _ 'voice=Ostap&format=mp3&speed=0.8&emotion=good&pause_sentence=300&pause_paragraph=400&bitrate=48000&text=' & _ _URIEncode($Text) & '"' ConsoleWrite(@crlf & $data & @crlf & @crlf) Curl_Easy_Setopt($hCurl, $CURLOPT_POSTFIELDS, $data) $iRespCode = Curl_Easy_Perform($hCurl) If $iRespCode <> $CURLE_OK Then Return ConsoleWrite("Status Message: " & Curl_Easy_StrError($iRespCode) & @LF) $sResponse = BinaryToString(Curl_Data_Get($hCurl)) ;Clean up curl environment Curl_Easy_Cleanup($hCurl) Curl_Data_Cleanup($hCurl) ;Display response ConsoleWrite($sResponse & @CRLF) EndFunc Produces: {"id":0,"status":-1,"file":"","file_cors":"","parts":0,"parts_done":0,"duration":0,"format":"mp3","error":"Data is empty , use Post or Get request","balans":0}+>09:44:47 AutoIt3.exe ended.rc:0 Note "error":"Data is empty , use Post or Get request" I tried setting up a pointer a found at: ;Create binary buffer and store http post data in it $tByteBuffer = DllStructCreate("byte buffer[1000];") If @error Then Exit MsgBox($MB_ICONERROR + $MB_TOPMOST, "ERROR", "Failed to create string buffer - @error = " & @error) $tByteBuffer.buffer = $data Curl_Easy_Setopt($hCurl, $CURLOPT_POSTFIELDS, $tByteBuffer.buffer) But it made no difference. Link to comment Share on other sites More sharing options...
Developers Jos Posted November 14 Developers Share Posted November 14 What about this version?: expandcollapse popup#include <Date.au3> #include <WinAPIDiag.au3> #include <Curl.au3> Test() Func Test() ;Set up and execute cURL request $hCurl = Curl_Easy_Init() If Not $hCurl Then Return MsgBox($MB_ICONERROR, "Error", "Curl_Easy_Init() failed.") $url = "https://speechgen.io/index.php?r=api/text" ; $Text = "Привіт шановний" $data = 'token=-redacted-' & _ '&email=' & _URIEncode('email@gmail.com') & _ '&voice=Ostap' & _ '&format=mp3' & _ '&speed=0.8' & _ '&emotion=good' & _ '&pause_sentence=300' & _ '&pause_paragraph=400' & _ '&bitrate=48000' & _ '&text=' & _URIEncode($Text) ConsoleWrite("Data: " & $data & @CRLF) $CURLOPT_RETURNTRANSFER = 19913 Curl_Easy_Setopt($hCurl, $CURLOPT_RETURNTRANSFER, 1) ; Curl_Easy_Setopt($hCurl, $CURLOPT_URL, $url) ; Curl_Easy_Setopt($hCurl, $CURLOPT_HEADER, False) ; Curl_Easy_Setopt($hCurl, $CURLOPT_SSL_VERIFYHOST, False) ; Curl_Easy_Setopt($hCurl, $CURLOPT_POST, 1) ; Curl_Easy_Setopt($hCurl, $CURLOPT_POSTFIELDS, $data) ;Get response code and response $iRespCode = Curl_Easy_Perform($hCurl) If $iRespCode <> $CURLE_OK Then Return ConsoleWrite("Status Message: " & Curl_Easy_StrError($iRespCode) & @LF) $sResponse = BinaryToString(Curl_Data_Get($hCurl)) ;Clean up curl environment Curl_Easy_Cleanup($hCurl) Curl_Data_Cleanup($hCurl) ;Display response ConsoleWrite($sResponse & @CRLF) EndFunc ;==>Test Func _URIEncode($sData) ; Prog@ndy Local $aData = StringSplit(BinaryToString(StringToBinary($sData, 4), 1), "") Local $nChar $sData = "" For $i = 1 To $aData[0] ; ConsoleWrite($aData[$i] & @CRLF) $nChar = Asc($aData[$i]) Switch $nChar Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126 $sData &= $aData[$i] Case 32 $sData &= "+" Case Else $sData &= "%" & Hex($nChar, 2) EndSwitch Next Return $sData EndFunc ;==>_URIEncode I took the Example of a short text voiceover in PHP variant 1 from their WebSite and converted that to Autoit3. SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
JonF Posted November 14 Author Share Posted November 14 It needs Curl_Easy_Setopt($hCurl, $CURLOPT_SSL_VERIFYPEER, 0) Still fails, same way. I have their PHP example working but that's really inconvenient.😁 Link to comment Share on other sites More sharing options...
TheXman Posted November 14 Share Posted November 14 (edited) Why are you insisting on using UDFs that are based on the libcurl API's? That is probably THE most difficult to use for novices and requires a much deeper understanding of HTTP requests and the libcurl APIs themselves.. As you probably read in the post you referenced above, in the last post, I mentioned several other ways that you can do your request to speechgen.io. Most of those alternative ways are much easier to understand, script, and maintain. If you are adamant about using Beege's UDF lib, then try the script below. There were a few different ways to resolve the issues. The script below is the simplest of the ways and didn't require and DllStructs. If it does not work, then please post the output. Keep in mind that without a valid speechgen.io token, I am not able to test and verify that the script works. So there may be minor tweaks that are needed. The output from the script below will let me know. If you have questions about the script, please feel free to ask. expandcollapse popup#AutoIt3Wrapper_AU3Check_Parameters=-w 3 -w 4 -w- 5 -w 6 -d #include <Constants.au3> #include <curl-beege\curl.au3> ; <== Modify path to UDF as needed curl_post_example() Func curl_post_example() Local $hCurl = Null, _ $hReqHeaders = Null, _ $hRespBody = 1, _ $hRespHeaders = 2 Local $iRetCode = 0, _ $iRespCode = 0 Local $sPostData = _ '{' & _ ' "Token": "1234-redacted",' & _ ;<== Enter your token ' "email": "email@gmail.com",' & _ ' "voice": "Ostap",' & _ ' "format": "mp3",' & _ ' "speed": "0.8",' & _ ' "emotion": "good",' & _ ' "pause_sentence": "300",' & _ ' "pause_paragraph": "400",' & _ ' "bitrate": "48000",' & _ ' "text": "Привіт шановний"' & _ '}' ;Initialize EasyCurl POST request and set options $hCurl = Curl_Easy_Init() $hReqHeaders = Curl_Slist_Append($hReqHeaders, "Content-Type: application/json") $hReqHeaders = Curl_Slist_Append($hReqHeaders, "Accept: application/json") Curl_Easy_Setopt($hCurl, $CURLOPT_URL, "https://speechgen.io/index.php?r=api/text") Curl_Easy_Setopt($hCurl, $CURLOPT_HTTPHEADER, $hReqHeaders) Curl_Easy_Setopt($hCurl, $CURLOPT_SSL_VERIFYPEER, 0) Curl_Easy_Setopt($hCurl, $CURLOPT_FOLLOWLOCATION, 1) Curl_Easy_Setopt($hCurl, $CURLOPT_WRITEFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($hCurl, $CURLOPT_WRITEDATA, $hRespBody) Curl_Easy_Setopt($hCurl, $CURLOPT_HEADERFUNCTION, Curl_DataWriteCallback()) Curl_Easy_Setopt($hCurl, $CURLOPT_HEADERDATA, $hRespHeaders) Curl_Easy_Setopt($hCurl, $CURLOPT_COPYPOSTFIELDS, $sPostData) ;Submit request $iRetCode = Curl_Easy_Perform($hCurl) If $iRetCode <> $CurlE_OK Then Exit MsgBox($MB_ICONERROR + $MB_TOPMOST, "ERROR", "Request failed." & @CRLF & $iRetCode & " " & Curl_Easy_StrError($iRetCode)) ;Display response info ConsoleWrite("POST Data: " & $sPostData & @CRLF) ConsoleWrite("Curl RetCode: " & $iRespCode & " " & Curl_Easy_StrError($iRetCode) & @CRLF) ConsoleWrite("HTTP Resp Code: " & Curl_Easy_GetInfo($hCurl, $CurlINFO_RESPONSE_CODE) & @CRLF) ConsoleWrite("Content Type: " & Curl_Easy_GetInfo($hCurl, $CurlINFO_CONTENT_TYPE) & @CRLF) ConsoleWrite("Content Size: " & Curl_Easy_GetInfo($hCurl, $CurlINFO_SIZE_DOWNLOAD) & @CRLF) ConsoleWrite(@CRLF & "Response Headers:" & @CRLF & BinaryToString(Curl_Data_Get($hRespHeaders), $SB_UTF8) & @CRLF) ConsoleWrite(@CRLF & "Response Body:" & @CRLF & BinaryToString(Curl_Data_Get($hRespBody) , $SB_UTF8) & @CRLF) ;Clean up Curl_Data_Cleanup($hRespBody) Curl_Data_Cleanup($hRespHeaders) Curl_Slist_Free_All($hReqHeaders) Curl_Easy_Cleanup($hCurl) EndFunc Edited November 17 by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
JonF Posted November 14 Author Share Posted November 14 (edited) I appreciate your attempt, but perhaps you should have read the tropic before stepping in. The site will not accept those headers and will not accept a JSON formatted query and will not accept an unencoded string for the "text" parameter. After modifying until it works it fails in the same manner: POST Data: "token=-redacted-&email=email%40gmail.com&voice=Ostap&format=mp3&speed=0.8&emotion=good&pause_sentence=300&pause_paragraph=400&bitrate=48000&text=%D0%9F%D1%80%D0%B8%D0%B2%D1%96%D1%82+%D1%88%D0%B0%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D0%B9" Curl RetCode: 0 No error HTTP Resp Code: 200 Content Type: text/html; charset=UTF-8 Content Size: 159 Response Headers: Response Body: HTTP/1.1 200 OK Server: nginx/1.14.1 Date: Thu, 14 Nov 2024 19:36:04 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive X-Powered-By: PHP/7.3.33 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: X-Requested-With Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Set-Cookie: PHPSESSID=3f0b423fffdf24f42b2f966cba92c010; path=/ {"id":0,"status":-1,"file":"","file_cors":"","parts":0,"parts_done":0,"duration":0,"format":"mp3","error":"Data is empty , use Post or Get request","balans":0} I looked at winhttp and couldn't make head nor tail of it. Using COM objects I don't understand at all. I'll try that again. I'm a novice at AUtoIT but give me FORTRAN, Basic, i386 assembly language, or IBM 370 assembly language I can run rings around you. I'll look at WinHTTP.au3 again. Edited November 14 by JonF Link to comment Share on other sites More sharing options...
TheXman Posted November 14 Share Posted November 14 (edited) On 11/14/2024 at 7:41 PM, JonF said: perhaps you should have read the tropic before stepping in As I said, without a token, I can't test the script and that it may need to be tweaked. Changing the POST data format and encoding some of its values are small tweaks. Pardon me for "stepping in" to try to help you. It won't happen again. Result: { "id": "32XXXXXX", "status": 1, "file": "https://speechgen.io/texttomp3/20241116/p_33027160_669.mp3", "file_cors": "https://speechgen.io/index.php?r=site/download&prj=329XXXX6&cors=be7aed14388cb88e754998eXXXXXXXX", "parts": 0, "parts_done": 0, "duration": "1", "format": "mp3", "error": "", "balans": "25489", "cost": "0" } Edit: For the record, I bought a token so I could test my script. After changing the post data to the correct format, it worked just fine. It was a VERY simple change. For someone who would say they can "run rings around me", when they know nothing about me, says more about you than it does about me. By the way, ALC/COBOL/CICS/RPG/DB2/IMS on IBM MVS 370, were my first professional languages out of college back in the 80's. Could you can "run rings around me" back then, maybe, but I seriously doubt it. Edited 15 hours ago by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
JonF Posted November 16 Author Share Posted November 16 Your edited example doesn't work for me. I changed only the cURL path, token, and email. Response Body: {"id":0,"status":-1,"file":"","file_cors":"","parts":0,"parts_done":0,"duration":0,"format":"mp3","error":"Data is empty , use Post or Get request","balans":0} Link to comment Share on other sites More sharing options...
TheXman Posted November 16 Share Posted November 16 (edited) On 11/16/2024 at 3:18 PM, JonF said: Your edited example doesn't work for me. I didn't edit the script in my previous post. I only changed a grammatical error in the text of that post. The change I made to the POST data was made locally on my PC. As I said before, me "stepping in" to help you would not and will not happen again. Edited November 18 by TheXman CryptoNG UDF: Cryptography API: Next Gen jq UDF: Powerful and Flexible JSON Processor | jqPlayground: An Interactive JSON Processor Xml2Json UDF: Transform XML to JSON | HttpApi UDF: HTTP Server API | Roku Remote: Example Script About Me How To Ask Good Questions On Technical And Scientific Forums (Detailed) | How to Ask Good Technical Questions (Brief) "Any fool can know. The point is to understand." -Albert Einstein "If you think you're a big fish, it's probably because you only swim in small ponds." ~TheXman Link to comment Share on other sites More sharing options...
JonF Posted November 20 Author Share Posted November 20 I followed TheXman's advice and got it to work using COM. expandcollapse popup; Example of using the Windows Component Object Model to call the SpeechGen API #include <MsgBoxConstants.au3> #include <StringConstants.au3> ; Data for SpeechGen Local $Token = "SecretKeyInYourProfile", _ $Email = "YourEmail@gmail.com, _ $Text = "Привіт шановний", _ $Voice = "Ostap", _ $Format = "mp3", _ $Speed = "0.8" ; All arguments are strings. Arguments given defalt values are optional, but you cannot ; specify any arguments after using an argument with a default. See the test below, where ; $sFormat must be specified because $sSpeed is specified. ; Return value: URL of the speak file and set @error=0 if the process worked, ; error message string and set @error=1 if it did not. Func SpeechGen($sToken, $sEmail, $sData, $sVoice, $sFormat = "mp3", $sSpeed = "1.0", $sEmotion = "good", _ $sPause_sentence = "300", $sPause_paragraph = "400", $sBitrate = "48000") $sRequest = 'token=' & $sToken & '&email=' & $sEmail & '&voice=' & $sVoice _ & '&format=' & $sFormat & '$speed=' & $sSpeed & '&emotion=' & $sEmotion _ & '&pause_sentence=' & $sPause_sentence & '&pause_paragraph=' _ & $sPause_paragraph & '&bitrate=' & $sBitrate & '&text=' & $sData ; MsgBox($MB_OK, "Request",$sRequest) Global $oMyError = ObjEvent("AutoIt.Error", "MyCOMErrFunc") ; Initialize a COM error handler Local $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") $oHTTP.Open("POST", "https://speechgen.io/index.php?r=api/text", False) $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded") $oHTTP.Send($sRequest) Local $oReceived = $oHTTP.ResponseText $SpeechGenError = StringRegExp($oReceived, 'https:.*?\.mp3', $STR_REGEXPARRAYMATCH) ConsoleWrite(@CRLF & "Received: " & $oReceived & @CRLF) ;MsgBox($MB_OK, "Received", $oReceived) Local $SpeechGenError = StringRegExp($oReceived, 'error":".*?"', $STR_REGEXPARRAYMATCH) If StringLen($SpeechGenError[0]) > 9 Then Local $sErrorMessage = StringReplace(StringTrimLeft($SpeechGenError[0], 7), '"', "") MsgBox(BitOR($MB_ICONERROR, $MB_OK), "Error", $sErrorMessage & @CRLF & @CRLF & $oReceived, 10) Return SetError(1, 1, $sErrorMessage) Else $sURLReceived = StringRegExp($oReceived, 'https:.*?\.mp3', $STR_REGEXPARRAYMATCH) ConsoleWrite(@CRLF & "URL: " & StringReplace($sURLReceived[0], "\", "") & @CRLF & @CRLF) Return SetError(0, 0, StringReplace($sURLReceived[0], "\", "")) EndIf EndFunc ;==>SpeechGen ; COM error handler Func MyCOMErrFunc() MsgBox(0, "AutoItCOM", "We intercepted a COM Error !" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $oMyError.description & @CRLF & _ "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _ "err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _ "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _ "err.source is: " & @TAB & $oMyError.source & @CRLF & _ "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $oMyError.helpcontext _ ) EndFunc ;==>MyCOMErrFunc ; Test the system Func TestSpeechGen() Local $Result = SpeechGen($Token, $Email, $Text, $Voice, $Format, $Speed) If @error = 0 Then MsgBox($MB_OK, "URL of file", $Result) ; Un-comment to download the MP3 ; InetGet($Result, @ScriptDir & "\Result.mp3") Else MsgBox(BitOR($MB_ICONERROR, $MB_OK), "Error", $Result) EndIf EndFunc ;==>TestSpeechGen Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now