Что нового

Исправлении ошибки функция Get_IP

Сообщения
33
Репутация
3
Код:
Func _Get_IP()
    Local $ip, $t_ip
    If InetGet("<a href='http://checkip.dyndns.org/?rnd1=' class='bbc_url' title='External link' rel='nofollow external'>http://checkip.dyndns.org/?rnd1="</a> & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, ":") + 1)
        $ip = StringTrimRight($ip, StringLen($ip) - StringInStr($ip, "/") + 2)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    If InetGet("<a href='http://www.whatismyip.com/?rnd1=' class='bbc_url' title='External link' rel='nofollow external'>http://www.whatismyip.com/?rnd1="</a> & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, "Your ip is") + 10)
        $ip = StringLeft($ip, StringInStr($ip, " ") - 1)
        $ip = StringStripWS($ip, 8)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    SetError(1)
    Return -1
EndFunc   ;==>_Get_IP

Кто нибудь может исправить эти ошибки?
Ошибка в консоль:
Код:
C:\Documents and Settings\Krutoy-Nol\Рабочий стол\Proxy Checker.au3(321,156) : ERROR: syntax error
    If InetGet("<a href='http://checkip.dyndns.org/?rnd1=' class='bbc_url' title='External link' rel='nofollow external'>http://checkip.dyndns.org/?rnd1="</
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Documents and Settings\Krutoy-Nol\Рабочий стол\Proxy Checker.au3(331,156) : ERROR: syntax error
    If InetGet("<a href='http://www.whatismyip.com/?rnd1=' class='bbc_url' title='External link' rel='nofollow external'>http://www.whatismyip.com/?rnd1="</
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Documents and Settings\Krutoy-Nol\Рабочий стол\Proxy Checker.au3 - 2 error(s), 0 warning(s)
!>02:49:18 AU3Check ended. Press F4 to jump to next error.rc:2
>Exit code: 0    Time: 1.443
Заранее спасибо! 8)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
на будущее, заключай autoit код в соответствующий тэг [autoit][/autoit] а не просто [code][/code]. и потом, не надо разукрашивать текст и тем более укрупнять шрифт там где не надо. ну и в третьих, после нужного тэга и раскрашивания кода сразу стало ясно где ошибка, не так ли? присмотрись. откуда взят код? по мне так просто плохо скопирован или использован.

Update
почему у тебя в функции ненужные html-тэги? их не должно быть при вызове функции.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
MsgBox(0, '', _Get_IP())

Func _Get_IP()
    Local $ip, $t_ip
    If InetGet("<a href='http://checkip.dyndns.org/?rnd1='' class='bbc_url' title='External link' rel='nofollow external'>http://checkip.dyndns.org/?rnd1='' </a>" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, ":") + 1)
        $ip = StringTrimRight($ip, StringLen($ip) - StringInStr($ip, "/") + 2)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    If InetGet("<a href='http://www.whatismyip.com/?rnd1='' class='bbc_url' title='External link' rel='nofollow external'>http://www.whatismyip.com/?rnd1=''</a>" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, "Your ip is") + 10)
        $ip = StringLeft($ip, StringInStr($ip, " ") - 1)
        $ip = StringStripWS($ip, 8)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    SetError(1)
    Return -1
EndFunc   ;==>_Get_IP


или

Код:
MsgBox(0, '', _Get_IP())

Func _Get_IP()
    Local $ip, $t_ip
    If InetGet("http://checkip.dyndns.org/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, ":") + 1)
        $ip = StringTrimRight($ip, StringLen($ip) - StringInStr($ip, "/") + 2)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    If InetGet("http://www.whatismyip.com/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, "Your ip is") + 10)
        $ip = StringLeft($ip, StringInStr($ip, " ") - 1)
        $ip = StringStripWS($ip, 8)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    SetError(1)
    Return -1
EndFunc   ;==>_Get_IP
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вторая часть проверки неправильная, там в исходном коде возвращается ASCII код символов IP адреса.
Да и зачем сохранять во временный файл?

Вот мой вариант:

Код:
MsgBox(0, '', _Get_IP())

Func _Get_IP()
	Local $sIP, $aIP
	
	$sIP = BinaryToString(InetRead("http://checkip.dyndns.org/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536)))
	
	If $sIP Then
		$sIP = StringRegExpReplace($sIP, '(?si).*?IP Address:\s*([\d\.]+).*', '$1')
		
		If StringRegExp($sIP, '^(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$') Then
			Return $sIP
		EndIf
	EndIf
	
	$sIP = BinaryToString(InetRead("http://www.whatismyip.com/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536)))
	
	If $sIP Then
		$aIP = StringRegExp($sIP, '(?i)<(?:span|label) id="\w+\d+">&#(\d+);</(?:span|label)>', 3)
		$sIP = ''
		
		For $i = 0 To UBound($aIP)-1
			$sIP &= Chr($aIP[$i])
		Next
		
		If StringRegExp($sIP, '^(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$') Then
			Return $sIP
		EndIf
	EndIf
	
	Return SetError(1, 0, -1)
EndFunc ;==>_Get_IP
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Мой вариант:
Код:
MsgBox(0, '', _Get_IP())

Func _Get_IP()
    Local $s_IP, $a_IP
    
    $s_IP = BinaryToString(InetRead("http://www.myip.ru/ru-RU/index.php"))
    
    If $s_IP Then
        $a_IP = StringRegExp($s_IP, '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b', 1)
        Return $a_IP[0]
    EndIf
    
    $s_IP = BinaryToString(InetRead("http://checkip.dyndns.org"))
    
    If $s_IP Then
        $a_IP = StringRegExp($s_IP, '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b', 1)
		Return $a_IP[0]
    EndIf
    
    Return SetError(1, 0, -1)
EndFunc ;==>_Get_IP
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ну и мой, до кучи.. :smile:
Код:
ConsoleWrite(_GetMyIP() & @LF)

Func _GetMyIP()
	Local $a_Url[3] = ['', 'http://ru.smart-ip.net/myip', 'http://www.myexternalip.com/raw']

	For $i = 1 To 2
		$a_Url[0] = InetRead($a_Url[$i], 17)
		If @error Then ContinueLoop
		If $a_Url[0] Then Return StringStripWS(BinaryToString($a_Url[0]), 2)
	Next
	Return SetError(1, 0, '')
EndFunc   ;==>_GetMyIP
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Если в вашей функции задать такой массив:
Код:
$a_Url[3] = ['', '', 'http://www.myexternalip.com/raw']

ошибка выскакивает?
Потому как у меня выскакивает :(
И лечится так:
Код:
If @error Then 
	ContinueLoop
EndIf

P.S. Вот почему я предпочитаю полную форму написания If...Then...EndIf :smile:
 

beliy

Продвинутый
Сообщения
372
Репутация
72
2 madmasles
Спасибо за сервисы, но в вашем варианте проверяется каждый вариант, но возвращается всегда последний. Т.э. если в последнему URL будет ошибка то он вернет ошибку. Да и не зачем все ссылки обрабатывать - достаточно 1 с валидным результатом.
Так Вроде норм обрабатывает:

Код:
ConsoleWrite(_GetMyIP() & @LF)

Func _GetMyIP()
    Local $a_Url[3] = ['', _
	'http://ru.smart-ip.net/myip', _
	'http://www.myexternalip.com/raw' _
	]

   For $i = 1 To UBound($a_Url)-1
	  $a_Url[0] = InetRead($a_Url[$i], 17)
	  If Not @error Then 
		 Return StringStripWS(BinaryToString($a_Url[0]), 8)
		 ExitLoop
	  EndIf
    Next
    Return SetError(1, 0, '')
EndFunc   ;==>_GetMyIP




Добавлено:
Сообщение автоматически объединено:

Кстати такой сервис можно и самому сделать залив php-скрипт на любой хостинг с таким содержимым:
PHP:
<?php
echo $_SERVER["REMOTE_ADDR"];
?>

Имхо, за работоспособностью собственного скрипта следить проще чем за сервисом...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
beliy
Ещё проще брать IP с PC или роутера ;)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
beliy [?]
но в вашем варианте проверяется каждый вариант, но возвращается всегда последний.
Ошибся :-[, поправил. :smile:

Garrett [?]
ошибка выскакивает?
У меня нет.
Garrett [?]
Ещё проще брать IP с PC или роутера
С ADSL беру свой внешний IP без проблем, а с wi-fi роутера как?
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Garrett
Если вы хотите получить свой наружный IP, не вижу проблем!
Тогда, если не сложно выложите рабочий пример, который будет работать для ситуации, когда есть корпоративная сеть с определенным диапазоном внутрених IP, есть шлюз, внутри сети есть прозрачный прокси сервер для доступа в интернет, остальное закрыто фаерволом. Это вполне нормальная ситуация для корпоративной среды.


Добавлено:
Сообщение автоматически объединено:

Также еще есть WiMax модемы которые получают серые ип, с ними такая же ситуация...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Речь идёт о получение своего IP! Я слово "своего" подчеркнул, потому как предвидел ваш вопрос.
beliy [?]
выложите рабочий пример
1. Для начала нужно быть администратором сети.
2. Я имею у себя дома GATEWAY(роутер)+NAT+DHCP+FIREWALL+NAS+AP_WIFI и три машины подключенных в лок. сеть под 192.168.x.x. Я прекрасно могу получить IP GATEWAY как локальный, так и глобальный.
3. Чтобы показать вам пример по вашим выше перечисленным критериям мне нужно построить дома аналогичную сеть чего я, конечно же, делать не буду.
В общем, хочу сказать только одно, логика всех сетей такова, чтобы сеть как можно надёжней была защищена от доступа извне и от доступа из самой сети к основным сервисам, но если вы админ, то вам и карты в руки.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Garrett
Я слово "своего" подчеркнул, потому как предвидел ваш вопрос.
своего ВНЕШНЕГО

если вы админ, то вам и карты в руки.
На примере, WiMax модема видно что это не всегда так. я админ компа, имею полный доступ и к модему, но если он получает серый ИП, то карт в руки не будет. А так как мы имеем универсальный способ, который будет работать без индивидуальный настройки под роутер и других нюансов которые нужно учитывать. Имхо, удобнее...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
beliy [?]
но если он получает серый ИП
На сколько я знаю, любому модему, роутеру и т.д. присваивается как внутрисетевой IP (серый), так и глобальный WANIP.
У вас в административной панели вашего WiMax модема на панели статус не пишется WANIP?
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Garrett
На сколько я знаю, любому модему, роутеру и т.д. присваивается как внутрисетевой IP (серый), так и глобальный WANIP.
Верно, присваивается как LAN так и WAN, НО при этом WAN также может являться серым, т.э. выше модема есть еще шлюз который выдаст модему также серый ип. По сути это аля цепочка роутеров. Также провайдер может и по витой паре предоставить пользователю серый ип. Конечно из-за этого качество интернета очень страдает, но с экономической стороны позволяет провайдеру на 1 канал повесить больше пользователей. В больших городах от этого большинство нормальных провайдеров отказались, но на периферии это встречается еще довольно таки часто.

У вас в административной панели вашего WiMax модема на панели статус не пишется WANIP?
Лично у меня синхронная выделенка на 100Мб, но в силу профессии имею возможность изучать сети разной степени сложности...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
beliy
все верно, одними средствами машины определить самый-самый внешний IP определить проблематично в более менее развернутых корпоративных сетях, а если к вышестоящим девайсам доступа нет, то и вовсе невозможно. поэтому, внешние web-сервисы оптимальный вариант.
 
Верх