首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SCF VS Code 实践:利用SCF和COS免费24小时监测比特币价格并邮件通知预警】

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

原创
作者头像
YUMCC
修改2020-10-28 17:28:26
1.7K0
修改2020-10-28 17:28:26
举报
文章被收录于专栏:我是前端我是前端

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

语言环境: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. Serverless Framework
  3. 云函数VS Code插件(Tencent Serverless Toolkit for VS Code)

必备资料

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

新建一个本地函数

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

新建一个存储桶(COS)

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

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

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

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

npm i cos-nodejs-sdk-v5 request request-promise nodemailer --save
注意路径,node_modules与函数主文件index.js同层级
注意路径,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 = 'yumcc@qq.com'   // 收件人邮箱
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分钟=>保存

然后等待邮件即可

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

注意:

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新建一个本地函数
  • 新建一个存储桶(COS)
  • 【重要】在编辑器新建一个data.json粘贴下面的数据结构(ZB平台),并上传至刚刚创建好的储存桶
  • 进入函数文件夹通过NPM安装所需要的模块
  • 接下来就是修改代码正文,所有代码都在index.js里面,直接覆盖
  • 上传云函数和设置定时触发器
  • 然后等待邮件即可
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档