概要

前回、さくっと作ったQiitaに予約投稿できるツールの利用方法を記事にしましたが、今回は環境構築などの説明をしてみたいと思います。

前回の記事

PythonでQiitaに予約投稿できるツールをさくっと作ってみた(使い方編)
https://cloudpack.media/44357

ソースをGitHubにアップしています。
https://github.com/kai-kou/qiita-reservation-post

利用したライブラリ

qiita_py

Qiita APIへのアクセスはRequestsを利用しても良かったのですが、Pythonでラッパーを実装・公開されている方がおられたので、それを利用させてもらいました。

Qiita API v2のPythonラッパー実装した
https://qiita.com/petitviolet/items/deda7b66852635264508

ただ、APIのうち、GET /api/v2/authenticated_user/items の実装がなかったので、フォークしています^^

Qiita API v2 ドキュメント
https://qiita.com/api/v2/docs

kai-kou/qiita_py(forked from petitviolet/qiita_py)
https://github.com/kai-kou/qiita_py

slackweb

予約投稿完了後、Slackに通知したかったので利用しています。

satoshi03/slack-python-webhook
https://github.com/satoshi03/slack-python-webhook

下記を参考にさせていただきました。

Python3でslackに投稿する
https://qiita.com/shtnkgm/items/4f0e4dcbb9eb52fdf316

twitter

Qiita APIで記事を投稿すると、Qiitaの[Twitterで共有する]機能が利用できないので、自前でツイートするために利用しています。

sixohsix/twitter
https://github.com/sixohsix/twitter

下記を参考にさせていただきました。

Python3で簡単にtwitterに投稿する
https://qiita.com/shtnkgm/items/cc55be0e09b484ce8e43

Serverless

AWS LambdaへのデプロイはAWS CLIを利用することもできるのですが、若干手間がかかるので、Serverlessを利用しています。

Serverless
https://serverless.com/

下記を参考にさせていただきました。

Serverless FrameworkでAWS Lambda関数を作成する
https://qiita.com/Esfahan/items/736d09f732fa619d2410

環境構築

注意事項

本ツールはさくっと実装したもので、検証もさくっとしかしていません。
ご利用される場合はその点ご了承くださいm(_ _)m

前提

  • Qiita アカウントがある
  • AWS アカウントがある
  • ローカルにnode.js、npmがインストール済み

ソースの取得

GitHubからソースを取得します。

> git clone https://github.com/kai-kou/qiita-reservation-post.git
> cd qiita-reservation-post

ファイル構成の確認

以下のような構成になっています。
実装はsrc/main.py AWS Lmabdaのハンドラーがsrc/handler.py になっています。

.
├── README.md
├── package-lock.json
├── package.json
├── requirements.txt
├── serverless.yml
└── src
    ├── __init__.py
    ├── handler.py
    └── main.py

serverlessのインストール

AWS Lambdaへデプロイするのに、Serverlessをインストールします。

> npm install -g serverless
> npm install

ローカルにAWS CLIがインストールされていない、利用していない場合には、AWS Credentialsの設定が必要になります。

--key--secret にご自身の情報を設定してください。

AWSアクセスキーの取得方法については下記が参考になります。

AWSアクセスキー作成
https://qiita.com/miwato/items/291c7a8c557908de5833

> serverless config credentials --provider aws --key XXXXX --secret XXXXX

serverless.ymlの編集

serverless.yml でQiitaのアクセストークンなどを指定します。

serverless.yml(一部抜粋)

(略)
functions:
  main:
    handler: src/handler.main
    events:
      - schedule: cron(0 * * * ? *)
      # https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html
     environment:
       TZ: Asia/Tokyo
       QIITA_ACCESS_TOKEN: [YOUR_QIITA_ACCESS_TOKEN]
       RESERVATION_KEYWORD: "予約投稿:%Y/%m/%d %H:00"
       #SLACK_WEB_HOOK_URL: [YOUR_SLACK_WEB_HOOK_URL]
       #TWITTER_API_KEY: [YOUR_TWITTER_API_KEY]
       #TWITTER_API_SECRET_KEY: [YOUR_TWITTER_API_SECRET_KEY]
       #TWITTER_ACCESS_TOKEN: [YOUR_TWITTER_ACCESS_TOKEN]
       #TWITTER_ACCESS_TOKEN_SECRET: [YOUR_TWITTER_ACCESS_TOKEN_SECRET]

定期実行の設定

Amazon CloudWatch Eventsを利用して定期実行する頻度を、events で指定しています。
初期値はcron(0 * * * ? *) で1時間に1回実行される設定です。
environment.RESERVATION_KEYWORD と合わせて変更することで、予約投稿のタイミングを調整できると思います。ただし、(要望はないと思いますが、)秒単位での投稿は、厳しいと思います^^

指定方法については下記が参考になります。

Rate または Cron を使用したスケジュール式
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html

serverless.yml(一部抜粋)

events:
      - schedule: cron(0 * * * ? *)
    environment:
       (略)
       RESERVATION_KEYWORD: "予約投稿:%Y/%m/%d %H:00"

Qiitaアクセストークンの設定

QIITA_ACCESS_TOKEN でQiitaのアクセストークンを指定します。
限定共有投稿を取得する必要があるため、指定が必須となります。

Qiitaにログインしているなら下記URLから登録ができます。

https://qiita.com/settings/tokens/new

スコープは「read_qiita」と「write_qiita」が必要になります。

serverless.yml(一部抜粋)

 environment:
      (略)
      QIITA_ACCESS_TOKEN: [YOUR_QIITA_ACCESS_TOKEN]

SlackのIncoming Webhook設定

Slackへの通知にはIncoming Webhookを利用しますので、Webhook URLを指定します。Webhook URLの取得方法は下記記事をご参考ください。

Python3でslackに投稿する
https://qiita.com/shtnkgm/items/4f0e4dcbb9eb52fdf316

Slackへの通知が不要であれば、コメントアウトしたままでOKです。

serverless.yml(一部抜粋)

environment:
       (略)
       #SLACK_WEB_HOOK_URL: [YOUR_SLACK_WEB_HOOK_URL]

Twitter APIの設定

Twitterへツイートする場合、Twitter APIの登録申請が必要になります。申請手順については下記が参考になります。

Twitter API の開発者アカウントに登録申請してみた
https://qiita.com/DanYuya/items/a4c021e65f30ce8e43de

Twitterへのツイートが不要であれば、コメントアウトしたままでOKです。

serverless.yml(一部抜粋)

 environment:
       (略)
       #TWITTER_API_KEY: [YOUR_TWITTER_API_KEY]
       #TWITTER_API_SECRET_KEY: [YOUR_TWITTER_API_SECRET_KEY]
       #TWITTER_ACCESS_TOKEN: [YOUR_TWITTER_ACCESS_TOKEN]
       #TWITTER_ACCESS_TOKEN_SECRET: [YOUR_TWITTER_ACCESS_TOKEN_SECRET]

AWS Lambdaへのデプロイ

設定ができたらデプロイしてみます。

> serverless deploy
(略)
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (1.17 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
(略)
Serverless: Stack update finished...
Service Information
service: qiita-reservation-post
stage: production
region: ap-northeast-1
stack: qiita-reservation-post-production
api keys:
  None
endpoints:
  None
functions:
  main: qiita-reservation-post-production-main

Serverlessが実行に必要な権限設定やイベント登録をよしなにしてくれるので、デプロイが完了するとすでに動作するようになっています。おー便利便利

もしお試ししただけで、すぐに環境を削除したい。という場合は、serverless remove コマンドでデプロイした環境を削除可能です。

環境構築できたら、前回の記事の使い方を参考に、予約投稿してみてください。

PythonでQiitaに予約投稿できるツールをさくっと作ってみた(使い方編)
https://cloudpack.media/44357

まとめ

ライブラリやフレームワークが充実しているので、ちょっとしたツールの実装と環境構築がとても簡単にできるようになって、やりたいことがすぐ形にできて良いですね^^

個人的に活用したいツールなので、機能改善は都度行いたいと考えています。

参考

Qiita API v2のPythonラッパー実装した
https://qiita.com/petitviolet/items/deda7b66852635264508

Qiita API v2 ドキュメント
https://qiita.com/api/v2/docs

Python3でslackに投稿する
https://qiita.com/shtnkgm/items/4f0e4dcbb9eb52fdf316

Python3で簡単にtwitterに投稿する
https://qiita.com/shtnkgm/items/cc55be0e09b484ce8e43

Serverless FrameworkでAWS Lambda関数を作成する
https://qiita.com/Esfahan/items/736d09f732fa619d2410

AWSアクセスキー作成
https://qiita.com/miwato/items/291c7a8c557908de5833

Twitter API の開発者アカウントに登録申請してみた
https://qiita.com/DanYuya/items/a4c021e65f30ce8e43de

PythonでQiitaに予約投稿できるツールをさくっと作ってみた(使い方編)
https://cloudpack.media/44357

元記事はこちら

PythonでQiitaに予約投稿できるツールをさくっと作ってみた(環境構築編)