LoginSignup
5
5

More than 3 years have passed since last update.

Twitter APIを使って自動でTweetする(2)

Last updated at Posted at 2019-05-07

前回の投稿ではTwitterのAPIからRequest Tokenの取得をするテストコードを作成した。
今回は、そのコードをAWSのLambdaにデプロイし、API Gatewayを設定してAPI Gateway経由でRequest Tokenを取得できるようにする。

Lambda用のコードに修正

Lambdaで実行するために、ハンドラ関数を加える必要がある。ハンドラ関数がAPI Gatewayから呼ばれ、コードが実行される。その際にeventを受け取ることができ、eventには接続元からのリクエストなどが含まれる(今回は使っていないが)。
ハンドラ関数は任意だが、Lambdaの設定と合わせる必要があり、今回は「lambda_handler」としている。

get_request_token.py
import json
import time
import base64
import os
import uuid
import hashlib
import hmac
import urllib.parse
import requests

REQUEST_URL = 'https://api.twitter.com/oauth/request_token'
REQUEST_METHOD = 'POST'
API_KEY = os.environ.get('API_KEY')
API_SECRET = os.environ.get('API_SECRET')
TOKEN_SECRET = ''
CALLBACK_URL = os.environ.get('CALLBACK_URL')
SIGNATURE_METHOD = 'HMAC-SHA1'

def _create_timestamp():
    return str(int(time.time()))

def _create_nonce():
    return str(uuid.uuid4())

def _create_base_string(params: dict):
    string = ''
    for key, val in sorted(params.items()):
        string += key + '=' + val + '&'

    return string.rstrip('&')

def _convert_dict(dict_: dict):
    string = ''
    for key, val in dict_.items():
        string += key + '="' + val + '", '

    return string.rstrip(', ')

def _create_signature(base_string: str):
    base_string = REQUEST_METHOD + '&' + urllib.parse.quote(REQUEST_URL, safe='') + '&' + urllib.parse.quote(base_string, safe='')
    key = API_SECRET + '&' + TOKEN_SECRET
    hashed_string = hmac.new(key.encode(), base_string.encode(), hashlib.sha1)
    return urllib.parse.quote(base64.standard_b64encode(hashed_string.digest()), safe='')

def _create_authorization_params():
    authorization_params = {}
    authorization_params['oauth_timestamp'] = _create_timestamp()
    authorization_params['oauth_consumer_key'] = urllib.parse.quote(API_KEY, safe='')
    authorization_params['oauth_nonce'] = _create_nonce()
    authorization_params['oauth_callback'] = urllib.parse.quote(CALLBACK_URL, safe='')
    authorization_params['oauth_signature_method'] = SIGNATURE_METHOD
    authorization_params['oauth_version'] = '1.0'
    authorization_params['oauth_signature'] = _create_signature(_create_base_string(authorization_params))

    return authorization_params

def _create_authorization_header():
    authorization_header_val = 'OAuth '
    params = _create_authorization_params()
    authorization_header_val += _convert_dict(params)

    return {'Authorization': authorization_header_val}

def _execute():
    headers = _create_authorization_header()

    return requests.post(REQUEST_URL, headers=headers)

def lambda_handler(event, context):

    response_data = _execute()
    return {
        'statusCode': 200,
        'body': response_data.text
    }

Lambda

Lambdaコンソール

  • Lambdaの作成

コンソールにアクセスし、「一から作成」を選択し、適当な関数名を入力し、ランタイム「Python 3.7」を選択して「関数の作成」をクリックする。

lambda-1.png

  • コードとハンドラの設定

コードエントリタイプで「zipファイルをアップロード」を選択し、アップロードボタンをクリックしてデプロイパッケージをアップロードする。
※デプロイパッケージの作成方法は別に説明します。
ハンドラは、「get_request_token.lambda_handler」に設定する。
設定後、右上の「保存」ボタンをクリックし、保存する。

lambda-2.png

  • 環境変数の設定

API_KEY・API_SECRET・CALLBACK_URLは環境変数から取得するようにコーディングしているので、Lambdaの環境変数に設定する必要がある。
これも設定後、右上の「保存ボタン」で保存する。

lambda-3.png

  • デプロイパッケージの作成

今回はサードパーティのrequestsパッケージが必要なため、それを含んだデプロイパッケージを作成する必要がある。作成方法は以下の通り。

mkdir package
cp get_request_token.py package/.
pip install requests -t package/.
cd package
zip -r package.zip *

API Gateway

API Gatewayコンソール

  • API Gatewayの作成

コンソールにアクセスし、「REST」「新しいAPI」を選択し、適当なAPIを入力して「APIの作成」をクリックする。

apigateway-1.PNG

  • リソースの作成

左のペインから「リソース」を選択し、アクションで「リソースの作成」をクリックする。

apigateway-3.PNG

「リソース名」「パス名」を入力し、「リソースの作成」をクリックする。
※ここで設定したパス名がこのAPIにアクセスするためのパスになる。

apigateway-4.PNG

  • メソッドの作成

作成した「リソース」を選択し、アクションで「メソッドの作成」をクリックする。

apigateway-5.PNG

今回はPOSTメソッドでアクセスするので「POST」を選択し、☑をクリックして保存する。

apigateway-7.PNG

統合タイプで「Lambda統合」を選択し、「Lambdaプロキシ統合の使用」にチェックを入れ、Lambda関数は作成したものを指定し、「保存」をクリックする。

apigateway-8.PNG

  • デプロイ

アクションで「APIのデプロイ」を選択し、「デプロイされるステージ」を設定し、「デプロイ」をクリックする。

apigateway-9.PNG
apigateway-10.PNG

デプロイ後、「URL の呼び出し: https://xxxxx.execute-api.<リージョン>.amazonaws.com/<ステージ>」の形式でURLが表示される。
これにパスを付け加えた「https://xxxxx.execute-api.<リージョン>.amazonaws.com/<ステージ>/<パス>」で今回作成したAPIにアクセスできる。

続編で取得したRequest Tokenを使ってTwitterの認証/認可を取得するVueアプリを作成した記事をアップしました。

前回のRequest Token取得についてはこちら

5
5
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
5
5