我想为我的机器人保护项目添加一种允许某些规则的方法,其中一个规则是当前 IP 属于 Tor,不是因为 Tor 的连接不好,而是提供自定义选项(例如禁用 JS)。
如果没有足够快的 API 密钥来满足要求,我找不到免费的解决方案。 Tor 退出列表似乎也不包含所有 ip,例如某些 Ipv6 ip。
我找到了Tor Exonera:https://metrics.torproject.org/exonerator.html但似乎没有它的API。
我在Possible to add proxy after TOR exit node?的帮助下找到了解决方案,该链接到此博客文章:https://lists.torproject.org/pipermail/tor-project/2020-March/002759 .html.
以下是Python的实现:
import dns.resolver
import ipaddress
def reverse_ip(ip):
try:
ip_obj = ipaddress.ip_address(ip)
if isinstance(ip_obj, ipaddress.IPv4Address):
return '.'.join(reversed(ip.split('.'))) + '.dnsel.torproject.org'
elif isinstance(ip_obj, ipaddress.IPv6Address):
return '.'.join(reversed(ip_obj.exploded.replace(':', ''))) + '.dnsel.torproject.org'
except ValueError:
raise ValueError("Invalid IP address format")
def is_tor_ip(ip):
query = reverse_ip(ip)
try:
answers = dns.resolver.resolve(query, 'A')
for rdata in answers:
if rdata.to_text() == '127.0.0.2':
return True
except dns.resolver.NXDOMAIN:
return False
except dns.resolver.NoAnswer:
return False
except dns.exception.DNSException as e:
print(f"DNS query failed: {e}")
return False
return False
print(is_tor_ip("185.220.101.25"))
print(is_tor_ip("2a0b:f4c2:1::1"))