ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。プログラム&ロボット大好きなポンコツが日々の記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

LINEに投稿した画像を取得してEvernoteにメモするボットを作った。

LINE BOT APIを利用したものをいろいろ作ってきているのですが、今回はそのLINE BOT APIであるMessaging APIとEvernoteを組み合わせたものを紹介したいと思います。

以前、Qiitaにも書いたり、昔のブログでも紹介したのですが、あれから進化しまして、今回は画像のメモまでできるようになりました。

それについての紹介と、これまでのボットの機能の紹介をしたいと思います。

 

既存機能:テキストのメモを記録

LINEのメモ用のグループに投稿した文字をEvernoteに記録するというもの。

Qiitaの記事はこちらになります→LINEを送るだけで簡単にEvernoteにメモを残せるLINE BOTを作ってみた。

GASを使った無料運用

サーバーはGoogle Apps Script(以降、GAS)を使っているので、無料で運用しています。

Webhookを受け取って処理するなど、いろいろ使えるので普段いろんなボットやそれ以外でもたくさん使っています。

ちなみに、こんな感じでLINE APIのWebhookを受け取って、処理しています。

/**
 * postされたときの処理
 */
function doPost(e) {
  try {
    var json = JSON.parse(e.postData.contents);
    SpreadsheetApp.openById(spreadsheet_id).getSheetByName('log').getRange(1, 1).setValue(json.toSource());

    switch(json.events[0].type) {
    case 'join':
      push(log_user_id, 'join');
      break;
    case 'message':
      getMessage(json);
      break;
    case 'postback':
      getPostback(json)
      break;
    default:
      push(log_user_id, 'default');
      push(log_user_id, e.postData.contents);
      break;
    }
  } catch (ex) {
    push(log_user_id, 'exception\n' + json.events[0].toSource());
  }
}

getMessage()内で届いたメッセージに対する処理をしたりしています。このスクリプトが自分のプロジェクトではコア部分のシステムになっています。

デバッグのために普段はスプレッドシートのlogというシートにログを残すようにしています。

Evernoteのメール転送機能

Evernoteに記録する方法はEvernoteにメールを転送すると記録してくれる機能を利用しています。

Evernoteの公式の記事はこちらになります→メールを Evernote に保存

GAS利用で簡単にメール転送

GASを使うことで、メールの送信が簡単に利用できます。というのも、GASはGoogleのアカウントに紐付いて実行されています。その実行するGoogleアカウントでメールを送信するのは1行で書くことができます。

MailApp.sendEmail('メール@アドレス', 'タイトル', '本文');

このメール@アドレスのところにEvernoteで指定される転送用メールアドレスを入力することで、簡単にEvernoteにメモすることができます。

結合結果

上で紹介したQiitaの記事にも書きましたが、これを組み合わせるとLINEに投稿した内容をEvernoteに記録することができます。

この内容が

このようにEvernoteに記録されます。

 

追加機能:画像の投稿

さて、今回は画像の投稿もできるようにしました。と言っても実装は簡単だったのでサクッと実装できました。

LINEに投稿した画像を取得する

LINEに画像を投稿すると以下のようなjsonがWebhookにPOSTされます。

{
    "events": [
        {
            "type": "message",
            "replyToken": "0c2334a2df84460123456789",
            "source": {
                "groupId": "C44c960c37d51234567890",
                "userId": "U126bf2123456789012345",
                "type": "group"
            },
            "timestamp": 1524953301489,
            "message": {
                "type": "image",
                "id": "1234567890"
            }
        }
    ]
}

このjsonデータのevents[0].message.typeimageのものが画像になるので、例えば以下のようにswitchで処理を分けるといいかと思います

function getMemoMessage(json) {
  switch(json.events[0].message.type) {
    case 'image':
      // 画像の場合の処理をここに書く 
      break;
    case 'text':
      // 文字列の場合の処理をここに書く
      break;
  }
}

画像の場合は画像データをバイナリとして取得する必要があります。

こちらも簡単、コンテンツを取得するAPIを利用するだけ

GET https://api.line.me/v2/bot/message/{messageId}/content

こちらのmessageIdのところに送られてきたjsonデータに含まれているmessageIdを取り出してこのAPIを叩くだけ。messageIdevents[0].message.idに入っています。

function getImage(messageId) {
  var url = "https://api.line.me/v2/bot/message/" + messageId + "/content";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };

  var options = {
    "method" : "get",
    "headers" : headers,
  };

  return UrlFetchApp.fetch(url, options);    
}

このようにして取得することができます。たったこれだけで、指定したmessageIdの画像データをバイナリデータとして取得することができます。

画像データをメールに添付

あとはLINE APIを叩いて取得した画像データをメールに添付して送信するだけです。ファイルの添付もMailApp.sendEmail()の第4引数のオプションに設定するだけです。

コードで書くと以下のようにプログラムを書けます。

function getMemoMessage(json) {
  switch(json.events[0].message.type) {
    case 'image':
      var data = getImage(json.events[0].message.id);
      var text = '画像メモ:'+(new Date());
      MailApp.sendEmail('********.****@m.evernote.com', text.split('\n')[0].slice(0, 200), text,{attachments: [data]});
      break;
    case 'text':
      var text = json.events[0].message.text;
      MailApp.sendEmail('********.****@m.evernote.com', text.split('\n')[0].slice(0, 200), text);
      push('C44c960c37d51234567890', 'φ(..)メモメモ')
      break;
  }
}

結合結果

LINEに画像を投稿して、Webhookで取得したmessageIdを使ってLINEのMessaging APIを使って画像を取得して、それをメールに添付してEvernoteの投稿用メールアドレスに送信するという処理を実装すると以下のような感じになります。

わかりにくいですが、えばーるくんのスクショを送信してみると、

Evernoteに画像が記録されます。

最後に

この記事で紹介したことは、実際にえばーるくんで試すことができるので、こちらの友だち追加ボタンから追加して試してみて下さい。

友だち追加

意外とLINEからEvernoteにメモを残せると便利です。気がつけば1年以上このボットを利用してたくさんのメモを残していました!