编写serverless云函数实践-抓取网页后转发(基于val.town)

216 阅读2分钟

目标

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

介绍

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可以编写私有和公开,注册用户私有有数量限制。