charles抓包flutter

一,准备工作

在我的另一篇文章flutter Dio发送post请求-CSDN博客里面,直接复用一部分代码

该方法无需让手机安装charles的ca证书(当然安装了也没事儿),也无需设置手机wifi的网络代理(因为ca证书的内容和网络代理都写进dart代码中了)

注:需要先打开charles作为代理,手机和电脑在同一局域网中(或者电脑or手机一个开热点给另一个连上)

二,coding

Dart 复制代码
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:dio/adapter.dart';

final Dio dio = Dio();

class AcceptCA extends HttpOverrides {
  // 信任证书
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    SecurityContext securityContext = SecurityContext(withTrustedRoots: true);
    // ca证书的内容
    var caContent = Uint8List.fromList(utf8.encode('''-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIGAZIDF60vMA0GCSqGSIb3DQEBCwUAMIGZMSowKAYDVQQDDCFDaGFybGVz
IFByb3h5IENBICgxOCBTZXAgMjAyNCwgTCkxJTAjBgNVBAsMHGh0dHBzOi8vY2hhcmxlc3Byb3h5
LmNvbS9zc2wxETAPBgNVBAoMCFhLNzIgTHRkMREwDwYDVQQHDAhBdWNrbGFuZDERMA8GA1UECAwI
QXVja2xhbmQxCzAJBgNVBAYTAk5aMB4XDTI0MDkxNzAzMDUzNloXDTI1MDkxNzAzMDUzNlowgZkx
KjAoBgNVBAMMIUNoYXJsZXMgUHJveHkgQ0EgKDE4IFNlcCAyMDI0LCBMKTElMCMGA1UECwwcaHR0
cHM6Ly9jaGFybGVzcHJveHkuY29tL3NzbDERMA8GA1UECgwIWEs3MiBMdGQxETAPBgNVBAcMCEF1
Y2tsYW5kMREwDwYDVQQIDAhBdWNrbGFuZDELMAkGA1UEBhMCTlowggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQC7B4T2grKCDC0SH/W9v+lbZMYL9R4d34Xhe/g4l+MC38GYfq4oonIprMbb
wNpeSvlrriDeImp1/lGJsj3kkY3tcySki5IeNzpEEvBrsssExiecGKQNE2jg3sdNPChacL+rpuUy
pKs20Ciu/Xoz5ut4PxD2/D43Jfm/cBf25wZN97539EV7NjZl1lLTZL0u9YoVkBbJmY5WFQpvHVv2
r+SqVJjhio2gABkQITwbjBOmIWBggy1P8Fsv4KzbLxaO2hl8hFiehiJgNtLnEzgAU8Cby8CtEuFx
Xl2nkWCFK0RG30BLiLCsoeJyPJCOi4HQjM7EQhgsDr+aZ5aSZQ7tJd61AgMBAAGjggF0MIIBcDAP
BgNVHRMBAf8EBTADAQH/MIIBLAYJYIZIAYb4QgENBIIBHROCARlUaGlzIFJvb3QgY2VydGlmaWNh
dGUgd2FzIGdlbmVyYXRlZCBieSBDaGFybGVzIFByb3h5IGZvciBTU0wgUHJveHlpbmcuIElmIHRo
aXMgY2VydGlmaWNhdGUgaXMgcGFydCBvZiBhIGNlcnRpZmljYXRlIGNoYWluLCB0aGlzIG1lYW5z
IHRoYXQgeW91J3JlIGJyb3dzaW5nIHRocm91Z2ggQ2hhcmxlcyBQcm94eSB3aXRoIFNTTCBQcm94
eWluZyBlbmFibGVkIGZvciB0aGlzIHdlYnNpdGUuIFBsZWFzZSBzZWUgaHR0cDovL2NoYXJsZXNw
cm94eS5jb20vc3NsIGZvciBtb3JlIGluZm9ybWF0aW9uLjAOBgNVHQ8BAf8EBAMCAgQwHQYDVR0O
BBYEFD8hFf1Rncg+7ulyepOQ2uQrb8NcMA0GCSqGSIb3DQEBCwUAA4IBAQBXdrCNt+0gUOGRzIz7
JjyfVOicqcSjDrB3rSDjJC++BEQgBMNeeC/N8UxmVPar9lKN9aONoT3ylsSXG9vv2iuL2bJosz9y
Wf4VREg37JFFMRc87/MzvihTjvHHGC7KR4KcI3rE+d6S3Llq+LkakCdQZ343HTUi9NcNyF7sddl5
hh0Hf/00VJ63CZ1wHh5lW0XoRtnjpZScIVOKXvWmC405lCliWFhN4kC0M2+cXcT5Sy2FA22xE8ui
gUCIQZa/D623B/SYMKdbxT3aZSoFxkCaiGAh4LHmZ5vogm9OTc2hOzDssUbrTxyLFBwzXKQlHBTQ
bDi7/SxEYgwQ2XVEDBm/
-----END CERTIFICATE-----'''));
    securityContext.setTrustedCertificatesBytes(caContent);
    return super.createHttpClient(securityContext);
  }
}

main() {
  runApp(const MaterialApp(
    home: H(),
  ));
}

class H extends StatefulWidget {
  const H({super.key});

  @override
  State<H> createState() => _HState();
}

class _HState extends State<H> {
  String _resStr = "";

  @override
  void initState() {
    super.initState();
    HttpOverrides.global = AcceptCA();
    // 设置网络代理
    (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (HttpClient client) {
      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
      client.findProxy = (uri) => 'PROXY 192.168.111.111:8888';
    };
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text("抓包测试"),
        ),
        body: Center(
          child: Text(
            _resStr,
            style: const TextStyle(fontSize: 30),
          ),
        ),
        floatingActionButton:
            FloatingActionButton(onPressed: _postRequestFunction));
  }

  void _postRequestFunction() async {
    FormData formData = FormData.fromMap({"sourceText": "Who are you?"});
    String url = "https://api.oioweb.cn/api/txt/QQFanyi";
    Response response = await dio.post(url, data: formData);
    setState(() {
      _resStr =
          json.decode(response.toString())["result"]["targetText"].toString();
    });
  }
}
相关推荐
江上清风山间明月3 小时前
一周掌握Flutter开发--9. 与原生交互(下)
flutter·交互·原生·methodchannel
GeniuswongAir3 小时前
Flutter极速接入IM聊天功能并支持鸿蒙
flutter·华为·harmonyos
sayen4 小时前
记录 flutter 文本内容展示过长优化
前端·flutter
勤劳打代码4 小时前
剑拔弩张——焦点竞争引的发输入失效
flutter·客户端·设计
北京_宏哥7 小时前
🔥《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(15)-Charles如何配置反向代理
前端·面试·charles
张风捷特烈8 小时前
Flutter 伪 3D 绘制#02 | 地平面与透视
android·flutter
关山月8 小时前
Flutter 图像上传与裁剪
flutter
陈朝晖SHS9 小时前
Flutter求助贴
flutter
恋猫de小郭9 小时前
Flutter Roadmap 2025 发布,快来看看有什么更新吧
android·前端·flutter
陈皮话梅糖@14 小时前
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
开发语言·javascript·flutter