Ip Adresse

08/13/2013 15:40 M7TRA#1
+
08/13/2013 16:28 alpines#2
Du könntest auf einer Website, wie z.B. [Only registered and activated users can see links. Click Here To Register...] die einfach aufgebaut ist.
Dann per INetGet / TCPSend/Recv-Packets anfordern, Stringfunktionen anwenden und fertig.
08/13/2013 16:43 Achat#3
Quote:
Originally Posted by alpines View Post
Du könntest auf einer Website, wie z.B. [Only registered and activated users can see links. Click Here To Register...] die einfach aufgebaut ist.
Dann per INetGet / TCPSend/Recv-Packets anfordern, Stringfunktionen anwenden und fertig.
InetGet ist gefährlich, da dort der IE Cache verwendet werden kann und die Ergebnisse somit nicht unbedingt richtig sind.

Code:
#include <WinHttp.au3>

MsgBox(0, 0, 'Your IP is: ' & _GetPublicIP())

Func _GetPublicIP()
	$aIP = StringRegExp(_InetReadWinHttp('GET', 'api.hostip.info', '/get_html.php?ip='), 'IP\: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', 3)
	If IsArray($aIP) Then Return $aIP[0]
EndFunc   ;==>_GetPublicIP

Func _InetReadWinHttp($sType, $sServerName, $sPath = Default, $sReferrer = Default, $sData = Default, $sHeader = Default, $fGetHeaders = Default, $iMode = Default)
	Local $sUserAgent = 'Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0'
	Local $hSession = _WinHttpOpen($sUserAgent)
	Local $hConnect = _WinHttpConnect($hSession, $sServerName)
	Local $vReturn = _WinHttpSimpleRequest($hConnect, $sType, $sPath, $sReferrer, $sData, $sHeader, $fGetHeaders, $iMode)
	_WinHttpCloseHandle($hConnect)
	_WinHttpCloseHandle($hSession)
	Return $vReturn
EndFunc   ;==>_InetReadWinHttp
Man sollte aber davon absehen, IP-Anfragen zu spammen, d.h. ein Zwischenspeichern der IP wäre sinnvoll, wenn die Funktion mehr als ein mal alle paar Minuten aufgerufen wird.

€:

Falls du einen Server hast / webspace,
PHP Code:
<?php
header
('Content-Type: text/plain');
echo 
$_SERVER['REMOTE_ADDR'];
?>
MfG
08/13/2013 16:44 alpines#4
Ich hab auch geschrieben das das mit TCPSend/TCPRecv-Packets geht, da brauchst du keine WinHttp UDF, da die sowieso viel zu langsam ist.
08/13/2013 16:59 Achat#5
Quote:
Originally Posted by alpines View Post
Ich hab auch geschrieben das das mit TCPSend/TCPRecv-Packets geht, da brauchst du keine WinHttp UDF, da die sowieso viel zu langsam ist.
:mad:

Dass muss empirisch untersucht werden.

Code:
dim $hTimerWinHttp,$hTimerTCP

$hTimerWinHttp=TimerInit()
for $i = 1 to 30
_InetReadWinHttp('GET','google.com','/')
Next
ConsoleWrite('WINHTTP: '&TimerDiff($hTimerWinHttp)&@CRLF)

$hTimerTCP=TimerInit()
for $i = 1 to 30
_TCPHTTPRequest('GET','www.google.com','/?gws_rd=cr')
Next
ConsoleWrite('TCP: '&TimerDiff($hTimerTCP)&@CRLF)
Ergebnis:
Code:
WINHTTP: 11130.4397156683
TCP: 3220.66502365244
WinHttp = AutoIt -> DllCall -> TCP
TCP = AutoIt -> TCP

WinHttp verwaltet z.b. automatisch Cookies etc, hat eben viel mehr Funktionen, dafür aber auch langsamer. Bei 302/301 Headern (found,moved etc) leitet TCP nicht automatisch weiter.

MfG
08/13/2013 17:07 alpines#6
Da mach ich doch gleich mit:

Für WinHttp brauchst du die WinHttp UDF und musst deren Funktionen nutzen statt es mit ein paar Zeilen selber zu machen welches schneller und ohne UDF geht.

Desweiteren möchte ich mal deine "_TCPHTTPRequest"-Funktion sehen.

Da man aber lediglich nur eine Website laden möchte (und wenn diese Seite nicht da ist, dann bringt dir WinHttp auch nicht weiter) dann ist TCP ohne WinHttp die bessere Variante, weil sich IP-Seiten nie ändern und sollte ein Aufruf doch fehlschlagen (welcher dann bei WinHttp auch passieren würde) dann nimmt man zur Sicherheit eine 2. Seite.

Zu dem Cookies: Du willst dir nur eine Website aufrufen und nicht gleich dich irgendwo anmelden.
08/13/2013 18:15 Achat#7
Quote:
Originally Posted by alpines View Post
Desweiteren möchte ich mal deine "_TCPHTTPRequest"-Funktion sehen.
PM ;)

Code:
dim $hTimer=TimerInit()
dim $sIP=_REMOTE_ADDR()
MsgBox(0, 'REMOTE_ADDR', $sIP&@CRLF&@CRLF&Floor(TimerDiff($hTimer)))

Func _REMOTE_ADDR()
	Local $iSocket, $sRead
	TCPStartup()
	$iSocket = TCPConnect(TCPNameToIP('ping.eu'), 80)
	If $iSocket < 1 Then Return
	TCPSend($iSocket, 'GET / HTTP/1.1' & @CRLF & _
			'Host: ping.eu' & @CRLF & _
			'User-Agent: AutoIt' & @CRLF & _
			'Accept-Encoding: none' & @CRLF & _
			'Accept: */*' & @CRLF & _
			'Connection: close' & @CRLF & @CRLF)
	While $sRead = ''
		$sRead = TCPRecv($iSocket, 1)
	WEnd
	While 1
		$sRead &= TCPRecv($iSocket, 1024)
		If @error Then ExitLoop
	WEnd
	TCPCloseSocket($iSocket)
	TCPShutdown()
	Return StringRegExpReplace($sRead, '(?i)(?s).*Your IP is <b>(.+?)</b>.*', '\1')
EndFunc   ;==>_REMOTE_ADDR
Hier funktioniert dein minimal-packet
Code:
	TCPSend($iSocket, 'GET / HTTP/1.1' & @CRLF & _
			'Host: ping.eu')
nicht.

MfG
08/13/2013 20:18 alpines#8
So, jetzt versteh ich keinen Spaß mehr :D

1. Dein Paket ist falsch!

So lautet es richtig:
Code:
$sPacket = "GET / HTTP/1.1" & @CRLF & _
	"Host: www.ping.eu" & @CRLF & _
	@CRLF
2. Ich sprach von der anderen Seite, wtfismyip.com da wäre das Paket:
Code:
$sPacket = "GET / HTTP/1.1" & @CRLF & _
	"Host: wtfismyip.com" & @CRLF & _
	@CRLF
Merke dir, am Ende eines HTTP-Packets haben immer 2 Carriage Return Line Feeds zu stehen, weil sie der Server sonst nicht parsen kann, aber das hast du ja hier nur vergessen.
08/13/2013 20:23 M7TRA#9
oh was :D und wie kriege ich jetz meine GlobalIp ?:x ist mir ehrlich gesagt zu viel Fachgesimpel:D
08/13/2013 20:24 alpines#10
Du benutzt entweder meine oder seine Variante, je nach dem was dir mehr gefällt und dann wendest du am Source-Code Stringfunktionen an um deine IP aus dem Source-Code zu filtern.

Fertig!
08/13/2013 20:33 M7TRA#11
das sagst du so leicht.ich bin totaler Anfänger und kann mit String undsoweiter nichts anfangen :DD
Gibt es keine einfache Funktion sie herauszufinden ohne ander webseiten und http/Tcp krams?:D
08/13/2013 21:21 alpines#12
Nach kurzer Arbeit: Du nutzt hier den Service WieIstMeineIp.de

Code:
#include <String.au3>

TCPStartUp()

$hServer = TCPConnect("212.19.62.76", 80)

If $hServer = -1 Then
	MsgBox(16, "Error", "Could not retreive global IP.")
	Exit
EndIf

TCPSend($hServer, "GET / HTTP/1.1" & @CRLF & "Host: www.wieistmeineip.de" & @CRLF & @CRLF)

Do
	$sHTML = TCPRecv($hServer, 4096)
Until StringInStr($sHTML, '<h1 class="ip">')

TCPCloseSocket($hServer)
TCPShutdown()

$aGlobalIp = _StringBetween($sHTML, '<h1 class="ip">', "</h1>")
Global Const $sGlobalIp = $aGlobalIp[0]

MsgBox(64, "Global Ip", $sGlobalIp)
08/13/2013 22:23 Achat#13
Wieviele Scripte sollen es denn noch werden?

Quote:
Originally Posted by alpines View Post
Code:
$aGlobalIp = _StringBetween($sHTML, '<h1 class="ip">', "</h1>")
Code:
$aGlobalIp =StringRegExp($sHTML, '<h1 class="ip">(.+)</h1>',3)
_StringBetween benutzt StringRegExp. Also kann man das gleich benutzen ;)

@mt2guides

einfach mal mein Beispiel ausführen ;)

Code:
MsgBox(0, '', 'Deine IP ist ' & _REMOTE_ADDR())

Func _REMOTE_ADDR()
	Local $iSocket, $sRead
	TCPStartup()
	$iSocket = TCPConnect(TCPNameToIP('ping.eu'), 80)
	If $iSocket < 1 Then Return
	If Not TCPSend($iSocket, 'GET / HTTP/1.1' & @CRLF & _
			'Host: ping.eu' & @CRLF & _
			'User-Agent: AutoIt' & @CRLF & _
			'Accept-Encoding: none' & @CRLF & _
			'Accept: */*' & @CRLF & _
			'Connection: close' & @CRLF & @CRLF) Then Return 0
	While $sRead = ''
		$sRead = TCPRecv($iSocket, 1)
	WEnd
	While 1
		$sRead &= TCPRecv($iSocket, 1024)
		If @error Then ExitLoop
	WEnd
	TCPCloseSocket($iSocket)
	TCPShutdown()
	Return StringRegExpReplace($sRead, '(?i)(?s).*Your IP is <b>(.+?)</b>.*', '\1')
EndFunc   ;==>_REMOTE_ADDR
Mit
Code:
_REMOTE_ADDR()
kannst du die Funktion aufrufen, welche dir deine aktuelle öffentliche IP-Adresse zurück gibt.

MfG
08/13/2013 22:52 M7TRA#14
ok dankesehr:)
08/14/2013 12:40 alpines#15
Nicht jeder kennt sich mit einem StringRegExp Pattern aus, da ist die Variante mit _StringBetween handlicher.