Tor не может работать с Failed для привязки одного из портов слушателя
Когда я запускаю [пример][1] из документации по основам, я получаю сообщение об ошибке:
OSError: Process terminated: Failed to bind one of the listener ports.
Точный код, который я запускаю ниже:
import socks
import socket
import stem.process
import urllib
from stem.util import term
SOCKS_PORT = 7000
# Set socks proxy and wrap the urllib module
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT)
socket.socket = socks.socksocket
# Perform DNS resolution through the socket
def getaddrinfo(*args):
return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]
socket.getaddrinfo = getaddrinfo
def query(url):
return urllib.urlopen(url).read()
def print_bootstrap_lines(line):
if "Bootstrapped " in line:
print(term.format(line, term.Color.BLUE))
print(term.format("Starting Tor:\n", term.Attr.BOLD))
tor_process = stem.process.launch_tor_with_config(
config = {
'SocksPort': str(SOCKS_PORT),
'ExitNodes': '{ru}',
},
init_msg_handler = print_bootstrap_lines,
)
print(term.format("\nChecking our endpoint:\n", term.Attr.BOLD))
print(term.format(query("https://www.atagar.com/echo.php"), term.Color.BLUE))
print(query("https://stackru.com/questions/30286293/make-requests-using-python-over-tor"))
tor_process.kill()
Я видел ответы о том, что на порту 9050 запущен другой процесс, но он выполняет команду sudo netstat -anl | grep 9050
в терминале не дает мне результата.
Пожалуйста, не стесняйтесь предложить что-нибудь, что может помочь.
Кроме того, первый пример "России с любовью" работает без нареканий.
Спасибо за любую помощь, которую вы можете оказать.
1 ответ
Проверка tor установлена
sudo apt install tor
Проверь это
sudo gedit /etc/default/tor
найти и заменить "да" на "нет" там
RUN_DAEMON="yes"
остановить демона
sudo /etc/init.d/tor stop
Работал и столкнулся с этим на Linux Mint.
Был в состоянии обойти это путем сна / паузы в течение длительных периодов времени.
Import time
time.sleep(1000) #usually sleep it over 10 minutes for my case
Из того, что я скребу, нужно спать, поэтому это прекрасно, но я определенно вижу, что это не помогает в других случаях.
Поскольку вы используете SOCKS_PORT как 7000, используйте команду ниже, чтобы найти процесс, использующий его.
sudo netstat -plnt | grep 7000
Если вы получите что-то вроде этого (см. Tor в конце),
tcp 0 0 127.0.0.1:7000 0.0.0.0:* LISTEN 13009/tor
использовать sudo killall tor
чтобы завершить процесс tor.
Использование "sudo" и имени процесса ("tor") для завершения команды не рекомендуется. Вместо этого вы должны использоватьkill pid
команда, где pid - это идентификатор процесса (13009), представленный в приведенном выше выводе.
Я столкнулся с этой проблемой при использовании пакета "threading", и вот мое решение, которое может оказаться полезным для странников.
Я использовал решение, предоставленное лучшим ответом, а также сделал это:
for thread in threads_list:
time.sleep(0.1)
thread.run()