代码之家  ›  专栏  ›  技术社区  ›  Lord Elrond Mureinik

如何使用python aiohttp连接到.onion站点?

  •  1
  • Lord Elrond Mureinik  · 技术社区  · 7 年前

    我正在尝试连接到 .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]

    我错过了什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   drew010    7 年前

    默认情况下,它似乎使用本地DNS解析器异步解析主机名。使用请求时 socks5h 您正在通过SOCKS(Tor)获得DNS解析。

    添加 rdns

    connector = SocksConnector.from_url('socks5://localhost:9050', rdns=True)