add GenericHttpRegexSource provider

This commit is contained in:
Dmitry Belyaev 2024-02-25 15:42:21 +03:00
parent 3131f2d0a0
commit 3e248b0adf
Signed by: b4tman
GPG Key ID: 41A00BF15EA7E5F3
2 changed files with 38 additions and 1 deletions

View File

@ -0,0 +1,33 @@
import re
from pddnsc.sources.http import GenericHttpSource
class GenericHttpRegexSource(GenericHttpSource):
"""Базовый провайдер получения IP адресов по http/https ссылкам в виде текста c помощью регулярных выражений
Конфигурация:
- url_v4: *URL* для получения адреса *IPv4*
- url_v6: *URL* для получения адреса *IPv6*
- regex_v4: регулярное выражение для *IPv4*, значение по умолчанию см. в коде
- regex_v6: регулярное выражение для *IPv6*, значение по умолчанию см. в коде
- headers (`dict`): словарь дополнительных заголовков (*необязательно*)
"""
def post_init(self):
super().post_init()
rx_v4 = r"\b(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
rx_v6 = r"\b(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\b"
self.regex_v4 = re.compile(self.config.get("regex_v4", rx_v4))
self.regex_v6 = re.compile(self.config.get("regex_v6", rx_v6))
def filter_ipv4(self, ipv4):
match = self.regex_v4.search(ipv4 or "")
ipv4 = match and match[0]
return super().filter_ipv4(ipv4)
def filter_ipv6(self, ipv6):
match = self.regex_v6.search(ipv6 or "")
ipv6 = match and match[0]
return super().filter_ipv6(ipv6)

View File

@ -1,4 +1,4 @@
debug = true
debug = false
require_ipv4 = true
[sources]
@ -8,6 +8,10 @@ require_ipv4 = true
provider = "WTFIsMyIP"
[sources.ipsb]
provider = "IPSB"
[sources.checkip_dyndns]
provider = "GenericHttpRegexSource"
url_v4 = "http://checkip.dyndns.org/"
#regex_v4 = "\\b\\d{1,3}(\\.\\d{1,3}){3}\\b"
[sources.ifconfig]
provider = "GenericHttpSource"
url_v4 = "https://ifconfig.me/ip"