LINE push messageについて
これを作るといつも悩む。どこに悩むって、userid/groupidの取得。
おそらく、本来はpush messageは対話型botで利用されるものだからだと思うんだけど。一方的にシステム側からpushするタイプと相性が悪い。
Webhook URL
これが、localhostが指定できない。
コンソールの[チャネル基本設定]ページにWebhook URLを入力します。
[Webhook送信]を選択してWebhookを有効にします(注:デフォルトではオフに設定されています)。
設定したWebhook URLでWebhookイベントを受け取れることを確認するため、[接続確認]ボタンをクリックし、「成功しました。」というメッセージが表示されるか確認します。
なので、もし正攻法でやるとすると、いちいちsslのドメインをとって、デプロイして、動作確認しないと行けない。なので、google app scriptでサービスを作ってuser idを取得して動作確認することになる。
google app scriptの有効活用
google app script 役に立つ。httpsのwebサービスを速攻で作れるので、これで受け取る。コードはこんな感じ。
function doPost(e) {
console.log(e.postData.contents);
// WebHookで受信した応答用Token
var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
// ユーザーのメッセージを取得
var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
// 応答メッセージ用のAPI URL
var url = 'https://api.line.me/v2/bot/message/reply';
UrlFetchApp.fetch(url, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + access_token,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': 'text',
}],
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
console.logが超便利で、これでログも見れる。
なんかもう少し簡単に作る方法ないものかねえ。
これさえとれればgolangはめっちゃ単純。
func NewNotifyer(config *env.Config) (*Notifyer, error) {
n := Notifyer{}
var err error
n.line, err = linebot.New(config.Secret, config.Token)
if err != nil {
return &n, err
}
n.ID = config.ID
n.PUBLICID = config.PUBLICID
return &n, nil
}
func (n *Notifyer) Notify(message string) {
log.Println(message)
postMessage := linebot.NewTextMessage(message)
_, err := n.line.PushMessage(n.ID, postMessage).Do()
if err != nil {
log.Fatal(err)
}
}