Server醬加雲函式實現留言監控
本部落格的留言板功能過於簡單,只能留言,無法做到訊息提醒
由於是純靜態網站,想再增強下留言板功能還是有辦法的,可以實現有新留言推送到自己的微信上,需要用到 Server 醬和騰訊雲的雲函式
Server 醬:利用微信服務號的模板訊息做訊息推送的服務,免費
雲函式:騰訊雲的無伺服器雲函式服務,支援各種語言,支援多種觸發方式,免費
Bmob 雲:雲資料庫,本部落格在用的,免費
準備
註冊 Server 醬,閱讀下介面文件,很簡單就是一個 Post 請求
註冊騰訊雲,閱讀下雲函式的文件和部署流程
註冊 Bmob 雲,閱讀 JavaScript 的 SDK 和 REST API 的使用
程式碼
這裡使用 Go 實現
在使用雲服務的時候發現外部傳參無法獲取到,只好將引數在程式碼硬編碼
先安裝下雲函式的 SDK
go get -u github.com/tencentyun/scf-go-lib/cloudfunction
// 引數定義 // BmobTableName : 表名 // Period : 查詢多少分鐘前的資料 const ( BmobAPIURL= "https://api2.bmob.cn/1/classes/" BmobTableName = "Comment" BmobAPPId= "****************" BmobAppKey= "**********************************" PushURL= "https://sc.ftqq.com/********.send" Period= 5 )
使用 Server 醬推送訊息到微信,一個 Post 請求
func notice(title, text string) error { resp, err := http.PostForm(PushURL, url.Values{"desp": {text}, "text": {title}}) if err != nil { return err } defer resp.Body.Close() return nil }
獲取多少分鐘內的留言,使用 Bmob 的 REST API 實現
因為要自定義請求和解析 Json 程式碼有點長,另外吐槽下 Go 的異常處理
部署的過程中出現了 8 小時差的 BUG,統一時區就解決了
func getRecentComment() ([]string, error) { resultList := make([]string, 0) req, _ := http.NewRequest("GET", BmobAPIURL+BmobTableName, nil) // 請求頭 req.Header.Add("Content-Type", "application/json") req.Header.Add("X-Bmob-Application-Id", BmobAPPId) req.Header.Add("X-Bmob-REST-API-Key", BmobAppKey) // 請求引數 q := req.URL.Query() q.Add("order", "-createdAt") // 統一時區,避免8小時差的BUG var cstSh, _ = time.LoadLocation("Asia/Shanghai") // 當前時間減去parms.Period分鐘 sDate := time.Now().In(cstSh).Add(-1 * time.Duration(Period) * time.Minute).Format("2006-01-02 15:04:05") q.Add("where", `{"createdAt":{"$gte":{"__type": "Date", "iso": "`+sDate+`"}}}`) req.URL.RawQuery = q.Encode() client := &http.Client{} resp, err := client.Do(req) if err != nil { return resultList, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return resultList, err } var result map[string]interface{} json.Unmarshal(body, &result) if result["error"] != nil { return resultList, errors.New("返回錯誤結果:" + result["error"].(string)) } list := result["results"].([](interface{})) for _, v := range list { detail := v.(map[string]interface{}) resultList = append(resultList, detail["content"].(string)+"@"+detail["nickName"].(string)) } return resultList, nil }
最後的 main 函式
func main() { cloudfunction.Start(func(ctx context.Context) (string, error) { comments, err := getRecentComment() if err != nil { return "", err } if len(comments) == 0 { return "沒有新訊息", nil } err = notice("您有新的留言", fmt.Sprintf("%v", comments)) if err != nil { return "", err } return fmt.Sprintf("%v", comments), nil }) }
打包部署
使用 Go 的交叉編譯打包 linux 版本,然後打包上傳到騰訊雲函式上
測試通過
最後設定定時任務,每隔五分鐘檢測一次,然後把留言推送到我的微信
總結
想要為靜態部落格加點功能真的是麻煩