Skip to content

Latest commit

 

History

History
458 lines (349 loc) · 16.8 KB

用户配置高级教程.md

File metadata and controls

458 lines (349 loc) · 16.8 KB

用户配置高级教程

基础知识

YAML语法概述

配置文件遵从YAML语法。YAML是一种语法(或者格式),以文本形式储存有并列以及从属关系的数据。

YAML使用缩进(修改YAML的时候一定要注意缩进、缩进、缩进)来表达并列或从属关系,举个例子

某个键: "某个值"
happy:
  weather: "天气真好"
  moyu: "适合摸鱼啊~~"
  hello: "随便写的一些内容"
  shuzi: 114514
某个列表:
  - "没有黑冲前辈真难打"
  - "不要修复TNT复制"
  - "嘤嘤嘤"
  - nihao: "hello"
  - "加强刻晴"

上述例子

  • : 代表左边的内容对应右边的内容(注意:后面是有一个空格的)。比如通过某个键可以获取某个值。(这种键对应值的结构叫做字典)
  • happy 对应的内容没有直接写在右面。weathermoyuhelloshuzi都从属于happy,为了表示这种从属关系,它们都跟随在happy的下面而且比happy多一格缩进
  • 某个列表这个键对应的值是一个列表,列表中的每一项都以-开头(注意-后面有空格)(因为这个列表从属于某个列表这个键,所以会多一格缩进)

上述YAML格式数据转换为JSON格式即为

{
  "某个键": "某个值",
  "happy": {
    "weather": "天气真好",
    "moyu": "适合摸鱼啊~~",
    "hello": "随便写的一些内容",
    "shuzi": 114514
  },
  "某个列表": [
    "没有黑冲前辈真难打",
    "不要修复TNT复制",
    "嘤嘤嘤",
    {"happy": "hello"},
    "加强刻晴"
  ]
}

  • 列表的可以储存在字典(以获取)里面或列表(以序列储存,以序号(索引)获取)里面。
  • 也可以是字典列表,也就是说字典和列表都可以嵌套。 比如上述例子中,整个YAML文件就是一个字典,以某个列表这个键可以获取到一个列表→列表中的第四项是一个字典→字典里面happy对应字符串hello
  • 值得注意的是
    • 同一个字典里的键不可以重复(比如weathermoyuhelloshuzi都属于同一个字典,这些键不能出现重复)
    • YAML里面字符串是不需要加双引号或者单引号的,比如某个键或者某个值都是字符串。 但是值得注意的是,114514或者3.14159会被识别为数字,如果想输入字符串请加上英文引号比如"114514"或者'3.14159' 同样会被识别为其他类型的还有TrueFalse(布尔值)、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)

开启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>开始、以</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)

开启re会让字符串匹配使用正则(单选/多选/任务标题等皆可用)。

正则使用参见正则教程,试验可以使用regex101

注意事项:

  • 路径不支持正则匹配(比如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)

    2022-08-06-21-35-08-001
  • 备注: 前两天获取到无效代理的概率比较高,稳定后代理的有效率很高。(不清楚为什么有这个特性,应该是代理提供商的锅)

关于固定出口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" # 接收邮箱(可填多个)