修改V2rayN 加载节点列表后自动去重

需求

白嫖党会到处收集节点订阅, 而这些订阅其实也是到处爬一些免费公开的节点再整合而成, 所以这些订阅里面会有很多重复的节点.

每次都要右键菜单点 "移除重复的服务器", 重复操作浪费时间.

https://github.com/2dust/v2rayN/issues/4272


思路

找到"移除重复的服务器"实际上运行的函数. (a)

找到 切换订阅分组 时运行的函数. (b)

在 (b) 函数的逻辑执行完后, 调用一下 (a) 函数, 就达到要修改的效果了.


具体实践

安装 Microsoft Visual Studio

在 Microsoft Store 里有

https://apps.microsoft.com/store/detail/XPDCFJDKLZJLP8

安装组件选 .NET 桌面开发


下载源码

https://github.com/2dust/v2rayN


解压, 进入 v2ray-master 目录, 进入 v2rayN 目录, 打开 .sln 文件.

寻找"移除重复的服务器"实际上运行的函数

Ctrl+Shift+F 在项目中搜索这个功能的菜单文字 "移除重复的服务器"

找到这个资源文件

Ctrl+Shift+F 在项目中搜索这个资源的ID menuRemoveDuplicateServer 找到这样一个绑定关系

继续全项目搜索 RemoveDuplicateServerCmd 得到这个结果

于是我们知道了, 点击 "移除重复的服务器" 菜单项时, 实际上执行的是这个函数 RemoveDuplicateServer()

Ctrl + F12 转到实现.

添加一个简单的弹窗代码, 验证我们没找错函数.

MessageBox.Show("节点去重");

保存, 编译, 开始调试(或执行). 

用菜单也可以, 用快捷键也可以, 用快捷按钮也可以.

点击右键菜单后, 会看到弹窗.


寻找 切换订阅分组 时运行的函数

这个功能入口不好找, 因为界面上本来没有那些分组订阅的按钮, 找不到点击时调用的函数.

我想了一下, 先找到会显示这些分组订阅按钮的界面元素. 参考前面一篇 调整分组订阅按钮区域高度的教程

打开主窗口的设计文件

打开 文档大纲, 找到显示订阅/分组这一排的控件.

可以通过 开关 右边的 "眼睛" 图标来判断这是哪个界面元素.


既然确定了 添加的按钮 和 调整栏目宽度的按钮, 那么前面的 lstGroup 应该就是显示分组订阅按钮的控件了. 以我粗浅的编程基础, 应该是作为容器, 在里面再添加一些分组订阅对应的按钮.

全项目搜索 lstGroup

通过一些英文单词的意思, 再加一些编程的感觉. 我觉得应该继续搜索 SelectedSub

全项目搜索 SelectedSub

继续猜, 我觉得 SubSelectedChanged 就是当分组订阅改变时调用的函数了. 换句话说, 就是当你点击了一个新的分组订阅按钮时调用的函数.

Ctrl + F12 转到实现.

猜了一下, 我觉得 RefreshServers 函数把数据都准备好了, 所以 节点去重应该添加在它之后.

还记得前面我们找到的, 节点去重的函数吗? RemoveDuplicateServer()

C# 语言的语法是一行语句的末尾以分号 ; 结尾

你看插入位置上面那一行, 调用 RefreshServers 函数是怎么写的? 我们照猫画虎就是了.

所以添加

RemoveDuplicateServer();

连续两个斜杠 // 开头是注释的语法, 不产生实际运行的作用. 在代码中添加适当的注释可以帮助其它人以及很多天以后的你自己理解代码的意图.

修改后的样子:


编译, 执行. 检查效果. 

发现, 点击 "所有" 以后, 调用 节点去重 功能, 然后再回到单独的分组订阅里面, 有节点被去掉了.

举个例子,
如果 订阅A里面有节点 1 2 3 4 5, 订阅B里面有节点3 4 5 6 7. 那么全部里面是1 2 3 4 5 3 4 5 6 7, 再去重.
再去看订阅A和订阅B里面就会有节点被去掉了, 比如, 订阅B里面节点 3 4 5 没有了, 只剩节点 6 7 了.

说具体一点, 本来订阅节点是这样的, 订阅A里面有节点 1 2 3 4 5, 订阅B里面有节点3 4 5 6 7. 

那么点击 "所有" 之后, 我们会得到 1 2 3 4 5 3 4 5 6 7 . 再去重就会得到这样:

然后再去分别查看 订阅A 和 订阅B, 就成了这样:

这个问题怎么解决呢? 就要新开一篇教程了.


========

后记

大家不要觉得哎呀这么一大篇教程, 结果还没有完全解决问题. 

实际上本文里面讲了一些方法, 用于分析一个别人已经开发好的"轮子". 

有的时候你只是想把程序的逻辑流程进行一些小调整, 或者你有一些很小的个性化需求, 要求作者为之修改或合并进主分支不一定合适. 因为可能其它大多数人并不希望这样. 

有的时候是因为作者现实世界中的工作很忙, 也有可能精力放在了主分支的大功能上, 等等.

开源的世界, 每个人都是自由的. 不要把代码想像得太神秘, 其实很多时候就像修改一篇文章, 把第五段挪到第二段后面, 而已.


我写这些教程写得很详细, 也配上很多截图, 就是希望心中有一点冲动的朋友, 可以真的实际行动起来, 自己动手修改, 得到自己的成果.

慢慢地, 可以从开源世界里的使用者变成创作者.

评论

The Hot3 in Last 30 Days

无服务器 自建短链服务 Url-Shorten-Worker 完整的部署教程

ClouDNS .asia免费域名 托管到CloudFlare开CDN白嫖Websocket WS通道翻墙 / desec.io