博文

目前显示的是标签为“开发”的博文

KV-woker 纯练手项目 保护 _ 开头的 Key VS code 重构 JS 代码 提取代码为函数

图片
KV-woker 项目准备实现的功能列表见此: https://zelikk.blogspot.com/2024/12/kv-woker-1.html 今天实现: 保护 _ 开头的 KV对. 因为我们的目标是把配置项都放到 KV 中保存. 按目前的设计, 需要把理更多的配置项的 KV 放到 protect_keylist 中. 如果未来系统有配置项的扩充, 那么就要记得在 protect_keylist 中添加, 这是不优雅的.  我们可以约定, 配置项在 KV 中都以 _ 开头保存. 这一点和自动生成短链的方法也不冲突, 自动生成短链的字符中不含有 _ 符号. 本项目目前保护两个KV, _admin_pwd_ 和 _user_pwd_ , 不允许用户 修改, 删除, 查询. 目前的实现, 是设置了一个数组 protect_keylist 在业务逻辑中, 使用判断数组中是否有元素的方式 List.includes(key) , 来判断是否是属于需要保护的key. if (protect_keylist.includes(req_key)) 这一功能的效果就是: https://newkvdb.crazypeace.workers.dev/_user_pwd_ 显示404 https://newkvdb.crazypeace.workers.dev/_admin_pwd_  显示404 而且在  https://newkvdb.crazypeace.workers.dev/kvdbkvdb LoadKV, 是查询不到 _admin_pwd_ 和 _user_pwd_ 的 value 的 第 1 步 先将 if (protect_keylist.includes(req_key)) 这个判断重构为一个函数 鼠标拖选 "protect_keylist.includes(req_key)" , 右键, "Refactor...", "Extract to function in global scope",  输入新函数的名字, "checkProtectKey" 回车Enter确认 你会发现, 之前选中的文字被替换为了一个函数调用 而文件的末尾, 新增了一个函数, 函数内容就是你之前选中的语句...

KV-woker 纯练手项目 2个密码 对应不同的权限

图片
KV-woker 项目准备实现的功能列表见此: https://zelikk.blogspot.com/2024/12/kv-woker-1.html 今天实现: 2个权限和对应的密码. 管理员权限 和 用户权限 第 1 步 用 _admin_pwd_ 和 _user_pwd_ 实现原来 password 的控制访问的功能 在 KV 中, 添加记录 Key: _user_pwd_   Value:  (我随便定的示例) kvdbkvdb Key: _admin_pwd_ Value:  (我随便定的示例) kvdbadmin 原项目 Url-Shorten-Worker 中, 是在 KV 库中保存 password 来 控制访问权限的. 代码中, 在这里从KV库中获取  password 对应的 value, 作为校验密码. 后续的逻辑, 都是使用这个变量 password_value 与JSON中的password字段比较, 或者是与浏览器访问的path比较. 我们这么修改,  代码的最开头, 增加一个数组 const user_key_list = [   " _admin_pwd_ ",   " _user_pwd_ " ] 在代码原来从 KV库 查询 password 的地方, 改为 将每个 user_key_list 的成员, 从KV库查询, 并将结果保存到 user_password_value_list const user_password_value_list = await Promise.all(   user_key_list.map(async key => await KVDB.get(key) || null) ); * JS的语法是比较奇怪, 我们拿人类语言去问 GPT 就好了. 在校验权限的地方, 原来是判断 password_value 是否等于 XXXX.  改为 判断 user_password_value_list 是否包含 XXXX 测试 https://newkvdb.crazypeace.workers.dev/ kvdbkvdb https://newkvdb.crazypeace.w...

KV-woker 纯练手项目

图片
书接上文 当初我在 KV 中设置一个 password 的思路是, 我希望把 KV 看作是一个存储库, 那么使用权限密码也是保存的数据之一. 我知道目前有很多worker的项目, 是直接在 Variables and Secrets 变量和机密 中直接设置使用密码, 来控制不公开使用.  但我的思路不一样. 打个比方, 为了修改VPS的root密码,  一个是, 必须登录VPS厂商的后台管理面板中修改;  一个是, root登录成功后, 在命令行就可以修改.  我的思路是后者. 我准备在原短链项目上做一些增强开发. 进一步把当初的设想做完整. 也算是一个练习. 我能预期到, 这样的实现可能不实用. 因为每次访问worker, 都要从KV中读取一下password. 简单地说, 本来每天能转换100次短链, 这一下子只能转换50个了. (当然了, 本身KV的读取操作是每天10万次, 个人使用打个半折也足够用, 哈哈) ======== 我准备实现的功能包括: 2个权限和对应的密码. 管理员权限 和 用户权限 把worker.js 里的配置项都在 KV 中保存 为了不和原项目冲突, 以免直接使用原项目的一些用户被影响, 新开一个项目, 名称也更通用.  KV-woker 因为项目本身的定位更通用, 所以: 绑定 Bindings 用 KVDB 指向 KV 库 KV 库中设2个密码 _admin_pwd_ _user_pwd_ _user_pwd_ 用于控制能否访问管理页面, 增删改 KV 对. 相当于是普通用户. _admin_pwd_ 除了 _user_pwd_ 的权限以外, 还能增删改 _ 开头的 KV 对. 相当于是管理员. ======== 今天实现: 新建 github 项目 绑定 Bindings -  KVDB 用原来的 Url-Shorten-Worker 项目代码, 新建一个 Github 项目 KV-woker 在项目里搜索 Url-Shorten-Worker, 替换为 KV-woker * 如果你想跟随本教程实践, 记得搜索 crazypeace 替换为你自己的 Github 用户名. 搭一个 pastebin 系统. 测试 https:/...

白嫖worker 自建短链服务 Url-Shorten-Worker worker.js配置项增加 password

图片
配置项增加 password 不需要在KV中添加password条目 const config = {   password: " testpwd ", // 管理面板使用密码 // if password != null, then use this config; otherwise, read password from KV.   result_page: false, // 是否用特定的result页面来显示value // After get the value from KV, if use a page to show the result.   theme: "", // 管理面板的主题 // Homepage theme, use the empty value for default theme. To use urlcool theme, please fill with "theme/urlcool" .   cors: true, // 是否允许CORS使用API // Allow Cross-origin resource sharing for API requests.   unique_link: false, // 一个长链是否只有唯一的短链(会增加写入的使用量) // If it is true, the same long url will be shorten into the same short url   custom_link: true, // 允许自定义短链 // Allow users to customize the short url.   overwrite_kv: false, // 允许覆盖已存在的key // Allow user to overwrite an existed key.   snapchat_mode: false, // 短链只能访问一次(访问后就删除了) // The link will be distroyed after access.   visit_count: false, // 使用记数(会大大增加写入的使用量, 多人共用不推荐打开) // Count visit times....

极简一键脚本是为了有一个容易学习和阅读的基材 方便大家实现自己需要的一键脚本 我会做什么 我不会做什么

图片
这两天有网友主动和我提起保姆型的大而全的菜单脚本的需求. 我突然觉得正好借此机会表达一下 我会做什么, 我不会做什么. ======== 1) 我自己想要做的.  我会做得非常详细.  教程尽量每一步都图文并茂, 而且会根据反馈不断优化, 如果环境发生了变化, 只要我知道了, 我就会更新教程. 比如, 我的搭节点的教程, 从买VPS到最终能使用. 我的目标是, 爷爷奶奶都能学会, 只要会使用键盘鼠标, 能认得键盘按键上的字母和符号.  我甚至想过, 把 链接的字体 设置成不会混淆的. 这样, 把教程打印成纸质的, 使用者也能 一个一个字符的敲到浏览器地址栏里, 也能完成节点搭建. 比如, racknerd 搭 v2ray 节点 2) 我自己遇到的问题.  如果网上现有的搜索结果不行, 或者不够完整, 或者需要多个信息(知识点)结合起来解决问题, 我会记录. 我希望自己遇到过的问题, 下次不用再寻找一次答案, 而是直接使用自己总结的经验. 对于网上现有的搜索结果, 我希望自己的总结能作为补充, 帮助遇到同样问题的其它人. 有时候, 网上的搜索结果, 能解决100个人中98个人的通用问题, 但是2个人会遇到像我一样的特殊情况, 那么我的总结就有价值. 比如, 编译 Xray 遇到 gvisor 报错 3) 其它网友遇到的问题.  在论坛或telegram群组里, 有时会遇到网友提出在我比较熟悉的领域内的问题. 如果网上的搜索结果不够准确或不够完善, 这个问题和我自己的博客内容不重复或者是正交的补充, 我会记录. 比如,  yt-dlp 下载时有年龄限制 4) 我的项目.  我自己的爱好和审美是 够用就好, 简洁, 正交.  比如, 我 用 v2ray 搭建 wss 协议节点 , 用 xray 搭建 reality 协议节点 , 用 hy2 搭建 hy2 协议节点 . 而不是用一个内核支持多个协议. 我对于自己的搭节点一键脚本还有一个定位, 就是要足够简单, 容易阅读. 这样可以作为一个良好的基材, 大家可以在此基础上做出满足自己需求的脚本. 我的脚本里面没有函数, 就是从头到尾执行.  唯一会在阅读代码时需要前后跳转的原因 就是, 有一些变量 是贯穿始终的. 这个无法避免. 满足了我...

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解码 的设定值 能...

v2rayN-3.29-VLESS 菜单项中文资源修改 .net 4.8项目多语言资源

图片
最方便在VS中的操作如下: 打开窗口设计器 选中窗口, 在属性表中 找到 Language, 下拉菜单中选择 语言. 对于 v2rayN 3.29 项目来说, 选择 "中文(简体)" 然后再找到菜单项进行修改, 改的就是中文资源属性了. 实际上中文(简体)资源 是保存在 .zh-Hans.resx 文件中. 你把这个文件用纯文本的方式打开就能看到. 从另一方面来说, 如果我选中窗口后的 Language 属性不是调整为 中文(简体), 那么会是不同的后缀的资源文件. 比如, 如果我选择的是 中文(简体, 中国)  那么资源文件后缀是 .zh-CN.resx 进一步的, 在不同的资源文件中, 是可以定义界面元素有不同的尺寸和位置的. 原因是, 不同的语言的文字, 写出来的长度是不一样的, 有可能需要不同大小的界面元素.  而且, 有些语言是从右往左写的. 那么, 你原本设计的界面元素的左右关系有可能暗示了先后或主次的顺序. 在这样的语言下, 界面元素的位置也应该重新安排.

v2rayN-3.29-VLESS 按键UTDB连续移动节点顺序

图片
原来的v2rayN用按键来移动节点顺序, 每次只能移一下. 比如, U键是用于上移一格. 按U键后, 节点列表项会失去焦点, 于是你再按U键就无效了. 修改内容如下: 在 主窗口 MainForm 的 MoveServer 函数中,  让真正干活的 (AppConfigHandler 模块中 MoveServer 函数) 返回 (移动后的节点项 在序列中的位置) 然后再让这个列表项 .Selected = true 被选中. 当然 AppConfigHandler 模块中 MoveServer 函数 内部实现也有一些小修改. 在函数的最后, 向调用者返回这个index. 修改记录 https://github.com/crazypeace/v2rayN-3.29-VLESS/commit/acc87e1 主程序补丁文件 https://github.com/crazypeace/v2rayN-3.29-VLESS/releases/download/v3.29.0.12/v2rayN-VLESS-v3.29.0.12-UDTB.zip

v2rayN-3.29-VLESS 生成配置文件 Xray链式代理 多http代理inbound 多落地节点outbound 一对一 隧道节点方便切换

图片
之前 做了一个Xray 加载多个 链式代理 配置文件 多inbound 多outbound 一对一方案 , 要一个一个导出客户端配置文件, 还要修改 inbound 和 outbound 的 tag. 最终把多个配置文件放在同一个目录, 启动xray内核, 会合并所有配置文件的 inbound 和 outbound, 以及路由规则, 这样保证 inbound 和 outbound 一一对应. 整个过程还是有点麻烦的. 最近给 v2rayN-VLESS 开发 HY2 支持, 在处理  Reality 协议与 Hysteria2 协议节点并存 时, 走读代码的逻辑. 发现 如果多选了节点, 再用测速功能, 会先生成配置数据. 这个配置数据包含以下内容: 1. 在生成配置的时候, 会生成多个 http 代理的inbound. 2. 将你选择的那些节点也生成 outbound. 3. 生成很多个 路由规则  把这些http代理的inbound和要测试的节点的outbound 一一对应起来. 然后启动一个内核, 加载这个配置, 也就是包括了 上述这些 inbound, outbound, 路由规则. 然后再用这些inbound的http代理, 一个一个去访问测试URL, 也就一一测试了 outbound表示的节点. 那么我多想一步, 如果我们把这个配置数据用json文件保存出来. 自己另外用个裸内核加载跑起来, 不就是我们之前想达到的功能吗? 而且本来设置的下一跳socks5设置也保存, 方便你将一批落地节点套上隧道 加速. 在 GenerateClientSpeedtestConfigString 函数, 把生成的配置文本保存出来就行了. 那么, 实现原来这篇文  一个Xray 加载多个 链式代理 配置文件 多inbound 多outbound 一对一方案  的目的, 工作流程更新为: 在v2rayN (1)中添加隧道节点 在v2rayN (2)中添加全部落地节点 在v2rayN (2)中设置下一跳Socks5 为 v2rayN (1) 的监听Socks端口 在v2rayN (2)中 全选节点, Ctrl + R 测试真连接延迟. 此时, 会生成 testconfig.json 配置文件 在v2rayN (2)目录中, 命令...

v2rayN-3.29-VLESS 支持 Reality 协议与 Hysteria2 协议节点并存

图片
需求 v2ranN-VLESS 支持了 reality, 基于 xray 内核 v2ranN-HY2 支持了 hy2, 基于 v2ray 内核 reality和hy2都好用, 都需要.  我是在VPS上同时部署了多个协议的(只要用不同的端口, 不冲突就可以了).  在客户端, 我可不想为了换个协议用用, 就要关个软件再开个软件. 那么, 就要在 v2rayn.exe 的目录下同时放 xray.exe 和 v2ray.exe 然后要根据不同的协议来调用不同的内核. 分析 我们先来看看目前的代码逻辑是怎样的. 根据 之前的开发经验 , 我们知道, 启动内核是在 V2rayHandler 模块的 V2rayStart 函数 里的 p.Start () 倒着走读代码, 发现 V2rayFindexe 函数是用来判断启动哪个内核程序的. 逻辑是, 在 lstV2ray 这个列表中取字符串出来, 再拼上 .exe 的后缀, 然后看当前目录有没有这样的文件存在. 而这个 lstV2ray 列表呢. 存着这些. 也就是说, v2rayN 3.29 的原始逻辑是, 当前目录下, 这3个内核的文件, 找到哪个就启动哪个. 那么, 我们要做的是: 建一个"全局"变量, 用于保存 指定的内核程序名称. 在启动内核之前, 要先根据使用的协议来判断是否需要指定内核程序名称. 实践 添加 模板内"全局"的变量 "设为活动服务器" 的功能, 最后启动内核之前, 加个判断内核的函数调用 测速功能. 最后启动内核之前, 加个判断内核的函数调用. 把v2rayN软件设置里面的 outbound 也就是节点信息传进去. 而这个新增的 SetCoreExeByConfig 函数的实现呢. 就是根据节点信息里的特定属性, 判断是否reality协议, 是否hy2协议. 最后一个修改, 在查找内核程序的函数 V2rayFindexe 中, 原来的逻辑是遍历 { "xray", "wv2ray", "v2ray"} 这个列表. 现在修改为, 先构造一个列表. 规则是: 如果指定了内核, 那么列表中只有这个内核程序. 如果没有指定内核, 那么列表和原来的逻辑保持一致, 就是 { "xra...

The Hot3 in Last 30 Days

RackNerd VPS搭Hysteria2 HY2梯子 年付 $10.98 1G端口 3T流量 17G存储 1GB内存