Chr_小屋 - false
type: channel
link: https://blog.chrxw.com/tag/false/
items: 使用C#源生成器自动完成服务注册
items: 【油猴脚本教程】P1 开发者工具的使用 & JavaScript 基础教程
items: 【过期】京东炸年兽自动脚本【1.8】
items: Steam Wishlist Helper 配置文件说明
items: 【过期】双十一京东任务自动脚本【0.6】
items: DirectoryLister 3.5.0 使用教程

使用C#源生成器自动完成服务注册
type: item
date: 2024-01-24T11:28:19+08:00
description: 前言 完整项目地址: https://github.com/chr233/XinjingdailyBot 因为项目之前是使用运行时反射来完成服务的动态注册，而源生成器是在编译前完成代码生成并参与编译，完全没有运行时的性能开销 运行时反射 - 旧的方案 标记特性 首先创建一个 Attribute, 用来标注需要扫描的服务类 namespace XinjingdailyBot.Infrastructure.Attribute; /// /// 标记服务 /// 1、如果服务是本身 直接在类上使用[AppService] /// 2、如果服务是接口 在类上使用 [AppService(ServiceType = typeof(实现接口))] /// [AttributeUsage(AttributeTargets.Class, Inherited = false)] public sealed class AppServiceAttribute : System.Attribute { /// /// 服务声明周期 /// 不给默认值的话注册的是AddSingleton /// public LifeTime ServiceLifetime { get; set; } = LifeTime.Scoped; /// /// 指定服务类型 /// public Type? ServiceType { get; set; } /// /// 是否可以从第一个接口获取服务类型 /// public bool InterfaceServiceType { get; set; } /// /// 标记服务 /// /// public AppServiceAttribute(LifeTime serviceLifetime) { ServiceLifetime = serviceLifetime; } /// /// 标记服务 /// /// /// public AppServiceAttribute(Type? serviceType, LifeTime serviceLifetime) { ServiceLifetime = serviceLifetime; ServiceType = serviceType; } /// /// 标记服务 /// /// /// /// public AppServiceAttribute(Type? serviceType, LifeTime serviceLifetime, bool interfaceServiceType) { ServiceLifetime = serviceLifetime; ServiceType = serviceType; InterfaceServiceType = interfaceServiceType; } } /// /// 生命周期 /// public enum LifeTime { /// /// 瞬时 /// Transient, /// /// 范围 /// Scoped, /// /// 单例 /// Singleton } 基于反射的服务扫描器 然后再主项目启动的时候使用反射扫描添加了该 Attribute 的所有 Class 并注册服务 using System.Diagnostics.CodeAnalysis; using System.Reflection; using XinjingdailyBot.Infrastructure.Attribute; namespace XinjingdailyBot.WebAPI.Extensions; /// /// 动态注册服务扩展 /// public static class AppServiceExtensions { private static readonly NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); /// /// 注册引用程序域中所有有AppService标记的类的服务 /// /// [RequiresUnreferencedCode("不兼容剪裁")] public static void AddAppService(this IServiceCollection services) { var cls = new string[] { "XinjingdailyBot.Repository", "XinjingdailyBot.Service", "XinjingdailyBot.Command", "XinjingdailyBot.WebAPI", }; foreach (var item i…

【油猴脚本教程】P1 开发者工具的使用 & JavaScript 基础教程
type: item
date: 2022-08-08T23:37:00+08:00
description: P1 开发者工具的使用 与 JavaScript 基础教程 教程索引 视频链接 (上) 视频链接 (下) 开发者工具的使用 F12 或者 菜单 -> 更多工具 -> 开发者工具 调出 切换中文 更改语言后重新打开开发者工具生效 或者 界面简介 元素 HTML 原文 HTML节点的属性 控制台 在任意Tab按ESC可以在下方调出 源代码 浏览网站中的所有资源 调试代码 网络 抓包工具 应用 查看本地储存的内容 Cookie Session LocalStorage JavaScript 基础教程 一些 JavaScript 学习资源 MDN 文档： https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 廖雪峰： https://www.liaoxuefeng.com/wiki/1022910821149312 菜鸟教程： https://www.runoob.com/js/js-tutorial.html uTools 插件 基本特性 单线程 弱类型 / 动态类型 大小写敏感 ' ," 通用 不强制使用分号 (建议统一) 语法很灵活 运行时: v8, NodeJS 基础语法 注释 //单行注释 /* 多行注释 */ 变量与常量 赋值操作符 var let const //定义变量/常量 var a = 1; var b; let c = 1; let d; const e = 4; //a,b,c,d,e 1 undefined 1 undefined 4 console.log("a,b,c,d,e",a,b,c,d,e); //Uncaught SyntaxError: Missing initializer in const declaration const f; //赋新值 a = 2; c = 3; //Uncaught TypeError: Assignment to constant variable. e = 1; //重复定义 //undefined var a = 6; let c = 6; //Uncaught SyntaxError: Identifier 'a' has already been declared let a = 6; //Uncaught SyntaxError: Identifier 'a' has already been declared const a = 6; //常量覆盖 const e = 6; //e 6 console.log("e",e); //在子域中覆盖(ES6引入) var ts = 1; let he = 2; { var ts = "aaa"; let he = "yyy"; //ts,he aaa yyy console.log("ts,he",ts,he); } //ts,he aaa 2 console.log("ts,he",ts,he); var 定义一个 变量 let 定义一个仅在作用域内生效的 变量 const 定义一个 常量，一旦定义无法修改，但是可以覆盖定义 使用相同的操作符可以覆盖定义同名的变量，但是不建议这么使用 使用 let 覆盖定义时不影响父作用域的同名变量 强烈推荐优先使用 let 定义变量，如果值不需要改变，建议使用 const 定义成常量 函数提升 //函数提升 foo(); // "bar" function foo() { console.log("bar"); } //这种写法的函数不会被提升 bar(); // 类型错误：bar 不是一个函数 var bar = function() { console.log("bar2"); }; 作用域 { } 定义代码作用域 (ES6的内容) 使用 let 定义的变量，在子域可以访问父域的变量，但是父域不能访问子域的变量 函数中定义的内容外部无法访问 子域中定义的函数，父域无法访问 //顶级作用域(最外层的作用域) let x = 114; { //子作用域 let b = 514; //x,b 114 514 console.log("x,b", x, b); } //函数内部其实也是一种作用域 function xbz() { let c = 233; //x,c 114 233 console.log("x,c", x, c); //Uncaught ReferenceError: b is not defined console.log("b", b); } xbz(); //匿名函数同理 (() => { let d = 3.14; //x,d 114 3.14 console.log("x,d", x, …

【过期】京东炸年兽自动脚本【1.8】
type: item
date: 2021-01-18T10:02:00+08:00
description: 前言 本脚本仅供学习交流之用，使用者如何使用与本文作者无关。 AutoJS下载 & 教程 [post cid="1235" /] 脚本 大部分沿用之前的代码，初步测试没有问题，遇到问题欢迎留言反馈 //JD不定时热更新活动页，请关注脚本更新 //遇到问题请在发布页留言： //https://blog.chrxw.com/archives/2021/01/18/1455.html //Ver 1.8 2021.01.23 //By Chr_(chr@chrxw.com) //========================= //更新说明 //重写了任务完成判断方式,防止偶尔报错 //优化数组访问,应该不会再越界报错了 //修复若干bug //新支持浏览频道任务 //修复加购和参加会员任务的问题（需要打开开关） //修复出现限时任务时报错的问题 //========================= //功能配置 //自动加入会员（设为true启用) let auto_join_vip = false; //自动完成加购任务（设为true启用) let auto_add_cart = false; //延时时间倍率（倍数越大延时越久) let sleep_t = 1.0; //========================= auto.waitFor(); console.show(); toast('\n脚本开始运行\n请切换到任务页\nBy Chr_'); for (let i = 0; i < 10; i++) { //等待切换到任务页 if (className("android.view.View").text("我的爆竹").exists() || className("android.view.View").text("集爆竹").exists()) { break; } rsleep(1); } if (!className("android.view.View").textStartsWith("邀请好友助力").exists()) { advclick(className("android.view.View").text("集爆竹").findOnce()); } toast("\n即将开始工作\n中途需退出请按【音量+】终止"); sleep(1000); for (; ;) { let flag = false; let skip = false; let tasks = className("android.view.View").textStartsWith("邀请好友助力").findOnce().parent().parent().children(); for (let i = 0; i < tasks.length; i++) { if (tasks[i].childCount() == 5) { tasks[i].child(4).click(); rsleep(1); advback(); skip = true; } } if (skip) { continue; } for (let i = 0; i < tasks.length; i++) { if (tasks[i].length < 4) { for (let j = 0; j < tasks[i].childCount(); j++) { log(tasks[i].child(j).text()); } continue; } let desc; let title; try { desc = tasks[i].child(2).text(); title = tasks[i].child(1).text(); } catch (e) { log(e); continue; } let btn = tasks[i].child(3); log(i, desc); if (desc.search("8秒") != -1) { if (checks(btn, title)) { advclick(btn); view(); flag = true; } } else if (desc.search("浏览可得") != -1) { if (checks(btn, title)) { advclick(btn); view2(); flag = true; } } else if (desc.search("关注频道") != -1) { if (checks(btn, title)) { advclick(btn); view3(); flag = true; } } else if (auto_join_vip && des…

Steam Wishlist Helper 配置文件说明
type: item
date: 2020-11-15T03:57:00+08:00
description: 前言 开源地址：Github ，蓝奏云镜像：链接 (密码:cg84) 配置文件说明 [auto] # 可选配置 # 如果配置了下面的值,脚本将会自动代入配置的值 # 如果没有配置,脚本将会要求你输入对应项目 # Steam64位ID,只能为64位ID steamid = 0 # 如果有多个账号,也可以这这么配置 # steamid = [11111,22222,33333] [other] # 其他设置 # 是否在运行结束后显示等待屏幕, 如果是在终端中运行可以禁用 # true: 显示等待屏幕, false: 不显示等待屏幕,直接退出 wait_screen = false [itad] # itad模块设置,用于获取价格信息 # API Token, 必填 # 申请地址: https://new.isthereanydeal.com/apps/mine/ token = "" # 价格区域 # 设置值参考详见附录1 country = "CN" region = "cn" # 货币符号 currency_symbol = '¥' [keylol] # keylol模块设置,用于获取游戏标签,卡牌等信息 # 是否启用keylol模块,禁用的话将使用itad模块替代 # true:启用, false:禁用 enable = false [steam] # Steam网页端语言选项 # schinese代表简中, english代表英文 language = "schinese" # 是否使用小尺寸的游戏图片,改为false将会使用大一些的图片 small_game_pic = true [net] # 代理设置,只支持http协议(不支持socks5) # 如果使用全局模式应该不需要设置 # 非空值: 启用代理, false: 禁用代理 proxy = false # proxy = 'http://127.0.0.1:1081' [output] #输出配置 columns = [''] # 直接在控制台显示 console = true # 打包出了点问题暂时不可用 # markdown格式的输出文件(Typora等软件可以打开) markdown = true # xlsx格式的输出文件(Excel可以打开) xlsx = true # 论坛使用的BBCODE bbcode = true # 导出Json,方便二次开发 json = true [sort] # 排序设置 ################### # 排序功能暂未实装 # ################### # 使用数字表示排序方式,负数表示逆向排序 # 例如: # 1: appid 从小到大 # -1: appid 从大到小 (以下类似) # 0: 不排序 (按照Steam返回的顺序输出) # 1: appid 从小到大 # 2: 史低 -> 近史低 -> 未达史低 ,没有价格的项目始终放在最下面 # 3: 折扣幅度 从小到大 ,没有价格的项目始终放在最下面 # 4: 现价 从低到高 ,没有价格的项目始终放在最下面 # 5: 原价 从低到高 ,没有价格的项目始终放在最下面 # 6: 好评率 从低到高 # 7: 类型 游戏 -> 软件 -> DLC -> 视频 # [0-7]:选择排序依据,如果排名相同会按照appid从小到大排序 index = 1 [filter] # 过滤器设置 # 错误的配置有可能得到意外的结果 # 类似于白名单,【过滤掉】的意思是【删掉】 # 任意规则的值设置为 -1 代表禁用该条规则 # -----其他过滤器--------------------------------------- # true:过滤掉 没有 卡牌的游戏, false/-1:禁用 has_card = -1 # -----价格过滤器--------------------------------------- # 如果游戏未发售,视为 没有价格 # 如果价格获取出错,视为 没有价格 # 免费游戏价格视为 0,但是既不算有价格也不算没有价格 # false:过滤掉 免费 的游戏, true/-1:禁用 price_free = -1 # false:过滤掉 有价格 的游戏, true/-1:禁用 price_set = -1 # false:过滤掉 没有价格 的游戏, true/-1:禁用 price_noset = -1 # 下面的价格过滤器只对有价格的游戏有效,忽略没有价格和免费的游戏 # 任意数值:过滤掉当前价格 低于 设定值的游戏, -1:禁用 price_higher = -1 # 任意数值:过滤掉当前价格 高于 设定值的游戏, -1:禁用 pri…

【过期】双十一京东任务自动脚本【0.6】
type: item
date: 2020-10-25T15:30:00+08:00
description: 前言 x> 双十一活动已经过期，本文仅作存档 本脚本仅供学习交流之用，使用者如何使用与本文作者无关。 AutoJS下载 & 教程 [post cid="1235" /] 全民营业脚本 i> 如果遇到问题请在下方评论 脚本 //遇到问题请在 https://chrxw.com 留言 //Ver 0.6 2020.10.31 //By Chr_(chr@chrxw.com) //========================= //功能配置 //自动加入会员（设为false禁用) var auto_join_vip = true; //自动完成加购任务（设为false禁用) var auto_add_cart = true; //========================= auto.waitFor(); // console.show(); toast('\n脚本开始运行\n请切换到任务页'); for (var i = 0; i < 10; i++) { //等待切换到任务页 if (className("android.view.View").text("收取金币").exists() || className("android.view.View").text("立即解锁").exists()) { log('break'); break; } rsleep(1); } if (!className("android.view.View").textStartsWith("邀请好友助力").exists()) { advclick(className("android.view.View").text("领金币").findOnce()); } toast("\n即将开始工作\n中途需退出请按【音量+】终止"); sleep(2000); for (; ;) { var flag = false; var objs = text("去完成").find(); for (var i = 0; i < 10; i++) { if (objs[i] != null) { obj = objs[i].parent(); if (obj.children() >= 8) { break; } } } var tasks = obj.children(); for (var i = 2; i < tasks.length; i += 4) { var txt = tasks[i].text(); log(txt, i); if (txt.search("8秒") != -1) { var btn = tasks[i + 1]; if (btn.text() == "去完成") { advclick(btn); view(); flag = true; } } else if (txt.search("浏览可得") != -1) { var btn = tasks[i + 1]; if (btn.text() == "去完成") { advclick(btn); view2(); flag = true; } } else if (auto_join_vip && txt.search("成功入会可得") != -1) { var btn = tasks[i + 1]; if (btn.text() == "去完成") { advclick(btn); view3(); flag = true; } } else if (auto_add_cart && txt.search("5个") != -1) { var btn = tasks[i + 1]; if (btn.text() == "去完成") { advclick(btn); view4(); flag = true; } } if (flag) { break; } } if (!flag) { toast("\n脚本运行完毕\n模拟浏览任务全部完成（大概）"); break; } } //模拟浏览（浏览会场任务） function view() { rsleep(3); rslide(10); // className("android.widget.Image").text("vk image").findOne(5000); rslideR(1); rsleep(3); advback(); } //模拟浏览（直接返回） function view2() { rsleep(2); back(); rsleep(2); } //模拟浏览（开卡） function view3() { rsleep(2); var btn = className("android.v…

DirectoryLister 3.5.0 使用教程
type: item
date: 2020-09-21T20:15:00+08:00
description: 前言 DirectoryLister是一款非常小巧的PHP文件浏览器，适合搭建一个简单的个人文件站，之前的教程使用的版本为2.7.1，现在的最新版本为3.5.0，新增了文件夹说明、文件搜索等功能。 我的示例站点：链接 安装步骤 环境需求 PHP版本为 7.2 及以上 安装PHP的 zip、DOM、Fileinfo 扩展，前两个宝塔面板自带，只需安装Fileinfo 下载源码 官方网站 GitHub 本地镜像 @> 本站只提供3.5.0版本下载，最新版本请从官方渠道下载 安装 下载好以后，解压到网站根目录，将 .env.example 文件重命名为 .env 文件，然后用编辑器打开 @> Windows下如果无法重命名的话，可以使用命令 rename .env.example .env !> 如果修改了 .env 文件但是配置不生效，解禁PHP的 putenv 函数即可 .env 配置文件说明 # 调试模式开关 APP_DEBUG=false # 语言设置(zh-CN即简体中文) APP_LANGUAGE=zh-CN # # 深色模式开关(蓝白/紫黑) DARK_MODE=false # 是否在文件列表下方显示Readme.md文件(如果存在Readme.md文件) DISPLAY_READMES=true # 在文件列表上方显示Readme.md文件(需要DISPLAY_READMES=true) READMES_FIRST=false # 是否允许将整个目录打包成ZIP下载(搜索栏左侧会显示打包下载按钮) ZIP_DOWNLOADS=true # # Google Analyitcs设置(要使用的话设置成资源ID即可) GOOGLE_ANALYTICS_ID=false # GOOGLE_ANALYTICS_ID=UA-XXXXXXXXX-X # # MATOMO_ANALYTICS设置 MATOMO_ANALYTICS_URL=false MATOMO_ANALYTICS_ID=false # # 排序设置，可选值如下，排序方式区别见下 # type, natural, name, accessed, changed, modified SORT_ORDER=type # 逆序排序开关 REVERSE_SORT=false # # 隐藏app目录 HIDE_APP_FILES=true # 隐藏.git目录 HIDE_VCS_FILES=true # # 时间格式 DATE_FORMAT="Y-m-d H:i:s" # 时区设置（Asia/Shanghai即上海时间） TIMEZONE="Asia/Shanghai" # # 可以计算Hash的文件的最大尺寸(单位是字节Bytes) MAX_HASH_SIZE=1000000000 # # 主页标题，显示在网页左上角(默认为“目录起始页”) HOME_TEXT="文件下载" # 页面缓存设置，设为false禁用缓存(默认值为"app/cache/views") VIEW_CACHE="app/cache/views" 如果能正确显示网页，说明安装成功了: 定制 i> 修改后需要清除页面缓存后才能看到效果，默认缓存目录为 app/cache/ ，删掉整个目录即可 网站标题优化 将 Home 修改成中文 文件路径为 app\src\Controllers\DirectoryController.php 改成想要的值，比如“主页” 定制标题格式 文件位置在 app\views\layouts\app.twig {{ title }} 是占位符，用来显示当前目录的名称，其他的文本都可以任意改，如果使用特殊符号记得转义 常用符号转义值：" ",& &,< <,> > EXE图标显示空白解决方法 打开app\config\icons.php 把所有 fas fa window 替换成 fab fa windows 即可 @> 原因是新版的 Font Awesome 貌似需要Pro才有这个图标…… 中文字体优化 修改版 app.css 下载: 链接 文件路径为 app\assets\app.css 隐藏特定的文件 在网站根目录下新建一个 .hidden 文本文件，在里面写入希望隐藏的文件名或者路径名即可，支持正则表达式 页面自定义 页眉模板文件：app/views/components/header.twig 页脚模板文件：app/views/components/footer.twig CSS文件：app/assets/app.css 本地化文件：app/translations/zh-CN.yaml