有没有办法查明特定 IP 是否来自 Tor 或者充当 Tor 出口节点?

问题描述 投票:0回答:1

我想为我的机器人保护项目添加一种允许某些规则的方法,其中一个规则是当前 IP 属于 Tor,不是因为 Tor 的连接不好,而是提供自定义选项(例如禁用 JS)。

如果没有足够快的 API 密钥来满足要求,我找不到免费的解决方案。 Tor 退出列表似乎也不包含所有 ip,例如某些 Ipv6 ip。

我找到了Tor Exonerahttps://metrics.torproject.org/exonerator.html但似乎没有它的API。

bots tor
1个回答
0
投票

我在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"))
© www.soinside.com 2019 - 2024. All rights reserved.