Đưa ra yêu cầu bằng Python qua Tor


78

Tôi muốn thực hiện nhiều yêu cầu GET bằng Tor đến một trang web. Tôi muốn sử dụng một địa chỉ ipad khác cho mỗi yêu cầu.

import socks
import socket
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
socket.socket = socks.socksocket
import requests
print (requests.get('http://icanhazip.com')).content

Sử dụng cái này, tôi đã đưa ra một yêu cầu. Làm cách nào để thay đổi địa chỉ ipad khác?


Đó không phải là những gì tor phải làm, tức là làm xáo trộn hoặc gây khó khăn cho việc xác định địa chỉ IP của người gửi?
mhawke


@mhawke thì có, nhưng một khi bắt tay kết nối được thực hiện thì nó vẫn tồn tại trong tập hợp các bước nhảy địa chỉ ip mà nó kết nối thông qua, do đó tại sao op lại muốn thay đổi địa chỉ ip.
jamescampbell

Câu trả lời:


35

Đây là mã bạn muốn sử dụng (tải xuống gói gốc bằng cách sử dụng pip install stem)

from stem import Signal
from stem.control import Controller

with Controller.from_port(port = 9051) as controller:
    controller.authenticate(password='your password set for tor controller port in torrc')
    print("Success!")
    controller.signal(Signal.NEWNYM)
    print("New Tor connection processed")

Chúc may mắn và hy vọng rằng điều đó hiệu quả.


Tôi đã thử giải pháp này nhưng gặp lỗi này: error (61, 'Kết nối bị từ chối'). Có vẻ như cổng 9051 không mở trên máy của tôi, tôi đang sử dụng máy mac và đã cố gắng làm mọi cách có thể tìm thấy để mở cổng này nhưng vẫn gặp lỗi này. Có ý kiến ​​gì không?
kflaw

1
@kflaw bạn cần bỏ ghi chú cổng điều khiển của mình trong torrc rồi khởi động lại tor. Theo mặc định, cổng điều khiển 9051 bị tắt vì nó không cần thiết cho việc sử dụng tor thường xuyên.
jamescampbell

cảm ơn vì đã trả lời, tôi quên đề cập rằng tôi đã bỏ ghi chú cổng điều khiển trong torrc cũng như xác thực bằng mật khẩu băm. Tôi đang thiếu gì?
kflaw

@kflaw Bạn có thể đăng liên kết đến mã của bạn trong codepen hoặc thứ gì đó tương tự để tôi có thể nhắc lại lỗi của bạn không? Cảm ơn
jamescampbell

đây là liên kết đến ý chính - Tôi đã thử một số đoạn mã mà tôi tìm thấy trong các bài viết tương tự nhưng tất cả đều gặp khó khăn khi cố gắng thiết lập cổng điều khiển. gist.github.com/kflaw/1a41654993e9692914a7fa18f8819a8f
kflaw

109

Có 2 khía cạnh cho câu hỏi của bạn -

  1. Đưa ra yêu cầu bằng Tor
  2. Gia hạn kết nối theo yêu cầu (trong trường hợp của bạn, sau mỗi yêu cầu)

Phần 1

Cách đầu tiên dễ thực hiện với requeststhư viện mới nhất (trở lên của v2.10.0) với yêu cầu bổ sung về requests[socks]việc sử dụng proxy vớ.

Cài đặt -

pip install requests requests[socks]

Cách sử dụng cơ bản -

import requests

def get_tor_session():
    session = requests.session()
    # Tor uses the 9050 port as the default socks port
    session.proxies = {'http':  'socks5://127.0.0.1:9050',
                       'https': 'socks5://127.0.0.1:9050'}
    return session

# Make a request through the Tor connection
# IP visible through Tor
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
# Above should print an IP different than your public IP

# Following prints your normal public IP
print(requests.get("http://httpbin.org/ip").text)

Phần 2

Để gia hạn IP Tor, tức là để có một IP thoát mới có thể nhìn thấy được, bạn cần có khả năng kết nối với dịch vụ Tor thông qua nó ControlPortvà sau đó gửi NEWNYMtín hiệu.

Cài đặt Tor bình thường không bật ControlPorttheo mặc định. Bạn sẽ phải chỉnh sửa tệp torrc của mình và bỏ ghi chú các dòng tương ứng.

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

Xin lưu ý rằng phần HashedControlPasswordtrên là dành cho mật khẩu "password". Nếu bạn muốn đặt một mật khẩu khác, hãy thay thế mật khẩu HashedControlPasswordtrong torrc bằng cách ghi lại đầu ra từ tor --hash-password "<new_password>"đâu <new_password>là mật khẩu bạn muốn đặt.

................................................... ..............................

Cảnh báo cho người dùng Windows: xem bài đăng tại đây .

Có một sự cố trên các cửa sổ khi cài đặt cho bộ điều khiển trong tệp torrc bị bỏ qua nếu tor được cài đặt bằng lệnh sau:

tor --service install

Để giải quyết vấn đề, sau khi chỉnh sửa tệp torrc của bạn, hãy nhập các lệnh sau:

tor --service remove
tor --service install -options ControlPort 9051

................................................... ..............................

Được rồi, bây giờ chúng ta đã cấu hình Tor đúng cách, bạn sẽ phải khởi động lại Tor nếu nó đang chạy.

sudo service tor restart

Tor bây giờ sẽ được thiết lập và chạy trên 9051 ControlPortmà qua đó chúng ta có thể gửi lệnh đến nó. Tôi thích sử dụng thư viện gốc chính thức để kiểm soát Tor.

Cài đặt -

pip install stem

Bây giờ bạn có thể gia hạn Tor IP bằng cách gọi hàm sau.

Gia hạn IP -

from stem import Signal
from stem.control import Controller

# signal TOR for a new connection 
def renew_connection():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="password")
        controller.signal(Signal.NEWNYM)

Để xác minh rằng Tor có một IP thoát mới, chỉ cần chạy lại mã từ Phần 1. Vì lý do nào đó mà tôi không biết, bạn cần tạo một sessionđối tượng mới để sử dụng IP mới.

session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)

part1 (để kiểm tra nó), bạn sẽ cần pip install request[socks](nếu bạn nhận được một lỗi, pip uninstall requestvà cố gắng cài đặt một lần nữa)
JinSnow

@AshishNitinPatil xin lỗi vì câu hỏi ngớ ngẩn nhưng chúng ta nên sử dụng mã đó trong tệp liệu pháp nào? (Trong settings.py, spider.py hay cái khác?)
JinSnow

1
@JinSnow, đó là câu hỏi về Trị liệu nhiều hơn Tor, hãy xem stackoverflow.com/questions/45009940/… để được trợ giúp thêm.
shad0w_wa1k3r

17

Bạn có thể sử dụng torrequestthư viện (phích cắm không biết xấu hổ). Nó có sẵn trên PyPI.

from torrequest import TorRequest

with TorRequest() as tr:
  response = tr.get('http://ipecho.net/plain')
  print(response.text)  # not your IP address

  tr.reset_identity()

  response = tr.get('http://ipecho.net/plain')
  print(response.text)  # another IP address, not yours

3
tr.reset_identity()không thay đổi địa chỉ IP. Tui bỏ lỡ điều gì vậy? Tôi có cần thay đổi tệp cấu hình tor hay thứ gì đó không?
Shivam Bò tót

4
Tôi biết đây là một câu hỏi và câu trả lời cũ, nhưng câu hỏi này phù hợp với tôi. Tôi chỉ cần làm điều này: với TorRequest (proxy_port = 9050, ctrl_port = 9051, password = 'password') là tr:
alex

1
tr.reset_identity () không hoạt động với tôi. Nhưng dù sao đi nữa, bạn có thể tạo nhiều đối tượng <code> TorRequest (proxy_port = 9050, ctrl_port = 9051, password = 'password') <code>, mỗi đối tượng mới sẽ có IP / phiên mới.
Timur Nurlygayanov

10

Bạn có thể thử thực hiện giao thức tor thuần python Torpy . Không cần ứng dụng khách Tor gốc hoặc phụ thuộc vào Stem.

$ pip3 install torpy[requests]
...

$ python3.7
>>> from torpy.http.requests import TorRequests
>>> with TorRequests() as tor_requests:
...    print("build circuit")
...    with tor_requests.get_session() as sess:
...        print(sess.get("http://httpbin.org/ip").json())
...        print(sess.get("http://httpbin.org/ip").json())
...    print("renew circuit")
...    with tor_requests.get_session() as sess:
...        print(sess.get("http://httpbin.org/ip").json())
...        print(sess.get("http://httpbin.org/ip").json())
...
build circuit
{'origin': '23.129.64.190, 23.129.64.190'}
{'origin': '23.129.64.190, 23.129.64.190'}
renew circuit
{'origin': '198.98.50.112, 198.98.50.112'}
{'origin': '198.98.50.112, 198.98.50.112'}

Vì vậy, mỗi khi bạn nhận được phiên mới, bạn sẽ nhận được danh tính mới (về cơ bản bạn sẽ có mạch mới với nút thoát mới). Xem thêm các ví dụ khác tại tệp readme https://github.com/torpyorg/torpy


7

Yêu cầu hỗ trợ proxy sử dụng giao thức SOCKS từ phiên bản 2.10.0.

import requests
proxies = {
    'http': 'socks5://localhost:9050',
    'https': 'socks5://localhost:9050'
}
url = 'http://httpbin.org/ip'
print(requests.get(url, proxies=proxies).text)

1
Bạn không bao giờ đặt proxy với các yêu cầu. Và khi tôi đặt proxy với yêu cầu 2.11, tôi nhận được kết nối lỗiFailed to establish a new connection
user193661

1
Có, tôi đã bỏ lỡ thông số proxy . Đã sửa, cảm ơn đã thông báo. Và tôi đã cập nhật các yêu cầu lên 2.11 và kiểm tra tập lệnh này - nó hoạt động. Bạn đã bắt đầu dịch vụ tor chưa? Nếu tôi dừng lại, tôi cũng gặp lỗi tương tự.
Karimov Dmitriy

4

Câu trả lời này hoàn thành câu trả lời của Ashish Nitin Patil cho windows (vui lòng cập nhật câu trả lời này)

Phần 2

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

Trên đây HashedControlPasswordlà mật khẩu. Nếu bạn muốn đặt một mật khẩu khác trong bảng điều khiển, hãy điều hướng đến \Tor Browser\Browser\TorBrowser\Torvà nhập các lệnh sau tor.exe --hash-password password_XYZ | more:). Nó sẽ cung cấp cho bạn một cái gì đó giống như HashedControlPassword 16:54C092A8...Đây là mật khẩu của bạn. Bây giờ bạn có thể thêm nó vào tệp torrc ( Tor Browser\Browser\TorBrowser\Data\Tor\torrc).

Sau đó, bạn sẽ cần khởi động lại Tor:

tor --service remove
tor --service install -options ControlPort 9051

Để kiểm tra xem loại đó có hoạt động netstat -ankhông, bây giờ bạn sẽ thấy rằng cổng 9051 đang mở.

Chú ý rằng tor --service install -...sẽ tạo ra Tor Win32 Service. Vì lý do nào đó, có vẻ như bạn phải dừng dịch vụ để sử dụng trình duyệt (chạy services.msc)

CHỈNH SỬA: bạn sẽ tìm thấy nhiều thông tin ở đây (Về số cổng và proxy, Tor, Privoxy, Tác nhân người dùng tự động chuyển đổi ...).


1
thêm thông tin ở đây: github.com/WiliTest/…
J. Does

3

Mã này hoạt động tốt. Sử dụng Tor, nó thay đổi địa chỉ IP sau mỗi lần yêu cầu.

import time, socks, socket
from urllib2 import urlopen
from stem import Signal
from stem.control import Controller

nbrOfIpAddresses=3

with Controller.from_port(port = 9051) as controller:
   controller.authenticate(password = 'my_pwd')
   socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
   socket.socket = socks.socksocket   

   for i in range(0, nbrOfIpAddresses):
       newIP=urlopen("http://icanhazip.com").read()
       print("NewIP Address: %s" % newIP)
       controller.signal(Signal.NEWNYM)
       if controller.is_newnym_available() == False:
        print("Waitting time for Tor to change IP: "+ str(controller.get_newnym_wait()) +" seconds")
        time.sleep(controller.get_newnym_wait())
   controller.close()

1
Đây thực sự là đoạn mã tuyệt vời, nhưng tôi không hiểu nó nbrOfIpAddresses=3đang làm gì. Nó có nhận được một danh sách các địa chỉ ip cố định để bắt đầu không?
user321627

1

Bên requeststrong requesockslà siêu cũ, nó không có response.json()và nhiều thứ khác.

Tôi muốn giữ mã của mình sạch sẽ. Tuy nhiên, requestshiện tại chưa hỗ trợ vớ5 (để biết thêm chi tiết, hãy đọc chuỗi này https://github.com/kennethreitz/requests/pull/478 )

Vì vậy, bây giờ tôi đã sử dụng Privoxylàm proxy http kết nối Tor.

Cài đặt và cấu hình Privoxy trên Mac

brew install privoxy
vim /usr/local/etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
privoxy /usr/local/etc/privoxy/config

Cài đặt và cấu hình Privoxy trên Ubuntu

sudo apt-get install privoxy
sudo vim /etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
sudo /etc/init.d/privoxy restart

Bây giờ tôi có thể sử dụng Tor như một proxy http. Dưới đây là tập lệnh python của tôi.

import requests

proxies = {
  'http': 'http://127.0.0.1:8118',
}

print requests.get('http://httpbin.org/ip', proxies=proxies).text

trên OSX, dòng cuối cùng privoxy /usr/local/etc/privoxy/configtrả về lỗi này2016-08-06 23:47:01.761 00000048 Error: Wrong number of parameters for forward-socks5 in configuration file.
Shoham

Yêu cầu không cho phép sử dụng proxy vớ 5. Hoạt động tốt.
jamescampbell

1

Một chức năng tốt để gia hạn IP của bạn. Ví dụ Windows

def renew_tor_ip():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="aAjkaI19!!laksjd")
        controller.signal(Signal.NEWNYM)

Ví dụ về cách sử dụng

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


def get_current_ip():
    session = requests.session()

    # TO Request URL with SOCKS over TOR
    session.proxies = {}
    session.proxies['http']='socks5h://localhost:9150'
    session.proxies['https']='socks5h://localhost:9150'

    try:
        r = session.get('http://httpbin.org/ip')
    except Exception as e:
        print(str(e))
    else:
        return r.text

#16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15 to aAjkaI19!!laksjd
#cmd shell "C:\Users\Arthur\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe" --hash-password aAjkaI19!!laksjd | more
#Torcc config
#ControlPort 9051
#HashedControlPassword 16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15

def renew_tor_ip():
    with Controller.from_port(port = 9051) as controller:
        controller.authenticate(password="aAjkaI19!!laksjd")
        controller.signal(Signal.NEWNYM)


for i in range(5):
    print(get_current_ip())
    renew_tor_ip()
    time.sleep(5)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.