Core2Duo76
Новичок
- Сообщения
- 58
- Репутация
- 1
Начал осваивать API вконтакта, все получается, но до сих пор не понимаю, почему фотография не загружается по POST запросу. Посмотрел примеры, которые рассматриваются на форуме - они у меня тоже не заработали. Затем я нашел в своем коде несколько логических ошибок, исправил их и в конечном итоге остановился на использовании WinHTTP-объекта. Свойства и параметры запроса составляю вручную.
Собстна, вот. Несколько вечеров я провел над подброкой параметров, изучением синтаксиса POST и тем, которые знать-то и не хотел никогда.
Ошибка в том, что поле photos_list, которое возвращается функцией _parseanswer не может быть пустым!!! а должно содержать список всяих параметров, а мне приходят лишь пара квадратных скобок. Поэтому я пока удачу/неудачу загрузки фото проверяю по размеру поля фото в JSON. Удач пока не было. ваши предложения? Что не так? Куда смотреть? техподдержка VK молчит
Собстна, вот. Несколько вечеров я провел над подброкой параметров, изучением синтаксиса POST и тем, которые знать-то и не хотел никогда.
Код:
#include <inet.au3>
#include <HTTP_UDF.au3>
Dim $sServer, $sHash, $sPhoto, $sUploadServer, $sResponse, $sAnswer, $sRequest, $sPostData = ''
$sToken = "9176d92c656a28af1a63f6295f9806c16c8e37a1fdf05dcb6dc21a7fb68994f550e0db7e73f2285b7cdcd"
GetUploadServer($sUploadServer, $sToken)
;============= открываем файл
fOpen($sPostData, @ScriptDir & "\3.jpg", 16)
ExecPOST($sResponse, $sUploadServer, $sPostData)
_parseanswer($sResponse, $sServer, $sHash, $sPhoto)
If StringLen($sPhoto) > 2 Then
ConsoleWrite('+UPLOAD DONE!' & @CRLF)
Else
ConsoleWrite('+Upload error' & @CRLF)
Exit
EndIf
Func GetUploadServer(ByRef $UploadServer, $Token)
$request = "https://api.vk.com/method/photos.getUploadServer?&album_id=165659244&access_token=" & $Token
$answer = _INetGetSource($request)
$answer = StringReplace($answer, "\", "")
$UploadServer = StringRegExpReplace($answer, ".*(http[^""]+)"".+", "$1")
ConsoleWrite('UpServer = ' & $UploadServer & @CRLF)
EndFunc ;==>GetUploadServer
Func ExecPOST(ByRef $Response, $UploadServer, ByRef $PostData)
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", $UploadServer)
$sBoundary = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC & Random(0, 100000, 1)
$oHTTP.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" & $sBoundary )
$sData = '--' & $sBoundary & @CRLF & _
'Content-Disposition: form-data; name="file1"' & @CRLF & _
'Content-Type: image/jpeg' & @CRLF & _
'Content-Transfer-Encoding: binary' & @CRLF & @CRLF & _
StringTrimLeft($PostData, 2) & @CRLF & _
'--' & $sBoundary & '--' & @CRLF
$oHTTP.SetRequestHeader("Content-Length", StringLen($sData))
$oHTTP.Send($sData)
$oHTTP.WaitForResponse
$Response = $oHTTP.ResponseText
ConsoleWrite('Response = ' & $Response & @CRLF)
EndFunc ;==>ExecPOST
Func fOpen(ByRef $var, $path, $flag = 0)
Local $hFile = FileOpen($path, $flag)
$var = FileRead($hFile)
FileClose($hFile)
ConsoleWrite(StringLen($var) & ' bytes in file' & @CRLF)
EndFunc ;==>fOpen
Ошибка в том, что поле photos_list, которое возвращается функцией _parseanswer не может быть пустым!!! а должно содержать список всяих параметров, а мне приходят лишь пара квадратных скобок. Поэтому я пока удачу/неудачу загрузки фото проверяю по размеру поля фото в JSON. Удач пока не было. ваши предложения? Что не так? Куда смотреть? техподдержка VK молчит