Jump to content

Need help sending an image to a PHP file using WinHTTP


Recommended Posts

Hello,

For sharing screenshots with my friends I'm using uploadscreenshot.com.

I noticed they have a useable API, so I thought I could create a neat little program which will upload screenshot with a single button click.

After reading their documentation I started to play some with WinHTTP, but unfortunately I have zero experience with WinHTTP.

API documentation: www.uploadscreenshot.com/api-documentation

What I've tried:

#include "WinHTTP/WinHttp.au3"

Global Const $sAPIKey = "*snip*"
Global Const $sAPIURL = "http://img1.uploadscreenshot.com/api-upload.php"
Global Const $sIP = "209.105.243.66" ; pinged from 'uploadscreenshot.com'

Global $hOpen = _WinHttpOpen()
Global $hConnect = _WinHttpConnect($hOpen, $sAPIURL)
Global $hRequest = _WinHttpOpenRequest($hConnect, "POST", "C:\Users\Lyker\Desktop\Other\Untitled-1.png")

_WinHttpSendRequest($hRequest)
_WinHttpReceiveResponse($hRequest)

MsgBox(0, "", _WinHttpReadData($hRequest))

_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

I have no idea how I should use the WinHTTP UDF to connect with their API and send images & fill in variables. ;)

Any pokes in the right direction?

Almar

Edited by AlmarM

Minesweeper

A minesweeper game created in autoit, source available.

_Mouse_UDF

An UDF for registering functions to mouse events, made in pure autoit.

2D Hitbox Editor

A 2D hitbox editor for quick creation of 2D sphere and rectangle hitboxes.

Link to comment
Share on other sites

I've tried some more things and I already got some closer!

#include "WinHTTP/WinHttp.au3"

Global Const $sAPIKey = "81d63021b65545554828638091"
Global Const $sAPIURL = "/api-upload.php?apiKey=" & $sAPIKey & "&xmlOutput=1&testMode=1"
Global Const $sURL = "img1.uploadscreenshot.com"

Global $hOpen = _WinHttpOpen()
Global $hConnect = _WinHttpConnect($hOpen, $sURL)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hConnect = ' & $hConnect & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
Global $hRequest = _WinHttpOpenRequest($hConnect, "POST", $sAPIURL)

_WinHttpSendRequest($hRequest)
_WinHttpWriteData($hRequest, StringToBinary(FileRead("C:UsersLykerDesktopOtherUntitled-1.png")))
_WinHttpReceiveResponse($hRequest)

MsgBox(0, "", _WinHttpReadData($hRequest))

_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

It now returns what it should return.

The only problem now is that I don't know how to send the image using POST to that PHP file.

The XML is giving me a ERRORCODE=6. Which means the 'userfile' is empty, AKA I did not send the image correctly.

Anyone? ;)

Minesweeper

A minesweeper game created in autoit, source available.

_Mouse_UDF

An UDF for registering functions to mouse events, made in pure autoit.

2D Hitbox Editor

A 2D hitbox editor for quick creation of 2D sphere and rectangle hitboxes.

Link to comment
Share on other sites

During your second post I tried something simliar but with the same result.

I tried their docu on the api....and the demo html post:

http://uploadscreenshot.com/api/test-api.html

I noticed when I select a image with a path (and the path is shown in the formular) the post message does not got the path

http://img1.uploadscreenshot.com/api-upload.php?userfile=Desert.jpg&apiKey=519acd4be68445997245348820&xmlOutput=1&imageMD5=&username=&userPasswordMD5=&testMode=1&Submit=Upload

I' not that much experienced, but it looks like the post does not take care about paths....

Sorry, not helping you. Maybe search for "POST File with path"?

Link to comment
Share on other sites

I've found something in the WinHTTP UDF post (from trancexx) in example scripts by ProgAndy.

I think that is what I need, but with my little expierence I think I cannot figure that out alone. ;)

Edited by AlmarM

Minesweeper

A minesweeper game created in autoit, source available.

_Mouse_UDF

An UDF for registering functions to mouse events, made in pure autoit.

2D Hitbox Editor

A 2D hitbox editor for quick creation of 2D sphere and rectangle hitboxes.

Link to comment
Share on other sites

You left your key in pal

I saw, but it doesn't matter.

You can register multiple API key's on the same e-mail, uploadscreenshot.com doesn't care about that. :)

What if I forget my API key?

Just register for a new one above.

Can I request multiple API keys for the same email address?

Yes, just submit the form as many times as needed and a new key will be sent each time. This way you can use a different API key in each of your applications.

Thanks though! ;)

EDIT:

God this is hard..

My next try:

#include "WinHTTP/WinHttp.au3"

Global Const $sAPIKey = "81d63021b65545554828638091"
Global Const $sAPIURL = "/api-upload.php?apiKey=" & $sAPIKey & "&xmlOutput=1&testMode=1"
Global Const $sURL = "img1.uploadscreenshot.com"

Global $hOpen = _WinHttpOpen()
Global $hConnect = _WinHttpConnect($hOpen, $sURL)
Global $hRequest = _WinHttpOpenRequest($hConnect, "POST", $sAPIURL)

Global $sData = ""
$sData = 'MIME-Version: 1.0' & @CRLF
$sData &= 'Content-Type: multipart/mixed; boundary=darker' & @CRLF & @CRLF ; on or off? since it's already givin inside the _WinHttpSendRequest
$sData &= '--darker' & @CRLF
$sData &= 'Content-Disposition: attachment; filename="Untitled-1.png"' & @CRLF
$sData &= 'Content-Type: image/png' & @CRLF & @CRLF
$sData &= FileRead("C:UsersLykerDesktopOtherUntitled-1.png") & @CRLF ;~ $sData &= _Base64Encode(FileRead("C:UsersLykerDesktopOtherUntitled-1.png")) & @CRLF
$sData &= '--darker--'

FileWrite(@DesktopDir & "asdas.txt", $sData)
_WinHttpSendRequest($hRequest, "Content-Type: multipart/mixed; boundary=darker", $WINHTTP_NO_REQUEST_DATA, StringLen($sData))
;~ _WinHttpWriteData($hRequest, $sData)
_WinHttpWriteDataBin($hRequest, StringToBinary($sData)) ; base 64 encode or binary send?
_WinHttpReceiveResponse($hRequest)

MsgBox(0, "", _WinHttpReadData($hRequest))

_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

Func _WinHttpWriteDataBin($hRequest, $bBinary)
    Local $lpBinary
    Local $iNumberOfBytesToWrite
    If IsDllStruct($bBinary) Then
        $lpBinary = DllStructGetPtr($bBinary)
        $iNumberOfBytesToWrite = DllStructGetSize($bBinary)
    Else
        $iNumberOfBytesToWrite = BinaryLen($bBinary)
        Local $sBinary = DllStructCreate("byte[" & $iNumberOfBytesToWrite & "]")
        DllStructSetData($sBinary, 1, $bBinary)
        $lpBinary = DllStructGetPtr($sBinary)
    EndIf

    Local $a_iCall = DllCall("Winhttp.dll", "int", "WinHttpWriteData", _
            "hwnd", $hRequest, _
            "ptr", $lpBinary, _
            "dword", $iNumberOfBytesToWrite, _
            "dword*", 0)

    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, 0)
    EndIf

    Return SetError(0, $a_iCall[4], 1)
EndFunc

Func _Base64Encode($sData)
    Local $oXml = ObjCreate("Msxml2.DOMDocument")
    If Not IsObj($oXml) Then
        SetError(1, 1, 0)
    EndIf

    Local $oElement = $oXml.createElement("b64")
    If Not IsObj($oElement) Then
        SetError(2, 2, 0)
    EndIf

    $oElement.dataType = "bin.base64"
    $oElement.nodeTypedValue = Binary($sData)
    Local $sReturn = $oElement.Text

    If StringLen($sReturn) = 0 Then
        SetError(3, 3, 0)
    EndIf

    Return $sReturn
EndFunc   ;==>_Base64Encode
Edited by AlmarM

Minesweeper

A minesweeper game created in autoit, source available.

_Mouse_UDF

An UDF for registering functions to mouse events, made in pure autoit.

2D Hitbox Editor

A 2D hitbox editor for quick creation of 2D sphere and rectangle hitboxes.

Link to comment
Share on other sites

It should be something like this:

#include "WinHTTP/WinHttp.au3"

Global $sFile = "C:UsersLykerDesktopOtherUntitled-1.png"

Global Const $sAPIKey = "81d63021b65545554828638091"
Global Const $sURL = "uploadscreenshot.com"

; Session
Global $hOpen = _WinHttpOpen()
; Connection
Global $hConnect = _WinHttpConnect($hOpen, $sURL)

; Upload image
Global $sRead = _WinHttpSimpleFormFill($hConnect, "api/test-api.html", Default, _
        "apiKey", $sAPIKey, _
        "xmlOutput", 1, _
        "testMode", 1, _
        "name:userfile", $sFile)

; Close connection handle
_WinHttpCloseHandle($hConnect)
; Close session handle
_WinHttpCloseHandle($hOpen)

ConsoleWrite($sRead & @CRLF)

; Bye, bye...

WinHttp has its own help file. Use it.

Link to comment
Share on other sites

Here is a complete example without using the HTML form:

#include "Z:/daten/Dokumente/AutoIt3/UDF/WinHttp.au3"
#include <Crypt.au3>

Global Const $fTestMode = True ; testmode will delete images after 15 minutes
Global Const $sAPIKey = "519acd4be68445997245348820" ; testkey, images will always be deleted after 15 minutes
Global Const $sAPIURL = "/api-upload.php"
Global Const $sURL = "img1.uploadscreenshot.com"

Global $hOpen = _WinHttpOpen("AutoIt UploadScreenShot Demo v1")
Global $hConnect = _WinHttpConnect($hOpen, $sURL)
Global $hRequest = _WinHttpOpenRequest($hConnect, "POST", $sAPIURL)

Global $sData = ""
If $fTestMode Then
    $sData &= '----------darker' & @CRLF
    $sData &= 'Content-Disposition: form-data; name="testMode"' & @CRLF & @CRLF
    $sData &= '1' & @CRLF
EndIf
$sData &= '----------darker' & @CRLF
$sData &= 'Content-Disposition: form-data; name="xmlOutput"' & @CRLF & @CRLF
$sData &= '1' & @CRLF
$sData &= '----------darker' & @CRLF
$sData &= 'Content-Disposition: form-data; name="imageMD5"' & @CRLF & @CRLF
$sData &= StringLower(Hex(_Crypt_HashFile(@ScriptDir & "testimage.png", $CALG_MD5))) & @CRLF
$sData &= '----------darker' & @CRLF
$sData &= 'Content-Disposition: form-data; name="userfile"; filename="testimage.png"' & @CRLF
$sData &= 'Content-Type: image/png' & @CRLF & @CRLF
$sData &= FileRead(@ScriptDir & "testimage.png") & @CRLF ;~ $sData &= _Base64Encode(FileRead("C:UsersLykerDesktopOtherUntitled-1.png")) & @CRLF
$sData &= '----------darker--'

_WinHttpSendRequest($hRequest, "Content-Type: multipart/form-data; boundary=--------darker", Binary($sData))
_WinHttpReceiveResponse($hRequest)

$sResult = _WinHttpReadData($hRequest)
MsgBox(0, "", $sResult)
ConsoleWrite($sResult & @CRLF)

_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

*GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes

Link to comment
Share on other sites

Awe-some work, both samples work like a charm! ;)

I personally don't like filling in forms, so I'll use ProgAndy's sample.

But I've learned a lot from both samples. Thanks!

Minesweeper

A minesweeper game created in autoit, source available.

_Mouse_UDF

An UDF for registering functions to mouse events, made in pure autoit.

2D Hitbox Editor

A 2D hitbox editor for quick creation of 2D sphere and rectangle hitboxes.

Link to comment
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
 Share

×
×
  • Create New...