""" Utility functions needed by various modules. """ import struct import requests import re import logging pack4bytes_be = struct.Struct(">BBBB").pack split_dot = re.compile("\.").split pattern_ipresponse = re.compile("(
\d+\.\d+\.\d+\.\d+
)") pattern_ip = re.compile("\d+\.\d+\.\d+\.\d+") logger = logging.getLogger("pra_framework") def int_to_ip_str(ip_int): """ Convert an integer to an IP string return -- an IP address like "1.2.3.4" """ return "%d.%d.%d.%d" % ((ip_int >> 24), (ip_int >> 16) & 255, (ip_int >> 8) & 255, ip_int & 255) def int_to_ip_bytes(ip_int): """ Convert an integer to an IP string (byte representation) return -- an IP address like b"\x00\x01\x02\x03" """ return pack4bytes_be((ip_int >> 24), (ip_int >> 16) & 255, (ip_int >> 8) & 255, ip_int & 255) def ip_str_to_int(ip_str): a,b,c,d = split_dot(ip_str) return (int(a) << 24) | (int(b) << 16) | (int(c) << 8) | int(d) def ip_str_to_bytes(ip_str): ip_digits = ip_str.split(".") return pack4bytes_be(int(ip_digits[0]), int(ip_digits[1]), int(ip_digits[2]), int(ip_digits[3])) def get_external_ip(): """ Get the IP address as seen from the internet. return -- IP address as string or None """ response = requests.get("http://www.wieistmeineip.de/") matches = pattern_ipresponse.search(response.text) if matches is None: raise Exception("no IP found in response") ip_html = matches.group(0) return pattern_ip.search(ip_html).group(0) if __name__ == "__main__": print(get_external_ip())