概要
前回、さくっと作ったQiitaに予約投稿できるツールの利用方法を記事にしましたが、今回は環境構築などの説明をしてみたいと思います。
前回の記事
PythonでQiitaに予約投稿できるツールをさくっと作ってみた(使い方編)
https://qiita.com/kai_kou/items/9129f0cc5249a039d11d
ソースを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
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のアクセストークンなどを指定します。
(略)
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
events:
- schedule: cron(0 * * * ? *)
environment:
(略)
RESERVATION_KEYWORD: "予約投稿:%Y/%m/%d %H:00"
Qiitaアクセストークンの設定
QIITA_ACCESS_TOKEN
でQiitaのアクセストークンを指定します。
限定共有投稿を取得する必要があるため、指定が必須となります。
Qiitaにログインしているなら下記URLから登録ができます。
スコープは「read_qiita」と「write_qiita」が必要になります。
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です。
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です。
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://qiita.com/kai_kou/items/9129f0cc5249a039d11d
まとめ
ライブラリやフレームワークが充実しているので、ちょっとしたツールの実装と環境構築がとても簡単にできるようになって、やりたいことがすぐ形にできて良いですね^^
個人的に活用したいツールなので、機能改善は都度行いたいと考えています。
参考
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://qiita.com/kai_kou/items/9129f0cc5249a039d11d