2018年3月20日
【つくってあそぼう】Lambda(Node.js) + LINE Messaging API + Twitter APIで指定したユーザの最新のツイートを取得する。
こんにちは。
本日はAWS Lambda(Node.js)とLINE Messaging API、そしてTwitter APIを使用して、
指定したユーザの最新の投稿をLINE画面上に取得して表示するということをやってみたいと思います。
【対象読者】
・APIを触ってなにかをしてみたいと考えている人。
・AWSを使ってみたい人。
<手順1>
まずはAWSアカウントとTwitter APIアカウントとLINE Developer(Messaging API)アカウントの用意をしてください。
Twitter APIとLINE Developerアカウントに関しては登録して各種キーを用意するだけなので、この辺りの説明は割愛します。
<手順2>
AWS Lambdaの設定を行います。
ちなみにリージョンはどこでも大丈夫です。
強いていうなら登録したリージョン名(ap-northeast-1とか)は忘れないでくださいくらいです。
なぜか私はデフォルトがオハイオになっていました。
無料期間後の料金に変動があるみたいなのでそこは公式を参照されたいですね。
まずはLambda関数の作成から行います。
下記のような感じでいきましょう。
続いて環境変数にLINE Messaging APIとTwitter APIのアクセスキー等を入れていきます。
キーの名前は各APIの名前と同じなのでなんとなくわかると思います。
因みにベタ打ちでも問題ないですが、私の場合Githubでコード管理していたので念のため。
環境変数は
const consumer_key = process.env.CONSUMER_KEY
で呼べます。
コードは後で書くのでこれでLambdaの設定は終わりです。早いですね。
<手順3>
API Gatewayの設定を行います。
API GatewayはLambda自体がエンドポイントを持たないので、
代わりにエンドポイントとなってくれる製品です。
はい。これであとはデプロイすれば終わりです。早いですね。
「アクション->APIのデプロイ」です。
リージョンは自分の登録した地域にしてくださいね。Lambda関数が見つからないので。
これを行うとエンドポイントとなるURLが発行されます。
これをLINEの「Webhook URL」に入力してあげてください。
ついでに接続確認もしてみてください。
<手順4>
ここまできたら後はコードを書いてモジュール群と一緒にZIPにまとめてアップするだけです。
要はLINE Messaging APIとTwitter APIのドキュメントとにらめっこがはじまります。
LINE APIはNode.jsの標準モジュールを使用しています。
Twitter APIはnpmのモジュールを使いました。
モジュールというのは型とか方式を予め用意していてくれてコード内で呼び出すだけでそれが使えちゃう便利なやつってイメージです。
APIはリクエストヘッダとリクエストボディ、レスポンスヘッダとレスポンスボディで構成されます。
リクエストヘッダで宛先を決めてリクエストボディで内容を決める。
レスポンスヘッダでリクエストに応じた返事の宛先が指定されていて、レスポンスボディでリクエストに応じた返事の内容が指定されて返ってくる。
ってイメージで大丈夫だと思います。
従って今回の場合でいうとモジュールはリクエストを書くための手紙の便箋やパソコンのメールソフトってことですね。
そして標準モジュールでLINEにリクエストを送る場合は、
// 標準モジュールを呼び出す。 const https = require('https'); // sendにリクエストヘッダを入れる。 let send = (data, callback) => { // JSONの整形を楽にしてくれます。 let body = JSON.stringify(data); let req = https.request({ hostname: "api.line.me", port: 443, path: "/v2/bot/message/reply", method: "POST", // LINE Messaging APIを使用する場合に必要な情報たちです。 headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(body), "Authorization": process.env.CHANNEL_ACCESS_TOKEN } }); }
こんな感じのヘッダになります。
あとはリクエストボディを作ってあげて下記のように書いてあげれば、
送信されるはずです。
exports.handler = (event, context, callback) => { let message = { // ここに処理を書きます。 } send(message, () => { callback(); }); }
今回はTwitter APIを使用するので以下の処理をどこかに書き足してあげればもう使用できます。
// npmのtwitterモジュールを呼び出します。 const twitter = require('twitter&amp';); // 認証に必要な情報をインスタンス化します。 const twitter_client = new twitter({ consumer_key: process.env.CONSUMER_KEY, consumer_secret: process.env.CONSUMER_SECRET, access_token_key: process.env.ACCESS_TOKEN_KEY, access_token_secret: process.env.ACCESS_TOKEN_SECRET }); // 必要な情報をuser_paramsへ入れます。 let user_params = {count: 1, screen_name: event.events.message.text.slice(0)}; twitter_client.get('statuses/user_timeline', user_params, function(error, tweets, response) { // ここに処理を書きます。 }
これらを抑えて後は処理を書いていけば以下のようになります。
いかがでしょうか。
次もほかのシステムとか作ってみようと思います。