1. 程式人生 > >Serverless 應用開發指南:基於 Serverless 與 Lambda 的微信公共平臺

Serverless 應用開發指南:基於 Serverless 與 Lambda 的微信公共平臺

Serverless 在事件驅動方面具有天然的優勢,其中之一就是聊天機器人。可要做聊天機器人不是一件容易的事,微信和 QQ 都只能用 Hack 的方式進行。

於是,便想到微信公眾號是不是一個更好的選擇。當用戶輸入一個關鍵詞時,做出相應的回覆。總體上來說,他們之間是差不多的。這個時候,就可以開始嘗試一個在線上執行的 Serverless 服務。

在這件事上,有這麼幾個步驟:

  • 建立 Serverless 服務

  • 引入 node-wechat

  • 配置 APP_ID 和 TOKEN 等

  • 配置 Route 53 與 API Gateway

  • 新增微信公眾平號服務

  • 部署

建立 Serverless 服務

首先,讓我們建立我們的服務:

  1. serverless create --template aws-nodejs --path serverless-wechat

這個步驟依舊是這麼的簡單。

引入 node-wechat

然後我找到了 node-wechat 庫,它使用 express 來做路由,示例如下:

  1. const express =require('express');

  2. const app = express();

  3. var wechat =require('wechat');

  4. var config ={

  5.  token:'token',

  6.  appid:'appid',

  7.  encodingAESKey

    :'encodinAESKey',

  8.  checkSignature:true// 可選,預設為true。由於微信公眾平臺介面除錯工具在明文模式下不傳送簽名,所以如要使用該測試工具,請將其設定為false

  9. };

  10. app.use(express.query());

  11. app.use('/wechat', wechat(config,function(req, res,next){

  12. // 微信輸入資訊都在req.weixin上

  13. var message = req.weixin;

  14. if(message.FromUserName==='diaosi'){

  15. // 回覆屌絲(普通回覆)

  16.    res.reply('hehe');

  17. }

  18. }));

上面便是我們的 index.js 檔案。

然後就是使用類似於《Serverless 應用開發指南:Serverless + Express 的 React 服務端渲染》中的方法,使用 aws-serverless-express 來做出一層代理:

  1. const awsServerlessExpress =require('aws-serverless-express');

  2. const app =require('./index');

  3. const server = awsServerlessExpress.createServer(app);

  4. exports.runserver =(event, context)=>{

  5.   console.log("EVENT: "+ JSON.stringify(event));

  6.   awsServerlessExpress.proxy(server,event, context)

  7. }

接下來就是進行相關的配置。

配置 APP_ID 和 TOKEN 等

首先,修改我們的 index.js 檔案中的配置相關程式碼:

  1. let config ={

  2.  token: process.env.TOKEN,

  3.  appid: process.env.APP_ID,

  4.  encodingAESKey: process.env.AESKey,

  5.  checkSignature:true

  6. };

token、id、encodingAESKey 將從 serverless.yml 檔案中讀取。我們的 serverless.yml 檔案將從另外的檔案中讀取:

  1. functions:

  2.  runserver:

  3.    handler: handler.runserver

  4.    events:

  5. - http: ANY /

  6. - http:'ANY {proxy+}'

  7.    environment:

  8.      TOKEN: ${file(./config.yml):TOKEN}

  9.      APP_ID: ${file(./config.yml):APP_ID}

  10. AESKey: ${file(./config.yml):AESKey}

即從 config.yml 中讀取:

  1. TOKEN: TOKEN

  2. APP_ID: APP_ID

  3. AESKey:AESKey

這是為了確保我們可以保護金鑰的安全。

一切準備就緒,執行:

  1. serverless deploy

就會生成對應的 API:

  1. stack: serverless-wechat-dev

  2. api keys:

  3. None

  4. endpoints:

  5.  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev

  6.  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev/{proxy+}

  7. functions:

  8.  runserver: serverless-wechat-dev-runserver

於是,我將這個地址填到了公眾號後臺,發現公號不支援 API Gateway。只能想辦法使用自定義的域名,隨後就需要使用 Route 53 來建立了。

配置 Route 53 與 API Gateway

如之前在《Serverless 應用開發指南: API Gateway 與 Route53 自定義域名》中所說,按下面的步驟就可以配置 Route 53 了。

在 Route 53 上註冊有域名,如果沒有的話,需要轉到 Route 53。

然後,才能為你的域名請求一個證書

需要選擇的區域是 us-east-1,這個 region 才能與 API Gateway 一起工作。

在這個過程中,需要驗證域名的所有權。所以,你需要先找個地方註冊域名郵箱,如我使用的是網易的域名郵箱。

  1. $ yarn add --dev serverless-domain-manager

或者

  1. $ npm install serverless-domain-manager --save-dev

  1. plugins:

  2. - serverless-domain-manager

  3. custom:

  4.  customDomain:

  5.    domainName: wechat.wdsm.io

  6.    basePath:''

  7.    stage: ${self:provider.stage}

  8.    createRoute53Record:true

  1. serverless create_domain

日誌:

  1. Serverless:Domain was created, may take up to 40 mins to be initialized.

AWS CLI 檢視:

  1. {

  2. "items":[

  3. {

  4. "certificateArn":"arn:aws:acm:us-east-1:706605665335:certificate/278c252a-7aaf-41df-bcf1-adc279347557",

  5. "distributionDomainName":"d1pp7oijqquj95.cloudfront.net",

  6. "certificateUploadDate":1509592737,

  7. "domainName":"wechat.wdsm.io"

  8. }

  9. ]

  10. }

現在,再執行 serverless deploy 就可以完成整個步驟了。

新增微信公眾平號服務

然後,我們可以建立幾個簡單的服務,比如從 Google 搜尋內容:

  1. google(keyword,function(err, res){

  2. let result = R.map(R.compose(updateItemField, R.values, R.pick(['title','link'])))(res.links);

  3.  response.reply('你想要在 Google 上搜索的內容有: '+ result);

  4. });

又或者是,搜尋我部落格的相關內容:

  1. request.get('https://www.phodal.com/api/app/blog_detail/?search='+ keyword,{

  2.  headers:{

  3. 'User-Agent':'google'

  4. }

  5. },function(error, res, body){

  6. if(res.statusCode ===200){

  7. let parsed = JSON.parse(body);

  8. const data = parsed;

  9. var result = R.map(R.compose(updatePhodalItemField, R.values, R.pick(['title','slug'])))(data);

  10.    response.reply({

  11.      content:'在『 phodal.com 』上有 x 個結果,前 10 個如下:'+ result,

  12.      type:'text'

  13. });

  14. }

  15. });

最後程式碼見:https://github.com/phodal/mp/blob/master/index.js

部署

最後,讓我們愉快地執行 serverless deploy,對應的日誌如下:

  1. stack: serverless-wechat-dev

  2. api keys:

  3. None

  4. endpoints:

  5.  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev

  6.  ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev/{proxy+}

  7. functions:

  8.  runserver: serverless-wechat-dev-runserver

  9. ServerlessDomainManagerSummary

  10. DomainName

  11.  wechat.wdsm.io

  12. DistributionDomainName

  13.  d1pp7oijqquj95.cloudfront.net

結果你想用這個服務,那麼只需要:

  1. serverless install -u https://github.com/phodal/mp -mp

執行:

  1. yarn install

再建立你的 config.yml 檔案:

  1. cp config.yml.template config.yml

最後,就可以愉快地部署了。

如果你是為測試,你可以執行 serverless remove 來刪除服務。

最後的效果見我的微信公眾號:

0?wx_fmt=jp   
 
 </div> 
 <div class=

相關推薦

Serverless 應用開發指南基於 Serverless Lambda公共平臺

Serverless 在事件驅動方面具有天然的優勢,其中之一就是聊天機器人。可要做聊天機器人不是一件容易的事,微信和 QQ 都只能用 Hack 的方式進行。 於是,便想到微信公眾號是不是一個更好的選擇。當用戶輸入一個關鍵詞時,做出相應的回覆。總體上來說,他們之間是差不多的。這個時候,就可以開始嘗試一個在

Serverless 架構應用開發指南建立自己的 Serverless 短鏈服務

在想用 Serverless 可以做點什麼簡單的線上應用後,我想到了一個是線上短鏈生成服務。最後的結果見:http://x.pho.im/,一個非常簡單的線上應用。 因為上面的程式碼中,不能自動建立域名。然後,再針對資料庫進行了一些優化。 程式碼邏輯

Swift開發指南使用SwiftCocoa和Objective-C(Swift 4)

與Objective-C API進行互動 互操作性是能夠在任何一個方向上與Swift和Objective-C進行介面,讓您訪問並使用以其他語言的檔案中的一些程式碼。當您開始將Swift整合到應用程式開發工作流程中時,瞭解如何利用互操作性來重新定義、改進和增

公共平臺php語言開發時php用$GLOBALS["HTTP_RAW_POST_DATA"]收不到資訊

今天在用php語言開發微信公眾號後臺時,發現使用以下語句獲取粉絲髮來的資訊時 simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'],'SimpleXMLElement',LIBXML_NOCDATA) 始終收不到資訊,後

公共平臺接入之網頁授權(授權,access_token獲取,獲取信使用者資訊),開發者工具使用,公眾平臺測試號申請接入

1、微信公眾平臺文件入口 2、微信網頁授權 關於網頁授權回撥域名的說明 1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的配置選項中,

現貨!《PHP7實踐指南o2o網站App後臺開發》京東天貓有售

php終於發售了,啥也不想說了,喜歡的或需要的就點擊 鏈接 進去購買吧。另外此書將作為 2017 PHP全球開發者大會 現場活動用書天貓購書包郵 PHP7實踐指南:O2O網站與App後臺開發 數據庫設計 PHP開發工程 適合作為企業內部培訓、培訓機構和大專院校的教學參考書京東購書PHP7實踐指南:O2O網站與

DEVOPS 運維開發系列五基於Django過濾器實現自動化運維平臺功能模組的動態授權管理展示

1、關於Django過濾器 Django中提供了很多內建的過濾器和標籤,我們常用的例如下面這些: block(模板繼承) extends(模板繼承) filter(過濾器) for(迴圈) if(判斷) include(載入模板) 還有很多詳見官網

公眾平臺應用開發方法、技巧案例》下載

2018年11月01日 20:43:25 qq_43580036 閱讀數:2 標籤: 程式設計 資料

[046] 《公眾平臺應用開發方法、技巧案例》火熱預售中...

        在CSDN連續寫了20多篇關於微信公眾平臺開發的教程,受到了廣大讀者的一致好評,幾乎每篇文章的訪問量都過萬,評論都是好幾十,謝謝大家對我的支援、鼓勵和肯定,這讓我更加堅定了寫書的想法。從2013年8月初開始準備,到本書定稿、出版,前後一共用了5個月的時間,現在

【Android應用開發技術基礎構建】命令行下的Android應用開發

star andro all class文件 abs 2.3 pil data 資源 作者:郭孝星 微博:郭孝星的新浪微博 郵箱:[email protected]/* */ 博客:http://blog.csdn.net/allenw

張高興的 Xamarin.Forms 開發筆記為 Android iOS 引入 UWP 風格的漢堡菜單 ( MasterDetailPage )

操作 using eat stp 取消 height 新建 屬性 turn   所謂 UWP 樣式的漢堡菜單,我曾在“張高興的 UWP 開發筆記:漢堡菜單進階”裏說過,也就是使用 Segoe MDL2 Assets 字體作為左側 Icon,並且左側使用填充顏色的矩形用來表示

STM32L476應用開發之一初次使用

芯片 研究 關註 指示燈 今天 nbsp 頻率 技術分享 默認 今天終於收到了期待已久的NUCLEO-F412ZG,感謝電子發燒友論壇!多年以來基本都是在STM32平臺上做一些設計開發工作。但是低功耗的基本沒用過,這次要做便攜式設備才對這方面有所接觸,正好這時電子發燒友論壇

red5 視頻應用開發指南。第二個項目成功運行經驗(2)

ces 連接 con array prop keyset 上線 全局 move 1,第二個項目通過最開始使用書本介紹的red5 1.0.0 ,發現連接的時候總是出現 NetConnection.Connect.Failed undefined 連接出錯,具體代

android開發筆記MainActivity.javaactivity_main.xml

https://www.jianshu.com/p/f5e56fb2f215 剛開始開發android的時候,新建一個activity總是會新建兩個檔案,我們已預設命名MainActivity.java與activity_main.xml兩個檔案來給大家介紹。 activity

開發實戰基於深度學習+maven+SSM+EasyUI的高校共享汽車管理系統(二)

基於深度學習+maven+SSM+EasyUI的高校共享汽車管理系統   繼上一篇 [專案需求分析](https://blog.csdn.net/ITBigGod/article/details/82729233)之後,接下來就是資料庫設計了。      作為一個管理系統,各種資訊表是必

開發實戰基於深度學習+maven+SSM+EasyUI的高校共享汽車管理系統(一)

基於深度學習+maven+SSM+EasyUI的高校共享汽車管理系統 1.專案簡介   在現在,共享汽車在中國各地方開始熱起來,於是本人想做一個基於maven+SSM+EasyUI的高校共享汽車管理系統,當然該專案是博主本人2019年的畢業設計,除了javaweb部分,本專案還

《深入應用C++11程式碼優化工程級應用》勘誤表

轉自:http://www.cnblogs.com/qicosmos/p/4562174.html   整理一下吧,原文好亂。。。。。。。。。。。。。。。   page 4, 倒數第9,10行註釋中的變數名e和f應該改為g和h   page16,

開發實戰基於maven+SSM+EasyUI的高校共享汽車管理系統(二)

基於maven+SSM+EasyUI的高校共享汽車管理系統   繼上一篇 專案需求分析之後,接下來就是資料庫設計了。      作為一個管理系統,各種資訊表是必不可少的了。一般來說,專案都是開發之前先確定資料庫有哪些表的,但是因為我這個個人思考的畢業設計,

OPC UA Client 開發總結基於open62541

本文記錄使用open62541開發OPC UA 客戶端的一些要點。 測試伺服器: open62541官網可下載各系統版本的庫檔案,經本人測試,windows系統下,x64版本支援win32和x64,也

音視訊開發指南圖片的繪製

在 Android 音視訊開發學習思路 裡面,我們寫到了,想要逐步入門音視訊開發,就需要一步步的去學習整理,並積累。本文是音視訊開發指南的第一篇。 對應的要學習的內容是:在 Android 平臺繪製一張圖片,使用3 種不同的 API,ImageView、SurfaceView、自定義 View。 Im