“Deno 在手,女友我有”,极速上线嘘寒问暖Bot

2021-09-09 10:29:15 浏览数 (1)

很久很久没有提笔写东西了,也意味着很久很久没有瞎折腾 Copy 大法了。我是谁?我是谁并不重要,江湖肯定没有 Copy 攻城狮的传说,不过,也许这是一篇真情露出的踩坑文。以前,听说过“If I have seen further,it is by standing on the shoulders of giants.”,而此刻我正站在Ryan Dahl[1]乂乂又又[2]的肩膀上,体验万物皆可 Serverless 的 Serverless Deno ,从零到一开(kao)发(bei)然并卵的铝盆友彩虹屁 bot(目前仅仅是定时发送邮件)。

伪需求分析

  1. 最好的爱情就是我知 TA 冷暖,我懂 TA 心意 —— 定时天气预报外加心灵鸡汤;
  2. 最好的陪伴就是安心地和 TA 一起倒数最重要的日子 —— 倒计时提醒;
  3. 最好的心情就是 TA 每天第一次睁开眼睛看到的是我的问候,夕阳下在我的晚安声中进入梦乡 —— 早安晚安问候;
  4. 当然最重要的是学习了解一下新鲜事物,比如 Deno、比如 Serverless。

实现构想

  1. 缘起于大佬的创意和代码实现,所以代码不用考虑太多,照搬就行;
  2. 邮箱服务直接 Github 搜一波,现在的年轻人不讲武德,什么数据库、秘钥、邮箱账号密码、公司项目源码等等通通一股脑丢到 Github,我也想康康(不知道会不会喝茶);
  3. 再想下代码实现,涉及到日期时间计算、邮件发送,是不是得找个巨佬的肩垫垫脚?插件拿过来就是刚!
  4. 怎么部署呢?稍微对比了一下,就鹅厂云了,好像几个月前就支持 Deno 部署了,应该比较成熟(没想到还是栽坑里了)。
  5. 最后, Just Do IT!

热气腾腾

看小标题是不是猜到什么恶心的东西了?是的,正是在下!本大狮,历经九九八十一分钟(实际折腾了一宿,主要卡在 Serverless 部分了),翻阅了多处 API 文档,几经波折之后,具有辣眼睛的新鲜代码出来了:

代码语言:javascript复制
/*
* Copyer huqi
* https://github.com/hu-qi
*/
import * as log from "https://deno.land/std@0.79.0/log/mod.ts";
import { SmtpClient } from "https://deno.land/x/smtp/mod.ts";
import {
  differenceInDays,
  format,
} from "https://deno.land/x/date_fns@v2.15.0/index.js";
import { zhCN } from "https://deno.land/x/date_fns@v2.15.0/locale/index.js";
import "https://deno.land/x/dotenv/load.ts";

// 很随意的入参,来自.env
const {
  SEND_EMAIL,
  PASSWORD,
  RECV_EMAIL,
  NAME_GIRL,
  CITY,
  CUTDOWNDATE,
  CUTDOWNTHINGS,
} = Deno.env.toObject();

// 很随意的API,来自掘金
const URL = {
  weather: `http://wthrcdn.etouch.cn/weather_mini?city=${CITY}`,
  soup: "https://www.iowen.cn/jitang/api/",
  pi: "https://chp.shadiao.app/api.php",
};

// 先配置下邮箱服务,管他行不行
const client = new SmtpClient();

const connectConfig: any = {
  hostname: "smtp.163.com",
  port: 25,
  username: SEND_EMAIL,
  password: PASSWORD,
};

// 姑且认为返回的都是结构数据
async function _html(url: string): Promise<string> {
  return await (await fetch(url)).text();
}

// 目标城市的天气
async function getWeather(url: string) {
  let data = await _html(url);
  if (data.indexOf("OK") > -1) {
    let _data = JSON.parse(data).data;
    const { ganmao, wendu, forecast } = _data;
    const weather = forecast[0].type;
    return `天气:${weather} 当前温度:${wendu}
          ${ganmao}`;
  } else {
    return "亲爱的,今天天气真奇妙!";
  }
}

// 倒计时
function getTime() {
  const today = format(new Date(), "PPPP", { locale: zhCN });
  const days = differenceInDays(new Date(CUTDOWNDATE), new Date());

  return `今天是 ${today} ${CUTDOWNTHINGS}倒计时:${days}天`;
}

// 心灵鸡汤
async function getSoup(url: string) {
  let data = await _html(url);
  if (data.indexOf("数据获取成功") > -1) {
    let _data = JSON.parse(data).data;
    const { content } = _data.content;
    return content;
  } else {
    return `高考在昨天,${CUTDOWNTHINGS}在明天,今天没有什么事儿!`;
  }
}

// 彩虹


	

0 人点赞