Что нового

[Сеть, интернет] Не роботает отправка картинки через POST запрос

lesandr

Новичок
Сообщения
5
Репутация
0
Добрый день.

Есть форма для отправки картинки на сервер http://www.de-captcher.com/:

Код:
<form>
 method="post"
 action="http://poster.de-captcher.com/"
 enctype="multipart/form-data">
 <input type="hidden" name="function"  value="picture2">
 <input type="text"   name="username"  value="client">
 <input type="text"   name="password"  value="qwerty">
 <input type="file"   name="pict">
 <input type="text"   name="pict_to"   value="0">
 <input type="text"   name="pict_type" value="0">
 <input type="submit" value="Send">
</form>

Есть код
Код:
_decaptcher()

Func _decaptcher()
	$sFile = @ScriptDir & 'Captcha.jpg'
	Local $hFileOpen, $sFileRead, $sBoundary, $sData, $iDatasize, $sHeader, $sCommand, $aSocket, $sRecv, $aRecv
	Dim $login = "login", $pass = "pass"
	$hFileOpen = FileOpen($sFile)
	$sFileRead = FileRead($hFileOpen)
	$image = $sFileRead
	FileClose($hFileOpen)
	$sBoundary = StringFormat('----------------%s%s%smzF', @MIN, @HOUR, @SEC)

	$sData = '--' & $sBoundary & @CRLF & _
			'Content-Disposition: form-data; name="function"' & @CRLF & @CRLF & _
			'picture2' & @CRLF & _
			'--' & $sBoundary & @CRLF & _
			'Content-Disposition: form-data; name="username"' & @CRLF & @CRLF & _
			$login & @CRLF & _
			'--' & $sBoundary & @CRLF & _
			'Content-Disposition: form-data; name="password"' & @CRLF & @CRLF & _
			$pass & @CRLF & _
			'--' & $sBoundary & @CRLF & _
			'Content-Disposition: form-data; name="pict";'& @CRLF & _
			'Content-Type: image/jpeg' & @CRLF & @CRLF & _
			$image & @CRLF & '--' & $sBoundary ;
	
	$iDatasize = StringLen($sData)
	ConsoleWrite('SIZE: ' & $iDatasize & @CRLF)

	$sHeader = 'POST / HTTP/1.1' & @CRLF & _
			'Host: poster.de-captcher.info' & @CRLF & _
			'Content-Type: multipart/form-data;' & @CRLF & _
			'Connection: close' & @CRLF & _
			'Content-Length: ' & $iDatasize & @CRLF & @CRLF
	$sCommand = $sHeader & $sData
	
	ConsoleWrite('COMMAND: ' & @CRLF & $sCommand & @CRLF)t
	
	$tcp = TCPStartup()
	$aSocket = TCPConnect(TCPNameToIP("poster.de-captcher.info"), 80)
	$send = TCPSend($aSocket, $sCommand)
	While 1
		$sRecv = TCPRecv($aSocket, 300)
		If StringLen($sRecv) <> 0 Then
			ConsoleWrite($sRecv)
			ExitLoop
		EndIf
		Sleep(100)
	WEnd
	TCPCloseSocket($aSocket)
	TCPShutdown()
	Return $sanswer
EndFunc   ;==>_decaptcher


Помогите разобраться почему не работает. Все время приходит ответ с сервера что файл не возможно получить.
Спасибо.
 

Rivald

Новичок
Сообщения
61
Репутация
1
Код:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: close
Date: Thu, 31 Oct 2013 19:21:32 GMT
Server: Apache/2.2.3 (CentOS)
На ошибку не похоже.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
1) Картинка должна быть в бинарном формате
2) Вы не можете "склеивать" между собой текстовый и бинарный формат
В вашем коде 'Content-Type: image/jpeg' & @CRLF & @CRLF & _
$image & @CRLF & '--' & $sBoundary ; все что после $image не добавится к запросу.

Вот пример, кода для отсылки изображений в antigate
Код:
$sBoundary = StringFormat("%s%.5f", "----WinInetBoundaryLine_", Random(10000, 99999))
		$sHead &= 'Content-Type: multipart/form-data; boundary=' & $sBoundary & @CRLF
		$sHead &= 'Host: ' & $sHost & @CRLF
		$sData &= '--' & $sBoundary & @CRLF
		$sData &= 'Content-Disposition:form-data; name="key"' & @CRLF & @CRLF & $sKey & @CRLF & '--' & $sBoundary & @CRLF ;Эту строку можно дублировать, что бы настроить дополнительные опции сервиса.

		$sData &= 'Content-Disposition:form-data; name="numeric"' & @CRLF & @CRLF & 1 & @CRLF & '--' & $sBoundary & @CRLF ;Эту строку можно дублировать, что бы настроить дополнительные опции сервиса.
		$sData &= 'Content-Disposition:form-data; name="min_len"' & @CRLF & @CRLF & 1 & @CRLF & '--' & $sBoundary & @CRLF ;Эту строку можно дублировать, что бы настроить дополнительные опции сервиса.
		$sData &= 'Content-Disposition:form-data; name="max_len"' & @CRLF & @CRLF & 2 & @CRLF & '--' & $sBoundary & @CRLF ;Эту строку можно дублировать, что бы настроить дополнительные опции сервиса.
		$sData &= 'Content-Disposition:form-data; name="soft_id"' & @CRLF & @CRLF & 482 & @CRLF & '--' & $sBoundary & @CRLF ;Эту строку можно дублировать, что бы настроить дополнительные опции сервиса.

		$sData &= '--' & $sBoundary & @CRLF ;Это строку можно убрать. Но она не мешает.
		$sData &= 'Content-Disposition:form-data; name="file"; filename="some_data"' & @CRLF ;
		$sData &= 'Content-Type:' & $sContentType & @CRLF & @CRLF
		$bData = StringToBinary($sData)
		$bData &= $bDataSend ;содержимое файла
		$sData = @CRLF & '--' & $sBoundary & "--" & @CRLF ;Закрываем
		$bData &= StringToBinary($sData)


Здесь $bDataSend содержимое картинки. Получить можно открыв и прочитав через FileOpen() с флагом $FO_BINARY ( $FO_BINARY = 16)

Пример
 
Верх