0
0

More than 3 years have passed since last update.

TwitterAPIをServerlessを使ってLambda + Nodejsで動作させてみた

Posted at

概要

TwitterApiを使ってあれこれしたいと思ったので動かすまでの手順をまとめてみた
Nodejsで作成した理由はなんとなくフロントエンドと同じjavascriptでやれたら楽かなーと思ったぐらいです。

基本セットアップ

ServerlessやNodejsなどのインストールは以前私が書いた記事ですが、こちらが参考になるかと思います。
https://qiita.com/tama0571046/items/cfe262b002f6434b915e

TwitterAPIを使用するまでの流れは記事がたくさんありますので、調べるとすぐに出てくるかと思います。

私が参考にしたサイト
https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/

Serverless

ServerlessをAWSの連携

まずはAWSにログインして[IAM]の[ユーザー]からアクセスキーとシークレットキーを取得してきてserverlessに教えます

sls config credentials --provider aws --key XXXXXXXXXXXX --secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

プロジェクト作成

Serverlessを使ってプロジェクトを作成します。

serverless create --template aws-nodejs --name twitter_server --path twitter_server
cd twitter_server

node_moduleを追加

entry pointだけ変更してあとはそのままEnterでOK

yarn init
> question name (twitter_server): 
> question version (1.0.0): 
> question description: 
> question entry point (index.js): handler.js
> question repository url: 
> question author: 
> question license (MIT): 
> question private: 

twitterモジュールを追加

yarn add twitter

event.jsonの追加

handler.jsのevent引数で取得できます

vim event.json
event.json
{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

handler.jsの修正

Twitter APIのリファレンスを参照して取得したいデータに合わせてコーディングしてください。
https://developer.twitter.com/ja/docs/ads/general/api-reference

なんとなくこんな感じかな。というのを下記に記述します。
もっといいやり方あったら教えて下さい。

handler.js
'use strict';

var Twitter = require('twitter');

// 初期化
var tweet_client = new Twitter({
  consumer_key: '***',
  consumer_secret: '***',
  access_token_key: '***',
  access_token_secret: '***'
});

module.exports.hello = event => {
  if (event.action == 'test') {
    finish(test());
  }
};

function finish (body) {
  if (body) {
    console.log(body);
    return {
      statusCode: 200,
      body: body
    };
  }

  console.log('No Action');
  return {
    statusCode: 500,
    body: 'NoAction'
  };
};

function test () {
  tweet_client.get('statuses/home_timeline', {})
    .then((tweets) => {
      console.log(tweets);
      return tweets;
    })
    .catch((error) => {
      console.log(error);
      return error;
    })
};

function名をhelloから変えたい場合はserverless.ymlも合わせて修正してください
serverless.ymlを修正することでデプロイ先のリージョンなどを変更することもできます

Lambda

デプロイ

serverless deploy -v

デプロイしたfunctionの実行

serverless invoke --function hello -p event.json --log

不必要になったら消すようのコマンド

serverless remove -v

以上です。

所感

Node.jsで複雑なTwitterAPI取得のソースコードは向いてないのかなと思いました。
TwitterAPIで取得するところが非同期処理になるため、await/async地獄になってしまいました。
例えば、APIを使ってリストの一覧を取得してきて、そのデータを使用してリストのメンバーを取得するみたいな処理を書こうとするだけで結構めんどくさかったです。
だったらPythonで書けばよくね!?と思ったので、次はPythonで試してみます。
また、そちらも記事にしていこうと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0