v2rayN-3.29-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