网页更新提醒
本着能自己解决就自己解决的原则,遇到问题可以先看看说明,确实不会欢迎找作者沟通
QQ用户群:478378960,作者QQ号:3579137434
如何手动安装?
  • 手动安装适合QQ、搜狗、360、chrome等类chromium浏览器
  • 下载courier.crx
  • 打开扩展管理页面:chrome://extensions/
  • 页面右上角打开开发者模式
  • 将下载好的courier.crx文件拖到页面
如何推送到微信?
  • 用微信扫码以下这个二维码,完成公众号关注
  • 进入公众号,「我的」-> 「我的UID」获取UID
  • 将UID填入webhook地址栏(多个UID用英文逗号,隔开)
收不到邮件通知?
  • 首先,麻烦再三确认邮箱地址是否正确,多个邮箱地址用英文逗号,隔开,已经发现了很多填写错误的情况
  • 另外,邮件发送量越来越大,有时候会因为发送量达上线而无法发送的情况,所以如果不是强依赖,推荐使用webhook通知
  • 收不到邮件有几种情况,进垃圾箱了或者进了应用黑名单
  • 确认邮件是否被归类到了垃圾箱,如果是麻烦先移除,并将3579137434@qq.com和wb@mail.toptopn.com设置为重要联系人,避免邮件再次进入垃圾箱
  • 确认完成以上步骤以后,如果还是收不到就是进了应用黑名单,需要联系作者手动解除
内容没有变化也收到了通知?
  • 可以确定的是,内容一定有变化了才会有通知
  • 这个时候可以勾选文本对比,看看具体是什么内容发生了变化
  • 如果确认变化的内容不需要提醒,可以通过排除规则排除掉,也可以设置匹配规则,只关注特定的内容更新
怎么接收Webhook通知?
  • 钉钉获取webhook的方法,参看这里,不要勾选签名校验
  • 飞书获取webhook的方法,参看这里,不要勾选签名校验
  • 企业微信获取webhook的方法,参看这里
  • Telegram地址格式:https://api.telegram.org/bottoken/sendMessage?chat_id=chat_id
  • 其他IM获取webhook地址方法需要自行搜索
  • 重要:钉钉机器人不要勾加签和IP地址段,勾选自定义关键词并填入:[
什么是检测前预处理?
  • 就是在检测开始之前,先执行一段自定义的JS脚本
  • 用于页面需要一些操作以后才能执行检测的场景
  • 比如:需要设置过滤条件然后点击查询
  •                 
                      function beforeExtract(id, data) {
                        /*设置输入框数值*/
                        document.querySelector('.ipt').value = 100;
                        /*点击按钮*/
                        document.querySelector('.btn').click();
                        
                        /*支持异步/延时回调*/
                        setTimeout(function() {
                          _callback(id, data);
                        }, 1000);
                      }
                    
                  
  • 这里function beforeExtract(id, data) {_callback(id, data);}是固定格式,不要改动
  • ID: 是一个标识,代码回调映射,编写脚本不用关心
  • data: 是监控任务数据,完整的结构如下:
  • 
                    {
                      selectors: [
                        {type: 'xpath', selector: '//UL[1]'}
                      ]
                    }
                  
什么是通知预处理?
  • 就是在通知发出来之前,先执行一段自定义的JS脚本
  • 可以动态修改通知的标题、URL、摘要以及详情内容,以达到个性化推荐的目的
  • 可以通过设置ignored字段忽略本次提醒:data.ignored=true
  • 可以动态修改通知地址,比如监控失败的时候只发送给自己
  • 比如,如果监控的是数字,那么我们可以把推送的摘要或者标题动态改成:涨幅xxx%
  •                 
                      function beforeNotify(id, data) {
                        var pre = parseFloat(data.preData.text);
                        var cur = parseFloat(data.curData.text);
                        var diff = cur - pre;
                      
                        if (/重新框选/.test(data.text)) {
                          data.config.webhook = "UID_xxx_N";
                        } else {
                          var text = "盈亏比例为:" + ((cur - pre).toFixed(2) / 80).toFixed(4) + "%";
                          data.text = text;
                          if (cur > pre) {
                            data.config.title = "枭龙一号开单了,本单为盈利单!";
                          } else {
                            data.config.title = "枭龙一号开单了,本单为亏损单";
                          }
                        }
                      
                        _callback(id, data);
                      }
                    
                  
  • 这里function beforeNotify(id, data) {_callback(id, data);}是固定格式,不要改动
  • ID: 是一个标识,代码回调映射,编写脚本不用关心
  • data: 是通知需要的数据,完整的结构如下:
  • 
                    {
                      text: '消息推送文本内容',
                      html: '消息详情html代码',
                      ignored: false, // 是否忽略本次通知
                      config: {
                        title: '监控任务标题',
                        url: '监控任务的url地址',
                        emails: '通知邮箱',
                        webhook: '微信UID或者webhook地址'
                      },
                      preData: {
                        text: '上一次检测到的文本内容',
                        html: '上一次检测到的HTML片段'
                      },
                      curData: {
                        text: '当前检测到的文本内容',
                        html: '上一次检测到的HTML片段'
                      },
                    }
                  
  • 我们可以通过data变量获取对应的数据,也可以动态修改这些字段,达到修改通知内容目的
  • 代码在一个沙盒页面运行,可以访问DOM接口&操作DOM!
  • 注意,这是模板消息,只能修改以上这些字段,其他字段的修改没有意义
什么是定时报告?
  • 通过脚本把每天监测到的数据整理成日报发送
  •                 
                      function schedule(id, data) {
                        var text = data.list.map(function(item) {
                          return item.text;
                        }).join("\n");
                        var html = data.list.map(function(item) {
                          return item.html;
                        }).join("<br>");
                        
                        /*设置报告标题*/
                        data.config.title="这是日报";
                        /*设置文本摘要*/
                        data.text = text;
                        /*设置通知详情富文本*/
                        data.html = html;
                      
                        _callback(id, data);
                      }
                    
                  
  • 这里function schedule(id, data) {_callback(id, data);}是固定格式,不要改动
  • ID: 是一个标识,代码回调映射,编写脚本不用关心
  • data: 是通知需要的数据,完整的结构如下:
  • 
                    {
                      text: '发送消息的文本摘要,需要脚本设置',
                      html: '发送消息详情html代码,需要脚本设置',
                      ignored: false, // 是否忽略本次通知
                      config: {
                        title: '监控任务标题',
                        url: '监控任务的url地址',
                        emails: '通知邮箱',
                        webhook: '微信UID或者webhook地址'
                      },
                      list: [ // 第一条是最新的内容
                        {html: '每次监控提取的HTML片段', text: 每次监控提取的文本内容},
                        {html: '每次监控提取的HTML片段', text: 每次监控提取的文本内容}
                      ]
                    }
                  
  • 我们可以通过data.text, data.html和data.config.title实现日报的定制
区域选择模式是什么?
  • 圈选模式,顾名思义用户需要在页面上用画笔圈选区域,程序自动识别对应的区域节点,完成区域选择
  • 自动模式,用户只需要把鼠标移到对页面上,程序自动高亮框选相关的元素节点,用户只需要点击就可以完成区域选择
选择器是什么?
  • 选择器是页面上一个节点的唯一标识,程序通过选择器可以查找到圈选的区域对应的区域
  • 选择器由程序自动生成,如果了解xpath规则也可以自行修改
并行数量是什么意思?
  • 并行数量代表同时在检测中的任务数量,目的是防止全部任务一起到期一起检测出现卡死或者被网站封禁的情况
基线时间是什么意思?
  • 有些页面更新数据是有规律的,比如整点更新
  • 基线时间的目的就是确保任务在基线时间(默认是整点)优先执行
延迟检测是什么意思?
  • 部分网页数据是异步加载,而且加载很慢
  • 为了防止检测失败,可以设置一个延迟检测的时间,等待数据加载完成后再检测
怎么修改声音?
目前只支持在线的https格式mp3地址
  • 站长素材网有各种声音供下载
  • 下载后在浏览器的下载管理页面可以看到下载地址
  • 复制下载链接,填入 设置->声音设置 的自定义声音输入框即可
常驻页面是什么意思?
  • 部分用户监控的任务大部分都是同一个网站
  • 为了提升检测速度,可以将其中一个页面设置为常驻页面
  • 目的就是让浏览器缓存网页的资源,加快页面的加载速度
关闭浏览器也能收到通知吗?
能,但以下条件至少满足一个
  • 任务开启了云端监控,或者
  • 任务开启了共享有别的用户也共享了相同的任务在运行中(没关闭浏览器)
支持一个页面圈选多个区域吗?
支持,目前是会将多个区域当做不同的任务处理
支持滚动圈选吗?
不支持,但是可以将页面缩小到内容大部分可见以后,刷新页面再圈选,就能圈选更多的内容了
  • mac上同时按command和-
  • windows上同时按ctrl和-
  • 同时按commad/ctrl和0,重置页面
为什么点击圈选没有反应?
  • 国内浏览器大多都是双核浏览器(chromium内核 + IE内核),一些政府网站浏览器会默认用兼容模式打开
  • 兼容模式是不支持插件的,所以需要手动切换成极速模式,浏览器地址栏右侧有切换按钮
为什么需要排除规则?
  • 更新检测的原理是对比两次圈选区域的文本差异
  • 以列表为例,经常会出现内容没有变化,但日期/时间会变化的情况
  • 我们需要忽略这些不重要的内容更新,所以需要通过正则规则排除掉
  • 这时候可以勾选文本对比,看到更新的内容,比如日期更新:2022年5月20日
  • 那我们可以把新增的内容复制出来,把数字替换成\d+即可得到最终的正则表达式:\d+年\d+月\d+日
  • 同理,时间、数字更新都可以内推
为什么需要匹配规则?
  • 有些页面内容很多,更新也很频繁,但是很多内容是我们不感兴趣的
  • 这个时候就需要通过正则匹配,挑选自己感兴趣的内容
  • 设置了匹配规则后,只有内容出现关键字以后才会提醒你
  • 是不是整个世界都清静了呢
匹配规则和排除规则是怎么合作的呢?
  • 差异对比后会将符合排除规则的内容消除掉
  • 排除规则推荐选择:新增内容->正则排除
  • 匹配规则推荐选择:新增内容->正则匹配
  • 不管规则怎么样,首先会计算差异,然后逐个差异与规则进行匹配
  • 仅有匹配规则的匹配的过程:
    • 如果匹配规则就高亮显示,否则忽略更新
    • 举个例子,如果匹配规则为:新增内容 -> 正则匹配 -> 动物
    • 那么在检测到有更新的时候,将检测新增部分内容是否包含动物,如果包含则提醒并高亮显示,否则不提醒
  • 仅有排除规则的匹配的过程:
    • 如果全部更新都命中排除规就忽略,否则提醒
    • 举个例子,如果排除规则为:新增内容 -> 正则匹配 -> \d+件
    • 那么所有库存数量的变化(10件 -> 5件)都将被忽略,除非有其他的内容更新才会提醒
  • 既有匹配规则,又有排除规则的匹配的过程:
    • 等同于仅有匹配规则的情况
  • 关于正则表达式的语法可能需要自行学习一下
    • 匹配数字:\d+,匹配一个或多个数字
    • 匹配日期:\d+-\d+-\d+,注意日期格式多种多样,需要根据实际情况更换中间的分割字符
    • 特殊符号:. 表示任意非换行字符,\S 表示非空白字符,\s 表示空白字符,^ 表示匹配开始,$ 表示匹配结束
云端运行都有哪些限制?
  • 首先,网站必须是能够公网访问的,内部网站或者需要VPN才能访问的网站是无法运行的
  • 不支持需要依赖登录态的页面,目前没有账号自动登录的机制,后面可以考虑支持
  • 每个用户可开启的任务数量是有限制的,服务器内存、CPU、带宽都是有成本的,无法完全放开,有需要可以单独聊
  • 云端任务的间隔不完全等同于设置,会取设置间隔与服务端配置最大的数值
  • 云端运行中全部用户的任务,不一定能够排上,所以未必能每次都成功,尽可能确保每个任务有均等的执行机会