Jump to content
Sign in to follow this  
Progh0st

API Upload XML WinHttp

Recommended Posts

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.

; 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=", "&amp")
$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 by Progh0st
Added PDF of sendspace if helpful

Share this post


Link to post
Share on other sites
$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 by trancexx

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites
$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 version

You can check it out on the pdf, i also send them support ticket, waiting for response

Edited by Progh0st

Share this post


Link to post
Share on other sites

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 by trancexx

♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.


♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

Ok, done. The example would be:

#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
EndFunc

And the latest (working version of) WinHttp.au3 is at https://raw.githubusercontent.com/dragana-r/autoit-winhttp/master/WinHttp.au3

Try it, maybe I leave it in.


♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By MiKa666
      Hi all,
      I'm developing a tool for exploratively testing another software. For that I wanna cover all the GUI functionality from that software and verify everything works as intended. But now I've a problem which I couldnt solve so far.
      One thing that software I'm testing does, is to load up either a single picture or a series of pictures. Depending on how much pictures got loaded, further actions will be proceeded...
      This loaded pictures are schon within a ToolbarWindow and they're clickable. What I need to know is, how much pictures are in this ToolbarWindow...
      Can anybody provide me a tip on how to achive this?
      Would be amazing!!
      BR,
      Mic
    • By meety
      Hello!
      wingettext function can get the text content of the IE browser page, but the text content of the page cannot be obtained in the chrome browser? What should I do?
    • By DirtyJohny
      Hi everyone.Need rewrite this function how in еxample.
      Original:
      #RequireAdmin #NoTrayIcon Opt("MustDeclareVars",1) Func _a() Local $sls=ObjGet("winmgmts:{impersonationLevel=impersonate," _ &"authenticationLevel=Pkt}!\\"& _ @ComputerName&'\root\wmi'),$lss=$sls.ExecQuery _ ('SELECT * FROM WmiMonitorID'), _ $lll,$sll,$sss="",$lsl,$lls,$i,$z For $z In $lss $lsl=$z.UserFriendlyName For $i=0 To Ubound($lsl)-1 if ($lsl[$i]) Then $lll&=Chr($lsl[$i]) Next $lls=$z.SerialNumberID For $i=0 To Ubound($lls)-1 if ($lls[$i]) Then $sll&=Chr($lls[$i]) Next $sss&="Model"&@TAB&@TAB&": "&$lll&@CR&"Serial Number"&@TAB&": "&$sll&@CR&@CR $lll="" $sll="" Next MsgBox(262144,'Monitors '&$lss.Count,$sss&" "&@CR) $lss=Null $sls=Null EndFunc _a() Example:
      Func _InfoPC() Local $ObjService = ObjGet('winmgmts:{impersonationLevel = impersonate}!\\' & @ComputerName & '\root\cimv2') Local $ObjMB = $ObjService.ExecQuery('SELECT * FROM Win32_BaseBoard', 'WQL', 0x30) If IsObj($ObjService) Then For $objItemMB In $ObjMB $sInfo &= @TAB & 'Motherboard: ...... ' & $objItemMB.Product & @CRLF I'm beginner in this sphere and need  you all speak easy and simply because i'm Russian.Thanks)
    • By Deshanur
      Am trying to automate injecting credential on the login form for all kind of Web application for IE. I know how to identify the form name by viewing the source code and using the method - _IEFormGetObjByName($ie, $form_Name).
      I would like to know how to identify or get the form object for the web app where there is no form name tag for example below, for the is I have used - _IEFormGetCollection($ie, 0) to get the form object.
      My Question is does it work for all kind of application "_IEFormGetCollection($ie, 0)" how to identify Index value? is it always 0? is there any better solution?
      The final solution am looking for is find out form object, get the username, password field and inject credential and submit the form.
      How to find out index value? for the forms which does not have form name field.
      $login_form = _IEFormGetCollection($ie, 0) $email_field = _IEFormElementGetObjByName($login_form, $form_UserName) $pass_field = _IEFormElementGetObjByName($login_form, $form_password) $login_button = _IEFormElementGetObjByName($login_form, $form_submitbutton) _IEFormElementSetValue($email_field, $CmdLine[2]) _IEFormElementSetValue($pass_field, $CmdLine[3]) ControlSend($hwnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]","{Enter}") OR This works fine if the form has form name. $login_form = _IEFormGetObjByName($ie, $form_Name) $email_field = _IEFormElementGetObjByName($login_form, $form_UserName) $pass_field = _IEFormElementGetObjByName($login_form, $form_password) $login_button = _IEFormElementGetObjByName($login_form, $form_submitbutton) _IEFormElementSetValue($email_field, $CmdLine[2]) _IEFormElementSetValue($pass_field, $CmdLine[3]) ControlSend($hwnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]","{Enter}")
    • By JuanFelipe
      Hello guys!
      I have a problem with a script, in the past I made a program and it worked perfect, I recently used it again and it already stands still in one step, the problem is a Javascript event that changed but now I cannot execute it.
       
      <td colspan="2" align="center"><input type="button" id="Buscar" name="Buscar" value="Buscar" onclick="javascript:enviarForma(document.obtenercasosPersonaPorDocumento,'0');" class="boton"></td>  
      Previously I used this code and it worked, but now it does nothing
      $botonconsulta = _IEGetObjByName($oIE,"Buscar") _IEAction($botonconsulta, 'click') _IELoadWait($oIE)  
      Now I have tried the following codes but none works.
       
      ;==================== 1 _IEHeadInsertEventScript($oIE, "document", "onclick", "javascript:enviarForma(document.obtenercasosPersonaPorDocumento,'0');") ControlClick("SUPER CELAC", "", "[CLASS:Internet Explorer_Server; INSTANCE:1]") _IELoadWait($oIE) ;==================== 2 $forma = $oIE.document.obtenercasosPersonaPorDocumento $oIE.Navigate("JavaScript:enviarForma("&$forma&",""0"");") _IELoadWait($oIE) ;==================== 3 $boton = _IEGetObjById($oIE, "Buscar") $boton.document.parentwindow.execScript("enviarForma(document.obtenercasosPersonaPorDocumento,'0');", "javascript") I hope you can guide me, because I think the error is in the parameters that the javascript function receives but I don't know how to send it, here I leave the first part of the JavaScript function.
      function enviarForma(frm,tipoForma){ var bExisteDatoConsulta = false; var bError=true; var mensajeError=""; switch (tipoForma) { //--Forma documento case "0": if (validar_campo_no_vacio_no_print(frm.numeroDocumento)) { if (!isNum(frm.numeroDocumento.value)) { bError = false; mensajeError += "El número de documento debe ser un valor numérico\n"; } bExisteDatoConsulta = true; } else { mensajeError += "Debe digitar un número de documento\n"; } break;  Thanks!
×
×
  • Create New...