1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import re
import socket
import _thread
import os
import re
import os.path

class Proxy:
def __init__(self): # 我们要设置一个初始套接字等待客户端的连
self.recv_client = None
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 代表基于IP地址的TCP套接字连接。
self.client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.client_socket.bind(("0.0.0.0", 11111)); # 手机卡绑定手机,可以接听
self.client_socket.listen(10) # 最多同时接10个
self.Host = None
self.Server_address = None

# 初始化接听手机完毕。
# 为什么不初始化打电话的手机呢?因为我们要收到消息之后再打出去。
def change_coming_data(self, message):
if os.path.exists('output.html'):
os.remove('output.html')
print("已删除原输出文件")
f = open('output.html', "wb+")
#if message.decode('utf-8').find("首页") != -1:
print("找到要过滤的字符")
f.write(message.decode('utf-8').replace("首页", '').encode('utf-8'))
#os.open('output.txt', os.O_RDWR, mode=777)
print("已写入修改新响应消息")
f.close()
print("已关闭新写入文件,并且读取修改完毕的内容。")
#print(message.decode('utf-8'))
return message

def back_to_client(self):
goto_html = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
goto_html.bind(("127.0.0.1", 8081))
goto_html.listen(10)
while True:
conn, addr = goto_html.accept()
msg = conn.recv(65536)
print(conn)
# 以字节读取数据的权限去打开html_pro.html文件
file_html = open("output.html", "rb+")
# 读取文件内容
data = file_html.read()
# 下面这句话必须写,关于http协议的内容,以后说
#conn.sendall(bytes("HTTP/1.1 201 OK\r\n\r\n", "utf-8"))
# 发送读取的内容
conn.sendall(data)
print("成功返回服务器")
conn.close()

def accept_client(self):
self.recv_client, client_addr = self.client_socket.accept()
print(client_addr)
request = self.recv_client.recv(65536).decode('utf-8') # 要保证在我们的接受大小之内,并且解码为字符串
header = request.split("\r\n\r\n")[0]
message = request.split('\r\n\r\n')[1];
print(header) # 消息头

key_header = {}
for single_header in header.split('\r\n'):
key = single_header.split(':')[0]
value = single_header.split(':')[1]
if value == None:
continue
# 不能因为没有值就停下。
key_header[key] = value # 形成键值对。
self.Host = key_header['Host']
port = 80;

def connect_server(self):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 60 * 1000, 30 * 1000))
(fam, type, _, _, server_address) = socket.getaddrinfo(self.Host.strip(), 80)[0] # 会得到两个五元组,取第一个代表IPV4
print(server_address) # 解析出来的ip地址和端口
server_socket.connect(server_address)
while True:
msg = "GET / HTTP/1.1\r\nhost:{}\r\nConnection: close\r\n\r\n".format(
self.Host.strip()) # 发送构造好的信息,这里用request比较好。
server_socket.send(msg.encode('utf-8'))
recv_msg, address = server_socket.recvfrom(4096)
try:
print(recv_msg.decode('utf-8'))
except Exception as e:
pass

# _thread.start_new_thread(self.accept_client)
while input() == 'b':
self.change_coming_data(recv_msg)
#self.recv_client.sendall(recv_msg)
#print("已返回服务器")
#self.recv_client.close()
while input() == 's':
self.back_to_client()


def run(self):
while True:
self.accept_client()
while input() == 'a':
self.connect_server()
# while input() == 'b':
# self.back_to_client()
1
2
3
4
5
6
7
from proxy import Proxy
def main():
instance = Proxy();
instance.run();

if __name__ == "__main__":
main();