Serverless 應用開發指南:基於 Serverless 與 Lambda 的微信公共平臺
Serverless 在事件驅動方面具有天然的優勢,其中之一就是聊天機器人。可要做聊天機器人不是一件容易的事,微信和 QQ 都只能用 Hack 的方式進行。
於是,便想到微信公眾號是不是一個更好的選擇。當用戶輸入一個關鍵詞時,做出相應的回覆。總體上來說,他們之間是差不多的。這個時候,就可以開始嘗試一個在線上執行的 Serverless 服務。
在這件事上,有這麼幾個步驟:
-
建立 Serverless 服務
-
引入 node-wechat
-
配置 APP_ID 和 TOKEN 等
-
配置 Route 53 與 API Gateway
-
新增微信公眾平號服務
-
部署
建立 Serverless 服務
首先,讓我們建立我們的服務:
serverless create --template aws-nodejs --path serverless-wechat
這個步驟依舊是這麼的簡單。
引入 node-wechat
然後我找到了 node-wechat 庫,它使用 express 來做路由,示例如下:
const express =require('express');
const app = express();
var wechat =require('wechat');
var config ={
token:'token',
appid:'appid',
encodingAESKey
checkSignature:true// 可選,預設為true。由於微信公眾平臺介面除錯工具在明文模式下不傳送簽名,所以如要使用該測試工具,請將其設定為false
};
app.use(express.query());
app.use('/wechat', wechat(config,function(req, res,next){
// 微信輸入資訊都在req.weixin上
var message = req.weixin;
if(message.FromUserName==='diaosi'){
// 回覆屌絲(普通回覆)
res.reply('hehe');
}
}));
上面便是我們的 index.js
檔案。
然後就是使用類似於《Serverless 應用開發指南:Serverless + Express 的 React 服務端渲染》中的方法,使用 aws-serverless-express
來做出一層代理:
const awsServerlessExpress =require('aws-serverless-express');
const app =require('./index');
const server = awsServerlessExpress.createServer(app);
exports.runserver =(event, context)=>{
console.log("EVENT: "+ JSON.stringify(event));
awsServerlessExpress.proxy(server,event, context)
}
接下來就是進行相關的配置。
配置 APP_ID 和 TOKEN 等
首先,修改我們的 index.js
檔案中的配置相關程式碼:
let config ={
token: process.env.TOKEN,
appid: process.env.APP_ID,
encodingAESKey: process.env.AESKey,
checkSignature:true
};
token、id、encodingAESKey 將從 serverless.yml
檔案中讀取。我們的 serverless.yml
檔案將從另外的檔案中讀取:
functions:
runserver:
handler: handler.runserver
events:
- http: ANY /
- http:'ANY {proxy+}'
environment:
TOKEN: ${file(./config.yml):TOKEN}
APP_ID: ${file(./config.yml):APP_ID}
AESKey: ${file(./config.yml):AESKey}
即從 config.yml
中讀取:
TOKEN: TOKEN
APP_ID: APP_ID
AESKey:AESKey
這是為了確保我們可以保護金鑰的安全。
一切準備就緒,執行:
serverless deploy
就會生成對應的 API:
stack: serverless-wechat-dev
api keys:
None
endpoints:
ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev
ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev/{proxy+}
functions:
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 一起工作。
在這個過程中,需要驗證域名的所有權。所以,你需要先找個地方註冊域名郵箱,如我使用的是網易的域名郵箱。
$ yarn add --dev serverless-domain-manager
或者
$ npm install serverless-domain-manager --save-dev
plugins:
- serverless-domain-manager
custom:
customDomain:
domainName: wechat.wdsm.io
basePath:''
stage: ${self:provider.stage}
createRoute53Record:true
serverless create_domain
日誌:
Serverless:Domain was created, may take up to 40 mins to be initialized.
AWS CLI 檢視:
{
"items":[
{
"certificateArn":"arn:aws:acm:us-east-1:706605665335:certificate/278c252a-7aaf-41df-bcf1-adc279347557",
"distributionDomainName":"d1pp7oijqquj95.cloudfront.net",
"certificateUploadDate":1509592737,
"domainName":"wechat.wdsm.io"
}
]
}
現在,再執行 serverless
deploy
就可以完成整個步驟了。
新增微信公眾平號服務
然後,我們可以建立幾個簡單的服務,比如從 Google 搜尋內容:
google(keyword,function(err, res){
let result = R.map(R.compose(updateItemField, R.values, R.pick(['title','link'])))(res.links);
response.reply('你想要在 Google 上搜索的內容有: '+ result);
});
又或者是,搜尋我部落格的相關內容:
request.get('https://www.phodal.com/api/app/blog_detail/?search='+ keyword,{
headers:{
'User-Agent':'google'
}
},function(error, res, body){
if(res.statusCode ===200){
let parsed = JSON.parse(body);
const data = parsed;
var result = R.map(R.compose(updatePhodalItemField, R.values, R.pick(['title','slug'])))(data);
response.reply({
content:'在『 phodal.com 』上有 x 個結果,前 10 個如下:'+ result,
type:'text'
});
}
});
最後程式碼見:https://github.com/phodal/mp/blob/master/index.js
部署
最後,讓我們愉快地執行 serverless
deploy
,對應的日誌如下:
stack: serverless-wechat-dev
api keys:
None
endpoints:
ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev
ANY - https://e8tct5f0v2.execute-api.us-east-1.amazonaws.com/dev/{proxy+}
functions:
runserver: serverless-wechat-dev-runserver
ServerlessDomainManagerSummary
DomainName
wechat.wdsm.io
DistributionDomainName
d1pp7oijqquj95.cloudfront.net
結果你想用這個服務,那麼只需要:
serverless install -u https://github.com/phodal/mp -mp
執行:
yarn install
再建立你的 config.yml
檔案:
cp config.yml.template config.yml
最後,就可以愉快地部署了。
如果你是為測試,你可以執行 serverless
remove
來刪除服務。
最後的效果見我的微信公眾號:
相關推薦
Serverless 應用開發指南:基於 Serverless 與 Lambda 的微信公共平臺
Serverless 在事件驅動方面具有天然的優勢,其中之一就是聊天機器人。可要做聊天機器人不是一件容易的事,微信和 QQ 都只能用 Hack 的方式進行。 於是,便想到微信公眾號是不是一個更好的選擇。當用戶輸入一個關鍵詞時,做出相應的回覆。總體上來說,他們之間是差不多的。這個時候,就可以開始嘗試一個在
Serverless 架構應用開發指南:建立自己的 Serverless 短鏈服務
在想用 Serverless 可以做點什麼簡單的線上應用後,我想到了一個是線上短鏈生成服務。最後的結果見:http://x.pho.im/,一個非常簡單的線上應用。 因為上面的程式碼中,不能自動建立域名。然後,再針對資料庫進行了一些優化。 程式碼邏輯
Swift開發指南:使用Swift與Cocoa和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.java與activity_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