乐趣区

关于javascript:编写serverless云函数实践抓取网页后转发基于valtown

指标

能定时抓取网站内容,并发送到飞书群机器人接口。

介绍

https://www.val.town/ 是个云函数的运行环境。

示例 demo 能够教会你如何给本人的邮箱发送笑话(console.email 只能发给本人的注册邮箱)

反对动静引入 npm 包,但调试不大不便,最开始想援用 node-fetch 来实现 fetch,但总是报错,报错信息不明确。起初间接用 fetch 代替了。

val.town 提供定时工作的模式,只须要写好本人的函数,再抉择增加 schedule,设定一下 cron,就能够实现定时运行函数的性能。(定时有肯定的限度)

实际

拿 echojs 网站为例,须要 fetch 网页内容,通过 cheerio 等库解析一下 html,选择器找到对应的内容,提取即可。

抓取局部

如下 fetchEchojs 函数实现抓取网站网页的文章题目和链接,并返回

async function fetchEchojs() {
  const url = "https://www.echojs.com/";
  // 动静引入 npm 包的形式 await import('npm:xxx')
  const cheerio = await import("npm:cheerio");
  try {const res = await fetch(url);
    const data = await res.text();
    const $ = cheerio.load(data);
    const result = [];
    $("#newslist article").each((i, elem) => {const $article = $(elem).find("h2");
      const title = $(elem).find("h2").text();
      const url = $article.find("a").attr("href");
      result.push({
        title,
        url,
      });
    });
    return result;
  }
  catch (err) {console.error(err);
  }
}

下一步编写 val 并设置

抓取实现后, 取得了一个存储文章的数组,正好飞书群机器人提供 api 承受申请内容,转发到飞书群音讯。

发送申请用 fetch 实现即可,这里就不介绍。

如下函数,实现了整个工作的次要逻辑。

async function workdayMorningNews4Js() {
  // @my.fetchEchojs 即下面的函数
  const news = await @my.fetchEchojs();
  // larkTweet 是我发送飞书机器人的 val
  await @my.larkTweet({
    "msg_type": "post",
    "content": {
      "post": {
        "zh_cn": {
          "title": "过去看,过去挑,走过路过,不要错过",
          "content": [...news.slice(0, 10).map((item) => [{
              "tag": "a",
              "text": item.title,
              "href": item.url,
            }]),
          ],
        },
      },
    },
  });
}

而后就是设置定时 cron,留神用的是 UTC,所以国内的话工夫早其 8 小时。

如图,设置每周一到周五,每天早上 9 点半执行 val。

第一次保留时,会触发一次运行,前面就到点执行了。

总体来说,编写难度不大,能够实现一些简略的需要,比方每天给本人发个笑话,或者收集一下常识文章推送,也略微留神一下平安咯,val 能够编写公有和公开,注册用户公有有数量限度。

退出移动版