v2rayN-VLESS 订阅增加 是否Base64解码 选项 .net 4.8 WebClient下载中文乱码
虽然v2rayN提供了导出base64编码后的订阅内容的功能.
但是不方便管理订阅内容, 特别增减个别节点的这种微调.
所以我们自己弄订阅方式干脆就纯文本保存, 不要搞Base64编解码了.
说干就干.
先在添加订阅的地方加个 "是否Base64解码" 的checkbox
订阅的数据结构要加个字段 来保存这个设置项.
订阅管理的窗口 SubSettingForm , 打开窗口设计器, 双击保存按钮, 再一路走读代码.
发现没对订阅项中的字段做什么处理, 直接就把订阅项的数据结构序列化为json文本保存到 v2rayN配置文件中去了.
那么就是说, 当 订阅管理的窗口 SubSettingForm 关闭的时候, v2rayN配置数据结构 中 订阅项 的数据已经被更新了.
插一句, 传统的窗口设计是, 在窗口 确认关闭之前, 窗口元素上的所有数据和变化都只停留在窗口上, 就像是一张草稿纸. 如果窗口取消了,那么程序本身的数据一点都不会改变. 如果窗口确认了, 才会用窗口元素的数据来改变程序.
找了一个订阅项的界面元素 chkEnabled.
在代码里全项目 Ctrl+Shift+F 搜一下. 找到这个结果.
可以看到, 当备注文本框的焦点离开时, 会把 界面上的订阅项数据 保存到程序的配置数据中.
继续想一想, 订阅项的界面元素并不是只有备注文本框啊. 而且, 话说回来, 备注文本框算是最不重要的数据了吧.
继续全项目搜索这个 txtRemarks_Leave 函数.
发现在 订阅url文本框 的离开焦点事件注册了这个函数, 在 是否启用订阅项的那个框框checkbox 的离开焦点事件 也注册了这个函数.
那么我们的修改就很明白了, 把 是否Base64解码checkbox 的焦点离开事件也注册这个函数就行了.
(当然了, 我以前加的 AllowInsecure 焦点离开事件也要注册这个函数. 算是以前没做到位的, 现在来擦屁股了)
窗口设计器, 选中界面元素 Base64解码checkbox, 属性窗口 - 事件 - 焦点 - Leave,
下拉列表中 选择 txtRemarks_Leave 注册.
前面这么一大段大费周章, 是为了把这个 是否Base64解码 的设定值 能保存到配置文件, 程序启动时能正确读取.
接下来, 我们就要在更新订阅的流程中, 把这个控制项应用进去.
从主窗口的菜单项中, 双击 更新订阅 菜单项. 一路走读代码.
看到有获取 订阅项的地址的地方, 那么我们把 Base64解码 的处理也照样补上.
再往下走没几步, 还是在 UpdateSubscriptionProcess 函数中. 就有对获取的订阅数据进行base64解码的处理了.
我们的修改就是加一个控制项的判断.
========
完
提交Github
修改记录
========
后记
最后这一步修改, 从代码的可读性上还可以优化.
我们来看这个代码的结构, 是
if (控制量){一大段}else{一句话}
如果这一大段特别特别长, 在未来维护的时候, 走读代码, 很有可能读着读着就忘了.
所以可以优化为更易于阅读的代码:
if ( 非 控制量){一句话}else{一大段}
以上我说的都算是比较通用的代码优化规则.
具体这个案例, 我们可以看到, 控制量的两个分支 都是对 result 这个字符串的不同的处理.
特别的, 其中一个分支只有一句代码.
所以我们可以写成这样:
========一句话if (控制量){一大段}
自己玩订阅, 要注意你的订阅地址不要容易被别人扫到.
一般来说, 长的随机的url是比较容易做到的.
文本暂存可以用这个项目.
演示站
========
更新
当订阅中有中文的时候, 更新下来成了乱码.
问了一圈GPT, Claude给我答案.
在 WebClient 初始化时, 设置编码格式.
修改记录
C#也会用么,厉害的。我最近也在看这个项目!
回复删除我玩代码都是半吊子. 语法都是抄旁边的, 或者问 google + gpt
删除