吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1041|回复: 14
收起左侧

[其他原创] 分享一个Json定位的fiddler插件源码

[复制链接]
sgbyg 发表于 2024-8-16 21:16
本帖最后由 sgbyg 于 2024-8-17 08:51 编辑

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using Fiddler;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

[assembly: RequiredVersion("5.0.20211.51073")]

public class JsonPathClickLogger : IAutoTamper
{
    private TabPage tabPage;
    private RichTextBox richTextBox;
    private Dictionary<int, string> positionToPathMap = new Dictionary<int, string>();

    public void AutoTamperRequestAfter(Session oSession) { }
    public void AutoTamperRequestBefore(Session oSession) { }
    public void AutoTamperResponseAfter(Session oSession) { }
    public void AutoTamperResponseBefore(Session oSession) { }
    public void OnBeforeUnload() { }
    public void OnBeforeReturningError(Session oSession) { }

    public void OnLoad()
    {
        tabPage = new TabPage("生成");
        richTextBox = new RichTextBox();
        richTextBox.Dock = DockStyle.Fill;
        richTextBox.Font = new Font("Consolas", 10);
        richTextBox.ReadOnly = true;
        richTextBox.MouseClick += new MouseEventHandler(RichTextBox_MouseClick);

        tabPage.Controls.Add(richTextBox);
        FiddlerApplication.UI.tabsViews.TabPages.Add(tabPage);

        FiddlerApplication.AfterSessionComplete += delegate(Session session)
        {
            if (session.oResponse.MIMEType.Contains("application/json"))
            {
                string json = session.GetResponseBodyAsString();
                if (IsJson(json))
                {
                    string prettyJson = PrettyPrintJson(json);
                    FiddlerApplication.UI.Invoke((MethodInvoker)delegate
                    {
                        richTextBox.Text = prettyJson;
                        MapJsonPositions(prettyJson);
                    });
                }
            }
        };
    }

    private void RichTextBox_MouseClick(object sender, MouseEventArgs e) 
        {
        int index = newTxt.GetCharIndexFromPosition(e.Location);
        string jsonPath;
        if (positionToPathMap.TryGetValue(index, out jsonPath)) 
                {
                        FiddlerApplication.UI.Text = jsonPath + " ---> 已复制到剪贴板";
                        Clipboard.SetText(jsonPath);
        } 
                else 
                {
            FiddlerApplication.UI.Text = "请点击在Json的key上";
        }
    }

    private bool IsJson(string input)
    {
        input = input.Trim();
        return (input.StartsWith("{") && input.EndsWith("}")) || (input.StartsWith("[") && input.EndsWith("]"));
    }

    private string PrettyPrintJson(string json)
    {
        try
        {
            JObject obj = JObject.Parse(json);
            JsonSerializer serializer = new JsonSerializer();
            serializer.Formatting = Formatting.Indented;
            StringWriter sw = new StringWriter();
            using (JsonTextWriter writer = new JsonTextWriter(sw))
            {
                writer.Formatting = Formatting.Indented;
                writer.Indentation = 4;
                writer.IndentChar = ' ';
                serializer.Serialize(writer, obj);
            }
            return sw.ToString();
        }
        catch (JsonException)
        {
            return json;
        }
    }

    private void MapJsonPositions(string json)
    {
        positionToPathMap.Clear();
        JObject obj = JObject.Parse(json);
        FillPositionMap(obj, "", json);
    }

    private void FillPositionMap(JToken token, string basePath, string json)
    {
        switch (token.Type)
        {
            case JTokenType.Object:
                foreach (KeyValuePair<string, JToken> property in (JObject)token)
                {
                    string keyPath = basePath + "['" + property.Key + "']";
                    int keyPosition = FindStringPosition(json, "\"" + property.Key + "\"");
                    if (keyPosition != -1)
                    {
                        for (int i = keyPosition; i < keyPosition + property.Key.Length + 2; i++)
                        {
                            positionToPathMap[i] = keyPath;
                        }
                    }
                    FillPositionMap(property.Value, keyPath, json);
                }
                break;
            case JTokenType.Array:
                int index = 0;
                foreach (JToken item in (JArray)token)
                {
                    FillPositionMap(item, basePath + "[" + index + "]", json);
                    index++;
                }
                break;
        }
    }

    private int FindStringPosition(string source, string value)
    {
        return source.IndexOf(value, StringComparison.Ordinal);
    }
}


效果图
QQ20240811-211534.png

看到评论有人看不懂,简单解释下
就是点击某个key之后,在标题栏显示该key所在的位置,并复制到剪贴板
对爬虫来说很有用

免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Lsais + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

三滑稽甲苯 发表于 2024-8-16 22:36
介绍可以详细一点吗,感觉有点模糊不清
xixicoco 发表于 2024-8-16 22:22
wqz89336923 发表于 2024-8-16 22:24
killjd 发表于 2024-8-16 22:57
获取B站所有的json数据?
fanliansuo1 发表于 2024-8-16 23:00
学习,学习
sdieedu 发表于 2024-8-17 07:21
这个我看看,不错啊
TGLG 发表于 2024-8-17 08:45
感谢分享,一起学习进步
Wapj_Wolf 发表于 2024-8-17 08:52
不明觉厉,认真学习中,谢谢楼主分享。
www7541204 发表于 2024-8-17 10:27
大佬可以说的详细点吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表