程式開發

把 LINE Notify 變成匿名提問箱!(上)

到底為什麼這個網站會充斥著 LINE Notify 嗎?我還真希望是業配,但可惜不是。在滿久以前我做了一個 LINE 我自己的小接口,最近莫名其妙被挖出來了,發現好像有人會感興趣。那位挖出來的捧油把它變成一個匿名提問箱,好像是不錯的主題?

這個小專案其實滿簡單,就是轉發請求到 LINE Notify 的 API 上,基於安全理由,不太可能讓使用者直接騷擾(?)LINE Notify,畢竟應該沒人想看到滿滿的垃圾訊息吧。

那麼要做的事情就很明顯了:

  • 前端接受訊息,傳遞至後端
  • 後端進行驗證,轉發到 LINE Notify

這邊驗證將使用 reCaptcha,首先先新增一個網站,進入 reCaptcha 首頁後右上方會有 Admin Console,如果沒有建立過就會自動跳轉,但已有建立過則需要按下新增。

在網域中填入靜態網頁存放的地方,如果是使用 GitHub Pages 可填入 github.io 或 <你的帳號>.github.io 等等。

完成後就會得到兩組鑰匙,先存放到其他地方。

接著到 Google Drive,新增一個 Google Apps Script。(如果不知道該怎麼新增請參考這篇文章)我們將會有兩個主要邏輯:驗證與轉送。

驗證部分,參考 reCaptcha Reference,我們可以知道要呼叫 siteverify,傳遞 Secret 和 Response 兩個參數,其中 Secret 是上一步的密鑰,Response 是使用者傳送的驗證代碼。
接著他會回傳一份 JSON,其中我們只需要 success 就夠了,但如果出問題,提供錯誤訊息或許也不錯。
製作 HTTP 請求的部分,我們可以應用 Google Apps Script 的 UrlFetchApp 服務。
綜合上述,參考 UrlFetchApp 後可以寫出這樣的 Code:


function verify(response) {
var secret = '' / 請放入你的 reCaptcha 認證金鑰 /;

var recaptcha = UrlFetchApp.fetch('https://www.google.com/recaptcha/api/siteverify', {
method: 'POST',
payload: 'secret=' + secret + '&response=' + response
}).getContentText();

var digested = JSON.parse(recaptcha);
if (digested['success']) {
return [true];
} else {
return [false, digested['error-codes']];
}
}

這樣只要傳入使用者的 Response,就可以獲得包含結果與錯誤的陣列。接著進行轉送,參考 LINE Notify 文件可以知道會需要 Token,進入個人頁面並發行個人權杖,並將權杖紀錄。

接著按照文件,我們需要的是傳送 Message(如果有想增加其他功能可自行類推),需要的是組成一個請求,Header 包含權杖,並傳遞 message 參數。而伺服器會透過 HTTP 狀態表明結果。結合以上,可以寫出這樣的 Code:


function forward(message) {
var token = '' / 放入你的 LINE Notify 權杖 /;

var notify = UrlFetchApp.fetch('https://notify-api.line.me/api/notify', {
'method': 'post',
'headers': {
'Authorization': 'Bearer '+ token
},
'payload': 'message=' + message
});

switch(notify.getResponseCode()) {
case 200:
return [true];
case 400:
return [false, 'Unauthorized'];
case 401:
return [false, 'Invalid Accesstoken'];
case 500:
return [false, 'Server Side Error'];
default:
return [false, 'Unexcepted Failed'];
}
}

如此一來,後端兩個主要邏輯就完成了,下一篇我們將把兩個邏輯組合,並製作前端。
下篇:https://limaois.me/archives/51

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *