配置文件遵从YAML语法。YAML是一种语法(或者格式),以文本形式储存有并列以及从属关系的数据。
YAML使用缩进(修改YAML的时候一定要注意缩进、缩进、缩进)来表达并列或从属关系,举个例子
某个键: "某个值"
happy:
weather: "天气真好"
moyu: "适合摸鱼啊~~"
hello: "随便写的一些内容"
shuzi: 114514
某个列表:
- "没有黑冲前辈真难打"
- "不要修复TNT复制"
- "嘤嘤嘤"
- nihao: "hello"
- "加强刻晴"
上述例子
:
代表左边的内容对应右边的内容(注意:
后面是有一个空格的)。比如通过某个键
可以获取某个值
。(这种键对应值的结构叫做字典)happy
对应的内容没有直接写在右面。weather
、moyu
、hello
、shuzi
都从属于happy
,为了表示这种从属关系,它们都跟随在happy
的下面而且比happy
多一格缩进某个列表
这个键对应的值是一个列表,列表中的每一项都以-
开头(注意-
后面有空格)(因为这个列表从属于某个列表
这个键,所以会多一格缩进)
上述YAML格式数据转换为JSON格式即为
{
"某个键": "某个值",
"happy": {
"weather": "天气真好",
"moyu": "适合摸鱼啊~~",
"hello": "随便写的一些内容",
"shuzi": 114514
},
"某个列表": [
"没有黑冲前辈真难打",
"不要修复TNT复制",
"嘤嘤嘤",
{"happy": "hello"},
"加强刻晴"
]
}
- 列表的值可以储存在字典(以
键
获取值
)里面或列表(以序列储存,以序号(索引)获取值
)里面。 值
也可以是字典
或列表
,也就是说字典和列表都可以嵌套。 比如上述例子中,整个YAML文件就是一个字典,以某个列表
这个键可以获取到一个列表→列表中的第四项是一个字典→字典里面happy
对应字符串hello
- 值得注意的是
- 同一个字典里的键不可以重复(比如
weather
、moyu
、hello
、shuzi
都属于同一个字典,这些键不能出现重复) - YAML里面字符串是不需要加双引号或者单引号的,比如
某个键
或者某个值
都是字符串。 但是值得注意的是,114514
或者3.14159
会被识别为数字,如果想输入字符串请加上英文引号比如"114514"
或者'3.14159'
同样会被识别为其他类型的还有True
和False
(布尔值)、2000-01-01
(时间,遵从ISO 8601)、null
或~
(空值) (强烈建议下载VS code并安装YAML扩展,不同数据类型自动标记不同颜色,语法错误也会自动标出)
- 同一个字典里的键不可以重复(比如
YAML也可以用引用和锚点功能,重复使用相同的数据(比如配置舍友自动签到时,可以将位置学校等相同的信息写为模板,在通过引用加入到每一个用户的配置中)
关于YAML的详细教程请参考菜鸟教程
除了全局配置,用户配置都存放在users
对应的列表里面,列表里面每一项就是一个用户
- type:
schoolName:
username: ""
password: ""
checkTitle:
forms:
- form:
title:
value:
lon:
lat:
address:
photo:
- type:
schoolName:
username: ""
password: ""
# ...省略...
# ====================隐藏的项目====================
remarkName: 默认备注名 # 备注名——签到情况推送时, 对该用户的备注
model: OPPO R11 Plus # 手机型号
deviceId: 01234567-89AB-CDEF-0123-456789ABCDEF # 设备号
systemVersion: 4.4.4 # 系统版本
systemName: android # 系统名
可以在添加taskTimeRange
项限定执行时间。
- type:
schoolName:
username: ""
password: ""
# ...省略...
taskTimeRange: "1-7 1-12 1-31 0-23 0-60"
taskTimeRange
总共有五项,分别代表周(星期几) 月 日 时 分
。(星期一为1,星期日为7)
每一项时间中用,
分隔多个时间/时间段。用-
可以表示时间范围。
比如
1-5 7 1-10 0-6,22-23 0-59
的含义是在7月的1到10号的工作日(周一到周五),早上0到6时或晚上22到23时的0到59分都会正常执行任务。
而不在上述时间段则跳过此任务。
目前**(仅签到任务/查寝/信息收集)**支持获取上次填报的表单、位置信息进行填报。(会忽略配置问卷中已有的表单和位置信息)
注意:信息收集依然需要填写经纬度和地址,因为历史表单中查询不到详细的位置信息
可以通过添加getHistorySign
项启动这个功能
备注: 本功能仅支持循环任务。有些信息收集看起来是循环任务,实际上是一瞬间大量创建的任务(特别是标题会随着日期改变的那种),这种情况无法自动获取历史表单。
- type:
schoolName:
username: ""
password: ""
# ...省略...
getHistorySign: True # 获取历史表单功能启动
静态二维码签到(动态二维码变化较快,一般来不及用脚本)可以用app/网页解析二维码,获取其中的qrUuid填入表单中。
- 二维码解析可以用网页(草料|微微|工坊)或者能解析出url的手机app。
- 二维码解析结果应该是形式如下,将uuid(加粗部分)填入配置即可 https://***.campusphere.net/wec-counselor-sign-apps/stu/qrsign/index.html?uuid=1a2b3c4d5e67891a2b3c4d5e6789abcd&isNeedExtra=0&schoolId=1234567812345678
- type:
schoolName:
username: ""
password: ""
# ...省略...
qrUuid: ""
用户配置中的以下项目都支持超级字符串
abnormalReason: "" # abnormalReason 反馈信息
photo: sign.jpg # 签到照片(不需要可不填)
title: 0 # [str:签到任务的标题|0:取最后一个未签到的任务]
forms: # 表单信息
- form:
title: 今天你的体温是多少?
value: 37.2℃及以下
- form:
title: 今天你的身体状况是?
value: 健康
- form:
title: 今天你所在的位置是?
value: 其他
extraValue: 天坛公园 # 如果存在选择题附带额外信息,请增加一个extraValue项
超级字符串的本质是一种特殊的字典,形如下
{"str+":"要格式化的字符串", "flag":"功能1|功能2|功能3"}
或者
str+: "要格式化的字符串"
flag: "功能1|功能2|功能3"
开启tf会根据当前时间格式化字符串的时间占位符(使用time.strftime)。
%y 两位数的年份表示(00-99) | %Y 四位数的年份表示(000-9999) | %m 月份(01-12) | %d 月内中的一天(0-31) |
%H 24小时制小时数(0-23) | %I 12小时制小时数(01-12) | %M 分钟数(00-59) | %S 秒(00-59) |
%a 本地简化星期名称 | %A 本地完整星期名称 | %b 本地简化的月份名称 | %B 本地完整的月份名称 |
%c 本地相应的日期表示和时间表示 | %j 年内的一天(001-366) | %p 本地A.M.或P.M.的等价符 | %U 一年中的星期数(00-53)星期天为星期的开始 |
%w 星期(0-6),星期天为星期的开始 | %W 一年中的星期数(00-53)星期一为星期的开始 | %x 本地相应的日期表示 | %X 本地相应的时间表示 |
%Z 当前时区的名称 | %% %号本身 |
示例
title: {"str+":"%y年%m月%d日签到", "flag":"tf"} photo: - {"str+":"%m月%d日的图片.jpg", "flag":"tf"} - {"str+":"%m月%d日的文件夹", "flag":"tf"}会被格式化为
title: "22年03月16日签到" photo: - "03月16日的文件夹" - "03月16日的图片.jpg"
开启rd会让将字符串中<rd>......</rd>
的部分随机选取一项加入字符串。
随机部分以<rd>
开始、以</rd>
结束。其各项以\a
分隔。
注意事项:
- 分隔符使用的是非打印字符
\a
(响铃(BEL)),请yaml只会对"
双引号包裹的字符串进行转义,请使用双引号包裹字符串
示例
- form: title: 你今天的体温是? value: 体温 extraValue: {"str+":"今天我的体温是<rd>36.4\a36.5\a36.6</rd>°C", "flag":"tf"}会被格式化为
- form: title: 你今天的体温是? value: 体温 extraValue: "今天我的体温是36.5°C" # 随机选取,可能出现36.4/36.6
开启re会让字符串匹配使用正则(单选/多选/任务标题等皆可用)。
注意事项:
- 路径不支持正则匹配(比如
photo
项) - 在yaml语法中,
'
单引号包裹的字符串会将\
原样保存,建议使用单引号包裹正则表达式。
示例
title: {"str+":'\d{1,2}月\d{1,2}日签到', "flag":"re"} # 注意,正则表达式有大量的「\」,所以使用单引号包裹字符串会匹配到
- 3月14日签到
- 12月2日签到
- .......
形如下的题目
9.最后核酸检测时间(日期时间) 题目规则:最早1900-01-01;最晚2099-12-31
其时间格式如下
- form:
title:
value: "2001-01-01" # 一定要有引号(字符串),否则会被识别为时间对象
如有其他时间格式,按照表单中时间框中预览的格式填入即可。
注意,这是表单的填报格式而非
address
项。
address
项按照坐标查询的地址填入即可(比如北京市东城区天安门广场中央)
地点的分隔符一般是/
- form:
title:
value: "xx省/xxx/xxx/xxx" # 有些是xx/xx/xx
查寝、政工签到都有 photo
可填项。可以填入一个本地图片的位置(绝对/相对都可以)。
信息收集如果有图片收集,则可以作为问题答案填入value
中。
photo:
- "图片文件夹"
- "图片.jpg"
- "图片2.jpg"
或者
photo: "图片.jpg"
或者
photo: "图片文件夹"
要直接点进去就能打开图片的那种,也就是所谓的直链,一般情况下是以文件拓展名(jpg,png,webp等)为结尾的
错误的直链: https://699pic.com/tupian-400863814.html 正确的直链: https://tva4.sinaimg.cn/large/0072Vf1pgy1foxkioq4i5j31hc0u0e1o.jpg
注意:目前requests仅支持http及https协议下的直链,如有ftp、sftp等协议的需求可提交pr进行支持(建议使用已有的依赖和标准库)
可以如下填写多个网络地址
photo:
- "http://sign.example.com/singphoto001.jpg"
- "https://sign.example.com/singphoto002.png"
- "https://sign.example.com/singphoto004.jpg"
也可以与本地地址混搭,程序会优先尝试在线地址,全部失败后会尝试使用本地地址。
photo:
- "http://sign.example.com/singphoto001.jpg"
- "https://sign.example.com/singphoto002.png"
- "图片文件夹/图片.jpg"
- "图片文件夹"
则会将列表中的图片逐个上传(如果路径指向文件夹则从中随机选取一张图片)
则会在列表中随机选取一个路径进行上传(如果路径指向文件夹则从中随机选取一张图片)
在用户配置中,配置proxy
参数可以使用代理。
- type:
schoolName:
username: ""
password: ""
# ...省略...
proxy: "http://host:port" # 注意缩进要和username、password等参数保持一致
代理请以http://
或https://
为开头。常见的形式有
http://用户名:密码@123.123.123.123:1234
http://123.123.123.123:1234
因为免费代理大多不稳定,所以百度了一家按量付费的代理提供商。推荐使用那个最便宜的套餐(2元-1000次-1~3分钟-有效2个月)。
-
购买后进入到
订单管理
然后点击生成API
,填入配置文件(位置同上面的普通代理) -
使用云函数时,请在
函数配置
中启用固定出口IP
。 (腾讯云函数的选项在设置函数超时时间的那个页面,勾选以后记得点保存。(配置成功后会显示出口IP) -
备注: 前两天获取到无效代理的概率比较高,稳定后代理的有效率很高。(不清楚为什么有这个特性,应该是代理提供商的锅)
关于固定出口IP(这部分可以不看) 腾讯云函数默认每一次请求都会动态分配IP(也就是每一次请求的出口IP可能都不一样)。使用代理是需要代理服务器给予使用者IP白名单的。 当使用API获取代理时,请求所使用的IP会自动加入白名单。但是接下来的请求换了其他公网IP,所以会被代理服务器所屏蔽。
腾讯云函数开启
固定出口IP
后,这个云函数就会固定使用一个公网IP(可以在函数配置
中看到)
- type:
schoolName:
username: ""
password: ""
# ...省略...
proxy:
type: panda
api: http://pandavip.xiongmaodaili.com/xiongmao-web/apiPlus/vgl?secret=***&orderNo=***&count=1&isTxt=0&proxyType=1&validTime=1&removal=0&cityIds=
maxRetry: 3
api
——生成出来的API,生成API页的参数可以随便设置(在签到脚本中会自动将返回格式设为json, 一次提取1个, 要求返回有效时间)maxRetry
——如果获取到不可用的代理IP,进行重试的最大次数
用户配置中可以添加sendMessage
推送仅该用户的签到情况,格式同整体推送(不需要的选项可以删掉)。
- type:
schoolName:
username: ""
password: ""
# ...省略...
sendMessage:
rl_emailApiUrl: http://mail.ruoli.cc/api/sendMail # 邮箱API的地址(不需要推送不用填)
rl_email: "" # email 接受通知消息的邮箱(不需要推送不用填)
qmsg_key: "" # qmsg推送的key(不需要推送不用填)
qmsg_qq: "" # qmsg推送的qq号(不需要推送不用填)
qmsg_isGroup: 0 # 此qq号是否为群(是的话填1,反之为0)
pushplus_parameters: "" # pushplus参数,填入令牌(token)即可推送。也可以填入"token=xxx&topic=xxx"形式自定义更多参数
pushplus_isNew: False # False使用旧版pushplus(https://pushplus.hxtrip.com),True使用新版pushplus(http://www.pushplus.plus/)
smtp_host: "smtp.qq.com" # SMTP服务器域名
smtp_user: "*****@qq.com" # SMTP服务器用户名
smtp_key: "" # SMTP服务器密钥
smtp_sender: "*****@qq.com" # 发送邮箱
smtp_receivers:
- "*****@qq.com" # 接收邮箱(可填多个)