如何通过隐形互联网结识python朋友? 使用Python和asyncio开发I2P应用程序的基础


不可见的Internet项目 (以下简称I2P)为开发人员提供了一个平台,用于开发具有增强的用户隐私要求的应用程序。 这是位于普通Internet之上的虚拟网络,节点可以在不泄露其真实IP地址的情况下交换数据。 在称为I2P目标的虚拟地址之间会建立连接,而不是在不可见Internet内的IP地址。 您可以具有任意数量的此类地址,甚至对于每个连接都可以更改它们,它们不向另一端提供有关客户端真实IP地址的任何信息。


本文介绍编写I2P应用程序需要了解的基本知识。 使用asyncio内置异步框架在Python中提供了代码示例。


启用S​​AM API并安装i2plib


I2P提供了几种与客户端应用程序交互的API。 对于Java应用程序,使用I2CP;对于常规的客户端服务器应用程序,可以使用I2PTunnel,HTTP和Socks代理。 我们将使用Python进行应用程序,因此选择SAM 。 默认情况下,在原始Java客户端中,SAM API是关闭的,因此您需要启用它。 转到I2P路由器Web控制台,页面“ I2P内部”->“客户端”。 选中“启动时运行”框,然后单击“开始”,然后单击“保存客户端配置”。



C ++中,默认情况下已启用i2pd SAM 客户端


为了简化SAM API的使用,我编写了i2plib Python库。 您可以通过pip进行安装,也可以从GitHub下载源代码。


pip install i2plib 

由于此库与内置的asyncio asyncio框架一起使用 ,因此请记住,代码示例也来自在事件循环中工作的异步函数(协程)。 其他使用示例在存储库中


目标和会话创建


I2P目标的核心是一堆加密和数据签名密钥。 此捆绑包中的公钥在I2P网络上发布,并且代替IP地址用于创建连接。


我们将生成i2plib.Destination ,我们将在以后使用它:


 dest = await i2plib.new_destination() print(dest.base32 + ".b32.i2p") #  base32  

base32地址是其他对等方可以在网络上找到目标的哈希。 如果您打算持续在程序中使用此目标,请将dest.private_key.data的内容保存到本地文件中。


现在,您可以创建一个SAM会话,这实际上是要使此目标在线联机:


  session_nickname = "test-i2p" #      nickname _, session_writer = await i2plib.create_session(session_nickname, destination=dest) 

重要的是要注意,只要session_writer套接字处于打开状态,Destination将处于联机状态。 如果要从网络“关闭”此目标,请调用session_writer.close()。


建立外向连接


现在,目的地已联机,我们可以使用它与其他节点进行通信。 例如,连接到节点“ udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p”,发送HTTP GET请求并读取响应(存在Web服务器“ i2p-projekt.i2p”):


 remote_host = "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p" reader, writer = await i2plib.stream_connect(session_nickname, remote_host) writer.write("GET /en/ HTTP/1.0\nHost: {}\r\n\r\n".format(remote_host).encode()) buflen, resp = 4096, b"" while 1: data = await reader.read(buflen) if len(data) > 0: resp += data else: break writer.close() print(resp.decode()) 

接受传入的连接


如您所见,当连接到另一台主机时,一切都很简单,但是接受传入的信息有一个细微差别。 当有新客户端连接到您时,SAM将带有该客户端目标的字符串发送到ASCII套接字。 由于目标和数据可以合二为一,因此您需要考虑这一点。


这是一个简单的PING-PONG服务器的外观,该服务器接受传入的连接,将目标客户端保存到remote_destination变量,然后将PONG发送回:


 async def handle_client(incoming, reader, writer): """  """ dest, data = incoming.split(b"\n", 1) remote_destination = i2plib.Destination(dest.decode()) if not data: data = await reader.read(BUFFER_SIZE) if data == b"PING": writer.write(b"PONG") writer.close() #  ,        while True: reader, writer = await i2plib.stream_accept(session_nickname) incoming = await reader.read(BUFFER_SIZE) asyncio.ensure_future(handle_client(incoming, reader, writer)) 

更多资讯


它描述了流协议的用法,该协议在I2P网络上执行TCP / IP的功能。 SAM API还提供了发送和接收匿名数据报的功能,类似于UDP协议。 i2plib中尚不提供此功能,稍后将添加。


这只是最基本的信息,但已经足以在I2P中启动您的项目。 不可见的Internet适合编写各种应用程序,其中首先要维护用户的隐私。 网络对开发人员没有任何限制,它可以是客户端服务器或P2P应用程序。


Source: https://habr.com/ru/post/zh-CN426315/


All Articles