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)
    }
}