python-3.x - 如何使用 python aiohttp 连接到 .onion 站点?
问题描述
我正在尝试.onion
使用 python 连接到一个站点。我在端口 9050 上运行了 Tor,但出现以下错误:
Traceback (most recent call last):
File "/Users/jane/code/test/test.py", line 15, in main
res = await fetch(session, id)
File "/Users/jane/code/test/test.py", line 9, in fetch
async with session.get(url) as res:
File "/usr/local/lib/python3.7/site-packages/aiohttp/client.py", line 1005, in __aenter__
self._resp = await self._coro
File "/usr/local/lib/python3.7/site-packages/aiohttp/client.py", line 476, in _request
timeout=real_timeout
File "/usr/local/lib/python3.7/site-packages/aiohttp/connector.py", line 522, in connect
proto = await self._create_connection(req, traces, timeout)
File "/usr/local/lib/python3.7/site-packages/aiohttp/connector.py", line 854, in _create_connection
req, traces, timeout)
File "/usr/local/lib/python3.7/site-packages/aiohttp/connector.py", line 959, in _create_direct_connection
raise ClientConnectorError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host intelex7ny6coqno.onion:80 ssl:None [nodename nor servname provided, or not known]
编码:
import asyncio
import aiohttp
from aiohttp_socks import SocksConnector
async def fetch(session, id):
print('Starting {}'.format(id))
url = 'http://intelex7ny6coqno.onion/topic/{}'.format(id)
async with session.get(url) as res:
return res.text
async def main(id):
connector = SocksConnector.from_url('socks5://localhost:9050')
async with aiohttp.ClientSession(connector=connector) as session:
res = await fetch(session, id)
print(res)
if __name__ == '__main__':
ids = ['10', '11', '12']
loop = asyncio.get_event_loop()
future = [asyncio.ensure_future(main(id)) for id in ids]
loop.run_until_complete(asyncio.wait(future))
此代码工作正常:
import requests
session = requests.session()
session.proxies['http'] = 'socks5h://localhost:9050'
session.proxies['https'] = 'socks5h://localhost:9050'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
}
res = session.get(url, headers=headers)
print(res)
为什么我会得到Cannot connect to host intelex7ny6coqno.onion:80 ssl:None [nodename nor servname provided, or not known]
?
我在这里想念什么?
解决方案
默认情况下,它似乎使用本地 DNS 解析器来异步解析主机名。使用请求时socks5h
,您将通过 SOCKS (Tor) 获得 DNS 解析。
添加rdns =True 似乎适用于 .onion 地址:
connector = SocksConnector.from_url('socks5://localhost:9050', rdns=True)
推荐阅读
- apache-kafka - Kafka消费者关闭时的偏移处理
- c++ - mremap 不会扩大超过一页的大小
- java - Chrome/Java/Selenium4:使用 RemoteWebDriver 的身份验证弹出窗口
- electron - 尝试让 nedb 导入 Svelte 组件
- python - Keras:哪个版本开始支持 Saved Model 格式?
- python - 调用 keras 自定义指标进行预测
- sql-server - 罗马尼亚字符“ă”在 SQL Server 中等于“a”
- python - 如何使用多个列表执行计算?
- spring-boot - 由于多个感叹号,SpringBoot 无法从 Runnable jar 加载属性文件
- docker - 如何为以下命令创建 docker 文件