自分のQiita記事閲覧数ランキングをAzure Functionsを使ってSlackに通知する

Qiitaの記事が多くなってくると、記事ごとの閲覧数を見るのが大変になってきました。
Qiita API、Azure Functions、Azure Automationを使って、Qiita記事閲覧数ランキングを定期的にSlack通知させます。

# 前提

## イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f4dd9aba-6f85-ea20-50e0-c7ab19282fd0.png)

## ローカルPC上でFunctionsの実行環境が整っていること
まとめた記事を書いたので参考にしてください。事前インストールの章ですね。
[Azure FunctionsをJava + VS Codeで試してみた（Maven for Java編）](https://qiita.com/shingo_kawahara/items/435941731cade567218f#%E4%BA%8B%E5%89%8D%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

# Qiitaトークン取得

* Qiitaから[設定]を選択する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c0779eca-a7b8-c57a-75ab-82cc6373eec4.png)

* [アプリケーション]→[新しくトークンを発行する]の順に選択する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/035d92bf-86ee-d8f1-dbe6-efd21b416bdf.png)

* [アクセストークンの説明]に任意の名称を設定、スコープは[read_qiita]のみにチェックして発行する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0ed08074-51d2-865a-2a98-c968b852d9d3.png)

* トークンが発行されるのでメモしておく。

# Azure Functions実装

次にFunctionsを実装していきます。
コードは以下に配置しています。

[Qiita-Views-Count-API-Sample](https://github.com/shingo-kawahara/Qiita-Views-Count-API-Sample)

## git clone

* git cloneでリポジトリを持ってくる。

```
git clone https://github.com/shingo-kawahara/Qiita-Views-Count-API-Sample.git
```

## pom.xml修正

* pom.xmlを開いて、2箇所修正します。
    * functionAppName： これはFunction Appの名前になります。
    * functionResourceGroup： これはFunction Appが配置されるリソースグループ名です。

```
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <azure.functions.maven.plugin.version>1.3.1</azure.functions.maven.plugin.version>
        <azure.functions.java.library.version>1.3.0</azure.functions.java.library.version>
        <functionAppName>qiita-views-count-api-sample</functionAppName>
        <functionAppRegion>japaneast</functionAppRegion>
        <stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
        <functionResourceGroup>Qiita-Views-Count-API-Sample</functionResourceGroup>
    </properties>
```

## local.settings.json配置

* 新規ファイル作成する。
* ローカルPCでテストするとき、もしネットワーク上にProxyサーバがいる場合は、このファイルにIDとパスワードを設定します。

```
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": "",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "proxyHost": "Your Proxy HostName",
    "proxyPort": "Your Proxy Port",
    "proxyUser": "Your Proxy UserName",
    "ProxyPass": "Your Proxy Password"
  }
}
```

## ローカルテスト

* 以下コマンドを実行して、ビルドとローカル実行をします。

```
mvn clean package
mvn azure-functions:run
```

* Webブラウザを開いて、以下のURLを入力します。

```
http://localhost:7071/api/view?token=[Qiitaトークン]
```

* 自分のQiita記事の一覧が表示されればOKです。

## デプロイ

* 以下コマンドを実行して、Azure上にデプロイします。

```
az login
mvn azure-functions:deploy
```

## テスト

* Webブラウザを開いて、以下のURLを入力します。

```
https://qiita-views-count-api-sample.azurewebsites.net/api/view?token=[Qiitaトークン]
```

* 自分のQiita記事の一覧が表示されればOKです。

# Azure Automation実装

Functions APIの実行は、Automationにさせることにします。
ここはなんでもよくて、オンプレからcronとかで定期実行してもよいです。
Automationアカウントの作成手順は割愛します。

* Runbookの種類は「PowerShell」で、以下のように作成します。

```
Param(
    [parameter(Mandatory=$True)]
    [string] $name,
    [parameter(Mandatory=$True)]
    [string] $token
)

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$outputText = Invoke-WebRequest -Uri "https://qiita-views-count-api-sample.azurewebsites.net/api/view" -Method GET -Body @{token="$token"} -UseBasicParsing | select -ExpandProperty Content

$outputText = $outputText -replace "\n","\n"
$pretext = "$name さんのQiita閲覧数のランキングは..."

$payLoad = '{
    "username":"Qiita閲覧数のお知らせ",
    "channel":"#channel",
    "icon_emoji":":qiita:",
    "attachments": [
        {
            "pretext":"' + $pretext + '",
            "color":"good",
            "text":"' + $outputText + '"
        }
    ]
}'

$payLoadUtf8 = [System.Text.Encoding]::UTF8.GetBytes($payLoad)
Invoke-RestMethod -Uri "https://hooks.slack.com/services/[Slack Incoming Webhook ID]" -Method Post -Body $payLoadUtf8
```

* スケジュール設定をして、定期的にSlack通知されればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6402e878-1d0c-08ff-52ce-3a4e14a72c8b.png)