【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地址