28

次のスクリプトがあります。

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2

print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

torとSocksiPyを使用する

次に、リクエストごとに tor ID を変更したいと思います。次に例を示します。

for i in range(0, 10):
   #somehow change tor identity
   print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

これどうやってするの?

4

7 に答える 7

34

Tor は、Python で新しい TOR コントロール ライブラリ、stemを作成しました。PyPIで見つけることができます。彼らはそれをどのように扱うかについていくつかの素晴らしいチュートリアルを提供しています.そのうちの1つはあなたのアイデンティティを変更する方法を説明しています:

from stem import Signal
from stem.control import Controller

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

設定が正しいことを確認してください。

于 2013-11-06T10:06:49.517 に答える
22

今日、私はこの質問についてたくさん検索し、ついに自分自身に答えることができました。しかし、私が言う必要がある前に、pirvoxyとtorは正しく設定されるべきです。最初のスクリプト、次に構成について少し説明します。

import urllib2
from TorCtl import TorCtl

proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support) 

def newId():
    conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="your_password")
    conn.send_signal("NEWNYM")

for i in range(0, 10):
    print "case "+str(i+1)
    newId()
    proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
    urllib2.install_opener(opener)
    print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

上記のスクリプトは新しいIPを取得し、ifconfig.meWebサイトからチェックします。構成について: Privoxyが必要です。HTTP接続でTORを使用するには、privoxyがtorで動作する必要があります。これを行うには、これを/ etc / privoxy/configファイルに追加します。

forward-socks5 / localhost:9050 . #dot is important at the end

次に、/ etc / tor/torrcファイルでControlPortを構成します。この行のコメントを外す必要があります。

ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C

次に、torを再起動します。

/etc/init.d/tor restart
于 2012-03-29T15:41:46.407 に答える
15

外部ライブラリを必要としない別の簡単な解決策は、IPv4 と IPv6 の両方で機能します。

import socket

try:
    tor_c = socket.create_connection((TOR_CTRL_HOST, TOR_CTRL_PORT))
    tor_c.send('AUTHENTICATE "{}"\r\nSIGNAL NEWNYM\r\n'.format(TOR_CTRL_PWD))
    response = tor_c.recv(1024)
    if response != '250 OK\r\n250 OK\r\n':
        sys.stderr.write('Unexpected response from Tor control port: {}\n'.format(response))
except Exception, e:
    sys.stderr.write('Error connecting to Tor control port: {}\n'.format(repr(e)))
于 2013-06-14T14:41:35.150 に答える
4

これは、 STEM、SockSipy、Tor を 100% 使用しているビデオです :)

#!/usr/bin/python
import socks
import socket
import time
from stem.control import Controller
from stem import Signal
import urllib2
import sys

def info():
    print "[*] Welcome to Chart-Cheat Script"
    print "[*] This script works with running TOR only"
    print "[*] usage is chartcheat.py domain"
    print "[*] argument domain must be in format www.example.com"
    print "[*] Example: chartcheat.py www.example.com"
    return

if len(sys.argv)==2:
    info();
    counter = 0
    url = str(sys.argv[1]);
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate()
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
        socket.socket = socks.socksocket
        #visiting url in infinite loop      
        while True:
            urllib2.urlopen("http://"+url)
            counter=counter+1
            print "Page " + url + " visited = " + str(counter)
            #wait till next identity will be available
            controller.signal(Signal.NEWNYM)
            time.sleep(controller.get_newnym_wait())            
else:
    info();

python3 を実行している場合、python3 の urllib パッケージは python2 の urllib2 パッケージと同じになります。

于 2015-03-08T09:36:36.777 に答える
0

次のように書くことができます:

def renew_connection():
    with Controller.from_port(port=9051) as controller:
        controller.authenticate(password='password')
        controller.signal(Signal.NEWNYM)
        controller.close()

def request_tor(url, headers):
    renew_connection()
    session = requests.session()
    session.proxies = {}
    session.proxies['http'] = 'socks5h://localhost:9050'
    print((session.get(url)).text)

于 2021-07-11T09:46:07.457 に答える
0

のいくつかの行のコメントを外すことで、tor コントロール サーバーを有効にすることができます。

/etc/tor/torrc

そしてStemライブラリを使ってNEWNYM信号を送って回路を変更します。

controller.signal(Signal.NEWNYM)

ここでチュートリアルを読むことができます。

于 2016-02-16T08:21:41.683 に答える
-2

以下が機能する可能性があります。

for i in range(0, 10):
   #somehow change tor identity
   socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050+i)
   socket.socket = socks.socksocket

   print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

基本的に、各接続を確立する前にプロキシを設定します。IPを変更する方法を述べていないため、IPごとに異なるプロキシがあると想定しています

于 2012-03-29T14:34:42.587 に答える