白帽故事 · 2022年8月17日 0

使用Python配置Tor

背景介绍:

如果你曾经写过网络爬虫,那么你一定遇到过因生成过多请求而被对方服务器阻止的问题,或者你只是想隐藏真实 IP 地址并自动化运行你的脚本。

本文将解释如何在 Linux 系统上配置 TOR,以及如何使用 Python 脚本实现 TOR 以隐藏你的真实 IP 并绕过基于 IP 的限制。

TOR是个啥?

“Tor是洋葱路由器(The Onion Router)的简称,是一款免费开源的匿名通信软件。”Tor网络是一种安全的加密协议,可以确保网络上数据和通信的私密性。

Tor 服务/浏览器使用称为洋葱路由的技术,洋葱路由器是一种点对点 (P2P) 覆盖网络,使用户能够匿名浏览互联网,通过网络发送信息的来源和目的地可以利用洋葱路由使用多层加密实现隐藏。

TOR 网络通常需要使用 TOR 浏览器访问,但如果你想在 Python 脚本中使用它并通过 TOR 网络运行自动化脚本该怎么办?这正是我们今天这篇文章要讲的!

TOR 安装

首先Tor的安装取决于你的操作系统,官网(https://www.torproject.org/download/)有详细说明,对于大多数基于 Debian 的操作系统,操作起来基本都非常方便。

sudo apt-get install tor

要启动Tor服务,运行:

sudo service tor start

如果要检查服务是否有效,只需运行如下命令:

curl --socks5 localhost:9050 --socks5-hostname localhost:9050 -s https://check.torproject.org/ | cat | grep -m 1 Congratulations | xargs

如果一切正常,你会看到如下内容:

Congratulations. This browser is configured to use Tor.

使用Python进行配置

安装 Python 相关请求模块,可用于后续 TOR 网络请求发送:

sudo pip3 install requests
sudo pip3 install requests[socks]
sudo pip3 install requests[security]
sudo pip3 install cryptography

使用请求模块:

import requests

可以使用下方命令在没有 Tor 的情况下检查你的 IP 地址:

requests.get('https://ident.me').text

输出的结果会是你的真实 IP 地址。

要在 Python 脚本中使用 TOR 网络,首先需要告诉 Python 使用代理:

proxies = {
    'http': 'socks5://127.0.0.1:9050',
    'https': 'socks5://127.0.0.1:9050'
}

现在,你会得到一个新的 IP 地址:

requests.get('https://ident.me', proxies=proxies).text

获取新身份

我们需要在每次发出新请求时或以固定的时间间隔获取新的 IP 地址,因此我们需要一个名为“Stem”的 Python 模块。

Stem 是 Tor 的 Python 控制器库,有了它我们就可以使用 Tor 的控制协议来编写针对 Tor 进程的脚本。

为了更加匿名,我们可以使用“Fake UserAgent”模块为每个请求生成一个新的用户代理,这两个模块均可使用 pip 安装:

sudo pip3 install stem
sudo pip3 install fake_useragent

Tor 控制器还必须配置为请求身份更新。

sudo nano /etc/tor/torrc

将以下内容写入 /etc/tor/torrc 文件中:

ControlPort 9051
CookieAuthentication 1

然后重新启动 Tor 以使这些修改生效:

sudo service tor restart

脚本整合

首先,导入所需模块:

import time
import requests
from fake_useragent import UserAgent
from stem import Signal
from stem.control import Controller

然后定义代理:


proxies = {
    'http': 'socks5://127.0.0.1:9050',
    'https': 'socks5://127.0.0.1:9050'
}

现在将为 Stem Controller 定义一个 Handler,使用该处理程序,将验证我们的请求并生成信号以获取新 IP 地址:

with Controller.from_port(port = 9051) as c:
        c.authenticate()
        c.signal(Signal.NEWNYM)

以下是完整代码:

import time
import requests
from fake_useragent import UserAgent
from stem import Signal
from stem.control import Controller
proxies = {
    'http': 'socks5://127.0.0.1:9050',
    'https': 'socks5://127.0.0.1:9050'
}
print("Changing IP Address in every 10 seconds....\n\n")
while True:
    headers = { 'User-Agent': UserAgent().random }
    time.sleep(10)
    with Controller.from_port(port = 9051) as c:
        c.authenticate()
        c.signal(Signal.NEWNYM)
        print(f"Your IP is : {requests.get('https://ident.me', proxies=proxies, headers=headers).text}  ||  User Agent is : {headers['User-Agent']}")

代码将每10秒生成一个新IP地址,并在每个请求中生成一个新的用户代理。

工具用途

有很多场景可以使用该工具,例如:

  • 在不被阻止的情况下爬取普通 Web 页面
  • 制作暗网爬虫
  • 掩藏 IP 地址
  • 更多功能待你发现…..

So,你学废了么?