跳到主要内容

自定义(代码)模式的任务

使用自定义(代码)模式,您可以使用一段Node.js代码来创建一个任务。

例如,您可以使用node-fetch来抓取没有html结构的文件,如txt, json, xml, rss, css等。
同时,您还可以利用node-fetch来添加header,设置cookie,去请求一些需要登录才能访问的资源。
此外,您使用代码来操作puppeteer的page对象,调用自定义的page.evaluate、page.click等等方法, 轻松模拟点击、模拟输入,设置localStorage等。

代码片段如下:

// cron syntax REQUIRED
export const cronSyntax = '0 0,10,20,30,40,50 * * * *';

// endTime REQUIRED , timestamp , miliseconds
export const endTime = Date.now() + 1000 * 60 * 60 * 24 * 7;

// the function to execute a custom mode task. REQUIRED
// taskDetail, page, nodeFetch is available inside below exec() function context
// ignore the editor's hints, YES you can use taskDetail, page, nodeFetch
// taskDetail is an object contains some info about current task
// page is puppeteer's page
// see FAQ and https://docs.webpagemonitor.net for details.
export async function exec(){
let url = 'https://www.baidu.com';
let result = await nodeFetch(url).then(r => r.text())
return result;
}

如上所示,您可以使用Node.js代码来创建一个任务,规则如下:

您必须定义并export一个名为cronSyntax的变量,(字符串类型),它是一个cron表达式,指定了任务每次重复执行的时间。
您必须定义并export一个名为endTime的变量,(整数类型),它指定了任务结束的时间戳(毫秒,长度为十三位)。
您必须定义并export一个名为exec的函数,(async类型),它执行具体的任务逻辑,并将每次获得的结果return。

您可以在exec()函数内,使用以下预先定义好的变量,在检测任务执行时,来调用一些第三方模块,或者获取当前任务的详情信息:

  • 使用taskDetail变量,获取当前任务的详情信息。taskDetail包含的主要字段如下:
    {
    _id: "626f6513351d62f9fd567dfb",
    userId: "5e9f8f8f8f8f8f8f8f8f8f8f",
    extra:{
    alias: "task alias name",
    }
    }
  • 使用nodeFetch变量,来调用npm的node-fetch模块。

    请参考node-fetch的文档
    目前使用的node-fetch版本为3.2

  • 使用page变量,来调用puppeteer的page对象。

    请参考puppeteer官方文档
    目前使用的puppeteer版本为13.0.1

exec()函数内return的结果会被自动保存到数据库中,如果结果发生了变化,便会发送email提醒。
(暂仅支持结果的变动提醒。其它的关键词出现提醒,正在开发中。)

tip
  • 注意,只能在函数exec()内使用nodeFetchpagetaskDetail变量。
  • 在整个代码片段内,不能使用requireimportfetchglobalprocess关键字。
  • 每个代码片段的最大长度限制为5000个字符串。
  • 每个代码片段执行时间限制为 7秒钟 。如果超过7秒钟仍未return结果,则结果将会被保存为null。
  • 请在函数exec()内 return 获得的字符串文本结果,否则,不会有变动提醒邮件。
  • 您可以在 任务列表页面,导出当前任务的csv文件,查看textContent字段与exec()函数return的结果,是否是您期望的结果。
  • 您无需关心puppeteer browser实例的创建与关闭,只需调用page相关的方法即可。后续看情况再决定是否提供browser变量供使用