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:把本地的数据映射到服务器上

  向服务器发送A ,服务器返回B,想要服务器返回C时,就用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)

步骤:

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

 Query参数需要特别说明一下,如果你想保存的文件的内容作用于所有参数,那么我们需要删除query框默认填充的内容,但是如果只想作用于特定的接口,那么可以带上默认的填充内容

  map remote :把客户端的服务映射到另一个服务器上

wiremock-jre8-standalone-2.27.0.jar:  可以实现模拟服务  -- 测试桩 

应用场景:测试微服务与 线上微服务 切换

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

  1. https:使用 https 协议,其它类型 http,ws,wss,socket
  2. www.bilibili.com:主机地址,每个域名有对应 ip  (DNS 进行转换)
  3. /v/douga/:资源地址
  4. ?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)

 

 

 

 

posted @ 2020-08-13 18:00  pretend_smile  阅读(570)  评论(0)    收藏  举报