Что нового

[Сеть, интернет] Узнать url после перенаправления. Winhttp.

AlexxxRu

Знающий
Сообщения
19
Репутация
6
Вот, например, ссылка.
http://zero.kz/go/?site_id=12511
Как узнать URL сайта куда меня перенаправят?
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("GET", "http://zero.kz/go/?site_id=12511")
$oHTTP.Send('')
$oHTTP.WaitForResponse
$Response = $oHTTP.ResponseText
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AlexxxRu [?]
Как узнать URL сайта куда меня перенаправят?
Нужно разрешить перенаправление и проверять Location:

Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Option(6) = False ;WinHttpRequestOption_EnableRedirects
$oHTTP.Open("GET", "http://zero.kz/go/?site_id=12511")
$oHTTP.Send()
$oHTTP.WaitForResponse
$sNewLocation = $oHTTP.GetResponseHeader("Location")
ConsoleWrite($sNewLocation & @LF)


Хотя я предпочитаю это делать через TCP*:

Код:
$sHead = _HTTPHead("zero.kz", "/go/?site_id=12511")

$sNewLocation = StringRegExpReplace($sHead, '(?s).*Location: (.*?)\r?\n.*', '\1')
ConsoleWrite($sNewLocation & @LF)

Func _HTTPHead($sHost, $sPage)
	TCPStartup()
	
	Local $sName_To_IP = TCPNameToIP($sHost)
	Local $iSocket = TCPConnect($sName_To_IP, 80)
	
	If $iSocket = -1 Then
		TCPShutdown()
		Return SetError(1, 0, "")
	EndIf
	
	Local $sCommand = "HEAD " & $sPage & " HTTP/1.1" & @CRLF
	$sCommand &= "Host: " & $sHost & @CRLF
	$sCommand &= "User-Agent: AutoIt/" & @AutoItVersion & " (Windows; U; Windows NT 5.1; en-US; rv:1.8.1)" & @CRLF
	$sCommand &= "Referer: " & $sHost & @CRLF
	$sCommand &= "Connection: close" & @CRLF & @CRLF
	
	Local $BytesSent = TCPSend($iSocket, $sCommand)
	
	If $BytesSent = 0 Then
		TCPShutdown()
		Return SetError(2, @error, 0)
	EndIf
	
	Local $sRecv = "", $sCurrentRecv
	
	While 1
		$sCurrentRecv = TCPRecv($iSocket, 16)
		If @error <> 0 Then ExitLoop
		If $sCurrentRecv <> "" Then $sRecv &= $sCurrentRecv
	WEnd
	
	TCPCloseSocket($iSocket)
	TCPShutdown()
	
	Return $sRecv
EndFunc
 
Автор
A

AlexxxRu

Знающий
Сообщения
19
Репутация
6
CreatoR, спасибо.
А почему вы "спускаетесь" до уровня TCP?
Стоит ли использовать более "низкий" уровень?
В чём его преимущества?

И ещё один вопрос.
Можно ли где-то посмотреть реализацию стандартных функций? Как PixelGetColor и т.д.
Параллельно изучаю С++, и интересно было бы реализовать самому, чтобы понимать как оно работает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AlexxxRu [?]
почему вы "спускаетесь" до уровня TCP?
Я не считаю что TCP по уровню ниже чем «WinHttp.WinHttpRequest».

В чём его преимущества?
В том что у него нет свойства „ломаться“, в отличий от COM-объектов.

И ещё один вопрос.
Он уже не касается данной темы, посмотрите тут.
 
Верх