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

## 概要

前回、さくっと作った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


### 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からソースを取得します。

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

### ファイル構成の確認

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

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

### serverlessのインストール

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

```sh
> npm install -g serverless
> npm install
```

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

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

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

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

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

### serverless.ymlの編集

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

```yaml: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

```yaml: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」が必要になります。


```yaml: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です。

```yaml: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です。

```yaml: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へのデプロイ

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


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

<img width="1229" alt="スクリーンショット 2018-11-05 17.54.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/404b977d-25e3-8e57-9ce8-276f3c6a2af1.png">

<img width="1238" alt="スクリーンショット_2018-11-05_17_55_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/a5d01b70-8119-8615-cc63-ccae21e82f5f.png">


もしお試ししただけで、すぐに環境を削除したい。という場合は、```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