Progh0st Posted December 30, 2015 Posted December 30, 2015 (edited) I'm trying to use Sendspace API for download and upload, until now i only have learned to get token, login and get session key. My next step is upload a file. But i have no idea how to do this part.expandcollapse popup; try to upload something ; Specify the reguest to upload.getInfo: Local $hRequest = _WinHttpOpenRequest($hConnect, Default, "/rest/?method=upload.getinfo&session_key=" & $SessonKey & "&speed_limit=0") ; Send request Local $handle = _WinHttpSendRequest($hRequest) ; Wait for the response Local $WaitRS = _WinHttpReceiveResponse($hRequest) ; Read Data Local $sData = _WinHttpReadData($hRequest) MsgBox(0, "Upload Data", $sData) _filewrite($sData) ; Get all info needed from $sData $URL = _StringBetween($sData, "<upload url=", "progress") $sURL = $URL[0] $MaxFileSize = _StringBetween($sData, "max_file_size=", "progress") $sMaxFileSize = $MaxFileSize[0] $Upload_Identifier = _StringBetween($sData, "upload_identifier=", "&") $sUpload_Identifier = $Upload_Identifier[0] $ExtraInfo = _StringBetween($sData, "extra_info=", "/>") $sExtraInfo = $ExtraInfo[0] ;All well done until here ;Fill in form $XML = '<form method="post" action="' & $sURL & 'enctype="multipart/form-data">' & @CRLF $XML &= '<input type="hidden" name="MAX_FILE_SIZE" value=' & $sMaxFileSize & '>' & @CRLF $XML &= '<input type="hidden" name="UPLOAD_IDENTIFIER" value=' & $sUpload_Identifier & '>' & @CRLF $XML &= '<input type="hidden" name="extra_info" value=' & $sExtraInfo & '>' & @CRLF $XML &= '<input type="file" name=' & "C:\Users\Arlen\Desktop\premisa mrotal.txt" & '>' & @CRLF $XML &= '</form>' MsgBox(0,"", $XML) ; Now how do i send it? Is it correct? _WinHttpCloseHandle($hRequest) _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) sendspace_api_guide.pdf Edited December 30, 2015 by Progh0st Added PDF of sendspace if helpful
trancexx Posted December 30, 2015 Posted December 30, 2015 (edited) $sFileToUpload = "C:\Users\Arlen\Desktop\premisa mrotal.txt" $XML = '<form method="post" action="' & $sURL & '" enctype="multipart/form-data">' & @CRLF $XML &= '<input type="hidden" name="MAX_FILE_SIZE" >' & @CRLF $XML &= '<input type="hidden" name="UPLOAD_IDENTIFIER" >' & @CRLF $XML &= '<input type="hidden" name="extra_info" >' & @CRLF $XML &= '<input type="file" name="userfile" >' & @CRLF $XML &= '</form>' $hConnect = $XML ;<!!! ; Fill the form $sHTML = _WinHttpSimpleFormFill($hConnect, $hOpen, _ Default, _ "name:MAX_FILE_SIZE", $sMaxFileSize, _ "name:UPLOAD_IDENTIFIER", $sUpload_Identifier, _ "name:extra_info", $sExtraInfo, _ "name:userfile", $sFileToUpload) ;... Edited December 30, 2015 by trancexx Progh0st 1 ♡♡♡ . eMyvnE
Progh0st Posted December 30, 2015 Author Posted December 30, 2015 (edited) $sFileToUpload = "C:\Users\Arlen\Desktop\premisa mrotal.txt" $XML = '<form method="post" action="' & $sURL & '" enctype="multipart/form-data">' & @CRLF $XML &= '<input type="hidden" name="MAX_FILE_SIZE" >' & @CRLF $XML &= '<input type="hidden" name="UPLOAD_IDENTIFIER" >' & @CRLF $XML &= '<input type="hidden" name="extra_info" >' & @CRLF $XML &= '<input type="file" name="userfile" >' & @CRLF $XML &= '</form>' $hConnect = $XML ;<!!! ; Fill the form $sHTML = _WinHttpSimpleFormFill($hConnect, $hOpen, _ Default, _ "name:MAX_FILE_SIZE", $sMaxFileSize, _ "name:UPLOAD_IDENTIFIER", $sUpload_Identifier, _ "name:extra_info", $sExtraInfo, _ "name:userfile", $sFileToUpload) ;... It looks good, but for some reason i get this code error: 5 API_ERROR_BAD_API_VERSION Unknown or unsupported API versionYou can check it out on the pdf, i also send them support ticket, waiting for response Edited December 30, 2015 by Progh0st
trancexx Posted December 31, 2015 Posted December 31, 2015 (edited) As a side note, you should learn how to better take advantage of the language you use. For example by writing more generic functions and using them in your code. One good function would be to parse simple xml data that the API returns instead of using _StringBetween() like you do. If I were you I would write this function:Func ReadXMLData($sXML, $sTag) Local $aData = StringRegExp($sXML, "(?si)<\s*" & $sTag & "(?:[^\w])\s*(.*?)(?:(?:<\s*/" & $sTag & "\s*>)|\Z)", 3) If @error Then Return "" Return $aData[0] EndFunc...and then use it like this:$sToken = ReadXMLData($sData, "token") ;... $sSessionKey = ReadXMLData($sData, "session_key") ;... $sUploadData = ReadXMLData($sData, "upload") ;...and then: $MAX_FILE_SIZE = __WinHttpAttribVal($sUploadData, "max_file_size") $UPLOAD_IDENTIFIER = __WinHttpAttribVal($sUploadData, "upload_identifier") $sExtraInfo = __WinHttpAttribVal($sUploadData, "extra_info") ;... Also, I would use _WinHttpSimpleFormFill() for every step/method. Starting from auth.createtoken through auth.login and all the way to upload.getInfo before uploading the file. That way you could switch to https with no trouble (or changes to the code) because form filling function handles all protocols in a seamless way. Edited December 31, 2015 by trancexx Progh0st 1 ♡♡♡ . eMyvnE
Progh0st Posted December 31, 2015 Author Posted December 31, 2015 Thank you so much this will be very useful for me and save time!I have one more question. How can i upload and at the same time get the progressbar working, since i have to wait for it to upload first to continue with the script. Ty
trancexx Posted January 2, 2016 Posted January 2, 2016 You will always have to wait for upload to finish before continuing in AutoIt. The language isn't capable for parallel executions.What I can do is add new function to WinHttp.au3 that could be used to set callback function that would be called during upload process periodically, in which you could control/update progress bar or whatever.Yea, I think I'll do that. mikell, mLipok, Progh0st and 1 other 4 ♡♡♡ . eMyvnE
trancexx Posted January 2, 2016 Posted January 2, 2016 Ok, done. The example would be:expandcollapse popup#include "WinHTTP.au3" $sAddress = "https://posttestserver.com/post.php?dir=WinHttp" ; the address of the target (https or http, makes no difference - handled automatically) ; Select some file $sFileToUpload = FileOpenDialog("Select file to upload...", "", "All Files (*)") If Not $sFileToUpload Then Exit 5 ; check if the file is selected and exit if not $sForm = _ '<form action="' & $sAddress & '" method="post" enctype="multipart/form-data">' & _ ' <input type="file" name="upload"/>' & _ '</form>' ; Initialize and get session handle $hOpen = _WinHttpOpen() $hConnect = $sForm ; will pass form as string so this is for coding correctness because $hConnect goes in byref ; Creates progress bar window ProgressOn("UPLOADING", $sFileToUpload, "0%") ; Register callback function _WinHttpSimpleFormFill_SetCallback(UploadCallback) ; Fill form $sHTML = _WinHttpSimpleFormFill($hConnect, $hOpen, _ Default, _ "name:upload", $sFileToUpload) ; Collect error number $iErr = @error ; Unregister callback function _WinHttpSimpleFormFill_SetCallback(0) ; Kill progress bar window ProgressOff() ; Close handles _WinHttpCloseHandle($hConnect) _WinHttpCloseHandle($hOpen) If $iErr Then MsgBox(4096, "Error", "Error number = " & $iErr) Else ConsoleWrite($sHTML & @CRLF) MsgBox(4096, "Success", $sHTML) EndIf ; Callback function. For example, update progress control Func UploadCallback($iPrecent) If $iPrecent = 100 Then ProgressSet(100, "Done", "Complete") Sleep(800) ; give some time for the progress bar to fill-in completely Else ProgressSet($iPrecent, $iPrecent & "%") EndIf EndFuncAnd the latest (working version of) WinHttp.au3 is at https://raw.githubusercontent.com/dragana-r/autoit-winhttp/master/WinHttp.au3Try it, maybe I leave it in. mikell, mLipok, Progh0st and 1 other 3 1 ♡♡♡ . eMyvnE
mikell Posted January 2, 2016 Posted January 2, 2016 I'm not the OP but ... many thanks anyway Progh0st 1
Progh0st Posted January 2, 2016 Author Posted January 2, 2016 trancexx Wow you're amazing i feel very grateful about your help. Thank you so much!
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