【SCF VS Code 实践:利用SCF和COS免费24小时监测比特币价格并邮件通知预警】

  • 2019 年 10 月 8 日
  • 筆記

开头:小韭菜一名,劝告各位,谨慎币圈,最好远离币圈

语言环境:Node.js8.9

云服务:

  1. 云函数 SCF
  2. 对象储存 COS

第三方模块:

  1. cos-nodejs-sdk-v5 (COS的NodeSDK)
  2. request(请求API)
  3. request-promise
  4. nodemailer (发送邮件)

工具:

  1. VS Code
  2. SCF CLI
  3. 云函数VS Code插件(Tencent Serverless Toolkit for VS Code)

必备资料

  1. 个人QQ邮箱SMTP服务
  2. 腾讯云API密钥(SecretId,SecretKey)
  3. 创建的储存桶名称
  4. 储存桶和云函数所属的地域(例:ap-guangzhou = 广州)

新建一个本地函数

新创建一个函数=>事例模板=>node.js8.9=>输入函数名(Price)
新建好的事例函数

新建一个存储桶(COS)

新建配置,注意所属地域要与后面上传云函数的地域一致

【重要】在编辑器新建一个data.json粘贴下面的数据结构(ZB平台),并上传至刚刚创建好的储存桶

ZB平台请求交易对的数据结构
{      "date": "0",      "ticker": {          "high": "0",          "vol": "0",          "last": "0",          "low": "0",          "buy": "0",          "sell": "0"      }  }
data.json上传至储存桶

进入函数文件夹通过NPM安装所需要的模块

npm i cos-nodejs-sdk-v5 request request-promise nodemailer --save
注意路径,node_modules与函数主文件index.js同层级

接下来就是修改代码正文,所有代码都在index.js里面,直接覆盖

'use strict'    const COS = require('cos-nodejs-sdk-v5')  const rq = require('request-promise')  const nodemailer= require('nodemailer')  const fs = require('fs')    // 使用 cos 所需的鉴权/配置信息  const SECRET_ID = 'XXXXX' // 请替换为您的 SecretId  const SECRET_KEY = 'XXXXX' // 请替换为您的 SecretKey  const REGION = 'ap-guangzhou' // 请替换为您储存桶所在的地域,这里是广州  const BUCKET = 'price-123456789'  //创建的储存桶名称  const Threshold = 1000      //定义一个上下浮动的阈值  const Transaction = ['btc', 'qc']   //需要监测的交易对,qc是ZB平台的稳定币  const toUser = '[email protected]'   // 收件人邮箱  const mailerData = {      host: 'smtp.qq.com',      secure: false,      port: '这里填写smtp的端口',      auth: {          user: '这里填写发件人的邮箱账号',          pass: '这里填写发件人申请的smtp密码'      }  }   //  发件服务配置,这里用个人QQ邮箱的smtp服务    // cosSDK初始化  const cosInst = new COS({      SecretId: SECRET_ID,      SecretKey: SECRET_KEY  })    //  配置邮件信息  const transporter = nodemailer.createTransport(mailerData)    // 暂时解决cosSDK-getObject不支持promise的问题  cosInst.getObjectPromise = function (params) {      return new Promise((resolve, reject) => {          cosInst.getObject(params, function (err, data) {              if (err) {                  reject(err)              } else {                  resolve(data)              }          })      })  }    // 暂时解决cosSDK-putObject不支持promise的问题  cosInst.putObjectPromise = function (params) {      return new Promise((resolve, reject) => {          cosInst.putObject(params, function (err, data) {              if (err) {                  reject(err)              } else {                  resolve(data)              }          })      })  }    //  请求ZB平台数据的API接口  const GetData = async (type) => {      return new Promise(async (resolve, reject) => {          let options = {              uri: `http://api.zb.plus/data/v1/ticker?market=${type}`,              qs: {}          }          let res = await rq(options)          resolve(res)      })  }    const notice_fun = (params) => {      return new Promise(async (resolve, reject) => {          //  新建重写数据          await cosInst.putObjectPromise({              Bucket: BUCKET,              Region: REGION,              Key: 'data.json',              Body: fs.createReadStream(`/tmp/data.json`)          })          //  发送邮件          await transporter.sendMail(params)      })  }    exports.main_handler = async (event, context, callback) => {      //  交易对名称拼接,调用方法请求最新交易对数据      let data = await GetData(Transaction.join('_'))      // 往缓存写入最新的交易对数据      await fs.writeFileSync(`/tmp/data.json`, data)      // 获取储存在cos的旧交易对数据      let file = await cosInst.getObjectPromise({          Bucket: BUCKET,          Region: REGION,          Key: 'data.json'      })      //  解析新旧数据      file = JSON.parse(file['Body'])      data = JSON.parse(data)      //  新旧数据的相差值      let num = parseFloat(data.ticker.last) - parseFloat(file.ticker.last)      //  当相差值大于等于或者小于等于设定的阈值时调用方法储存新数据并发送邮件通知用户      if (num >= Threshold || num <= -Threshold) {          let params = {              from: `"SCF监测${Transaction[0]} ?" <${mailerData.auth.user}>`,              to: toUser,              subject: `【${Transaction[0]}】${num >= Threshold ? '上涨' : '下跌'}了,最新价格${data.ticker.last}`,              text: `最新价格${data.ticker.last},最高价${data.ticker.high},最低价${data.ticker.low},买一价${data.ticker.buy},卖一价${data.ticker.sell},成交量(最近的24小时)${data.ticker.vol}!!`          }          await notice_fun(params)      }      return {code: 1}  }

上传云函数和设置定时触发器

选择和储存桶一样的地域
添加触发方式=>选择定时触发=>选择每1分钟=>保存

然后等待邮件即可

首次邮件提示,之后会根据设定的阈值上下预警,不高于或低于阈值就不会提示

注意:

  1. 云函数和储存桶各自设定的信息和地域一定要对
  2. 腾讯云的SecretId,SecretKey一定填对
  3. 个人QQ邮箱的SMTP信息一定要对
  4. data.json本地创建后要记得上传到储存桶

以上就是本人利用SCF和COS24小时无间断检测数字货币价格并免费通过QQ邮箱预警的使用分享,可能还有别的思路比如通过微信的模板消息推送等等,各位可以随机应变。Github地址