websockets Vs socket Vs Charles(MAP LOCAL 和 MAP REMOTE) VS mitmproxy
常见代理形式
- HTTP/HTTPS:应用层 (只能从客户端向服务器发起)
- sockets: 不关心是什么协议 ,更万能

- websocket: 双向的,协议
- websockets: 使用了websocket协议的工具
websockets
官网路径:https://pypi.org/project/websockets/
应用场景:微信、QQ (双向通信)
websockets_client.py
#!/usr/bin/env python import asyncio import websockets async def hello(uri): async with websockets.connect(uri) as websocket: name = input("what's your name?") await websocket.send(name) print(f">{name}") greeting = await websocket.recv() print(f"<{greeting}") asyncio.get_event_loop().run_until_complete( hello('ws://localhost:8765'))
websockets_sever.py
#!/usr/bin/env python import asyncio import websockets async def echo(websocket, path): name = await websocket.recv() print(f'<{name}') gretting = f"hello, {name}" await websocket.send(gretting) print(f'>{gretting}') async for message in websocket: await websocket.send(message) asyncio.get_event_loop().run_until_complete(websockets.serve(echo, 'localhost', 8765)) asyncio.get_event_loop().run_forever()
运行如下:
![]()

反向代理
可以将本地端口8766 的请求转发到 本地端口8765 (修改上述代码中标红的位置)
步骤: 1. 开启服务器脚本 2. 配置反向代理(本地请求配置为client的接口、响应配置服务端的接口) 3. 运行client脚本,就可以抓取到数据


socket通讯
socket:底层通讯机制,多层技术的应用

代码参考路径:https://www.runoob.com/python3/python3-socket.html
socket_server.py
import socket import sys # 创建 socket 对象 serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() port = 9999 # 绑定端口号 serversocket.bind((host, port)) # 设置最大连接数,超过后排队 serversocket.listen(5) while True: # 建立客户端连接 clientsocket, addr = serversocket.accept() print("连接地址: %s" % str(addr)) msg = '你好呀' + "\r\n" clientsocket.send(msg.encode('utf-8')) clientsocket.close()
socket_client.py
# -*- coding: utf-8 -*- import socket import sys # 创建 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取本地主机名 host = socket.gethostname() # 设置端口号 port = 9999 # 连接服务,指定主机和端口 s.connect((host, port)) # 接收小于 1024 字节的数据 msg = s.recv(1024) s.close() print (msg.decode('utf-8'))
区别
websocket: 应用层的一个协议
socket:抽象接口 (很难抓包)
socks代理:一种技术
charles
map local:把本地的数据映射到服务器上

map local 实战1:curl命令被Charles MAP local截获 -- 配置的是远端服务器的IP和端口

运行命令:curl https://www.baidu.com -x 127.0.0.1:8888 -k
注释:-x charles 的代理地址,-k :取消认证

map local实战2 -数据加倍演示 (map local:复杂mock)

步骤:
- vi raw.txt
- 写入一个json的请求结果串
- raw=$(cat ./raw.txt)
- echo $raw
- 数据翻倍: raw=$(echo "$raw" | jq '.data.items+=.data.items' | jq '.data.items_size+=.data.items_size')
- 将文件存储到json文件中,备用: echo $raw > ./mock.json
- 在接口上右键,找到map local ,填写刚才生成文件的路径
- 刷新模拟器列表,数据被更新为mock 准备的数据


Query参数需要特别说明一下,如果你想保存的文件的内容作用于所有参数,那么我们需要删除query框默认填充的内容,但是如果只想作用于特定的接口,那么可以带上默认的填充内容
map remote :把客户端的服务映射到另一个服务器上

应用场景:测试微服务与 线上微服务 切换
map remote 实战1:将对百度的请求,转移到对豆瓣的请求

验证方式一:网址: 输入https://www.baidu.com 会跳转到如下页面

验证方式二:curl : curl https://www.baidu.com/ -x 127.0.0.1:8888
map remote 实战2: 使用Charles完成从https://www.baidu.com/?token=123 访问到 https://www.douban.com/,然后返回本地的一个文件 -->> map remote + map local
1. 配置map remote

此时访问网址:https://www.baidu.com/?token=123 或者执行curl:curl https://www.baidu.com/\?token\=123 -x 127.0.0.1:8888 -k

2.再配置map local

访问网址:https://www.baidu.com/?token=123 或者执行curl:curl https://www.baidu.com/\?token\=123 -x 127.0.0.1:8888 -k


URL解析 -- 方便进行remote 和 local的配置
示例: https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1
- https:使用 https 协议,其它类型 http,ws,wss,socket
- www.bilibili.com:主机地址,每个域名有对应 ip (DNS 进行转换)
- /v/douga/:资源地址
- ?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1: ?后面是 请求参数
mitmproxy
mitmproxy简介
mitmproxy : python的一个库,支持写脚本进行代理,可以跨平台,支持Linux系统下运行等
官网:https://docs.mitmproxy.org/stable/overview-installation/
简介:
- mitmproxy 是一个具有SSL / TLS功能的交互式拦截代理,具有用于HTTP / 1,HTTP / 2和WebSockets的控制台界面。
- mitmdump 是mitmproxy的命令行版本,将tcpdump用于HTTP,偏向编写python脚本
- mitmweb 是用于mitmproxy的基于Web的界面。
配置流程:https://www.cnblogs.com/fanpl/articles/13476024.html
mitmproxy

mitmweb
1. 运行命令:mitmweb --listen-host 127.0.0.1 --listen-port 8888



2. 使用curl 命令发送请求:curl https://www.douban.com -x 127.0.0.1:8888

mitmdump
服务端:mitmdump

客户端:curl https://www.baidu.com -x 127.0.0.1:8080

加参数的服务端(支持查看详细信息):mitmdump --flow-detail 3

mitmdump常见用法
录制
1. 运行命令
mitmdump -w tmp (如果发现文件无内容,可以让多监听一会)
![]()
2. 切换代理:

3. 在浏览器上访问网址,访问的记录都会被记录下来
回放
mitmdump -nC tmp
过滤
mitmdump -nr tmp -w tmp2 "~s test"

强大之处: 使用脚本进行扩展

操作步骤:
1. 编写脚本 -- 来自官网
from mitmproxy import http def request(flow: http.HTTPFlow) -> None: if flow.request.pretty_url == "https://www.baidu.com/": flow.response = http.HTTPResponse.make( 200, # (optional) status code b"Hello World", # (optional) content {"Content-Type": "text/html"} # (optional) headers )
2. 运行脚本:mitmdump -s mitmdump_script.py
3. 在浏览器或者curl 访问配置的网址

4. 优化 -- 返回想要的文件 (类似map local)
request修改
from mitmproxy import http def request(flow: http.HTTPFlow) -> None: if flow.request.pretty_url == "https://www.baidu.com/": with open('xueqiu.json',encoding="utf-8") as f: flow.response = http.HTTPResponse.make( 200, f.read(), {"Content-Type": "application/json"} )

实现map response,用于修改返回数据 -- 类似map local
response 修改
import json from mitmproxy import http def request(flow: http.HTTPFlow) -> None: if flow.request.pretty_url == "https://www.baidu.com/": with open('xueqiu.json',encoding="utf-8") as f: flow.response = http.HTTPResponse.make( 200, # (optional) status code # b"Hello World", # (optional) content # {"Content-Type": "text/html"} # (optional) headers f.read(), {"Content-Type": "application/json"} ) def response(flow: http.HTTPFlow): if 'quote.json' in flow.request.pretty_url: data = json.loads(flow.response.content) data['data']['items'][0]['quote']['name'] = 'fanpl' flow.response.text = json.dumps(data)


浙公网安备 33010602011771号