كيف يمكنني الحصول على عنوان IP الخارجي للمقبس في بايثون؟
سؤال
عندما أتصل socket.getsockname()
على كائن مأخذ توصيل، يقوم بإرجاع مجموعة من عنوان IP الداخلي لجهازي والمنفذ.ومع ذلك، أود استرداد IP الخارجي الخاص بي.ما هي الطريقة الأرخص والأكثر فعالية للقيام بذلك؟
المحلول
وهذا غير ممكن بدون التعاون من خادم خارجي، لأنه من الممكن أن يكون هناك أي عدد من NATs بينك وبين الكمبيوتر الآخر.إذا كان بروتوكولًا مخصصًا، فيمكنك أن تطلب من النظام الآخر الإبلاغ عن العنوان المتصل به.
نصائح أخرى
الطريقة الوحيدة التي يمكنني التفكير في ضمان إعطائها لك هي النقر على خدمة مثل http://whatismyip.com/ للحصول عليه.
https://github.com/bobeirasa/mini-scripts/blob/master/externalip.py
'''
Finds your external IP address
'''
import urllib
import re
def get_ip():
group = re.compile(u'(?P<ip>\d+\.\d+\.\d+\.\d+)').search(urllib.URLopener().open('http://jsonip.com/').read()).groupdict()
return group['ip']
if __name__ == '__main__':
print get_ip()
مقبس الاستيراد
الصورة = المقبس.socket(socket.AF_INET، المقبس.SOCK_STREAM)
s.connect(("msn.com"،80))
s.getsockname()
print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read())
ستحتاج إلى استخدام نظام خارجي للقيام بذلك.
ستمنحك إجابة DuckDuckGo IP ما تريده بالضبط، وبصيغة JSON!
import requests
def detect_public_ip():
try:
# Use a get request for api.duckduckgo.com
raw = requests.get('https://api.duckduckgo.com/?q=ip&format=json')
# load the request as json, look for Answer.
# split on spaces, find the 5th index ( as it starts at 0 ), which is the IP address
answer = raw.json()["Answer"].split()[4]
# if there are any connection issues, error out
except Exception as e:
return 'Error: {0}'.format(e)
# otherwise, return answer
else:
return answer
public_ip = detect_public_ip()
print(public_ip)
باستخدام العنوان المقترح في مصدر http://whatismyip.com
import urllib
def get_my_ip_address():
whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp'
return urllib.urlopen(whatismyip).readlines()[0]
تحتاج إلى الاتصال بخادم خارجي والحصول على عنوان IP العام الخاص بك من الرد
مثله:
import requests
myPublic_IP = requests.get("http://wtfismyip.com/text").text.strip()
print("\n[+] My Public IP: "+ myPublic_IP+"\n")