Azure Functionsで楓さんに関するツイートを自動でファボするアプリ作ってみた

#高垣楓（たかがき　かえで）
「アイドルマスター シンデレラガールズ」の登場人物の1人であり、自分がお気に入りのアイドル。

#このアプリを作成した目的
「楓さんが好きなので、楓さんの画像を見たい。でも、手で検索するのは大変なので自動化しよう！」
という、思い付き。

#流れ
1. Azure FunctionsとGitHubの連携
2. Azure FunctionsのHttpTrigger作成
3. ロジックアプリの作成とFunctionsの連携
4. HttpTriggerの処理作成

#1. Azure FunctionsとGitHubの連携
ソースコードはGitHubで管理したい[1]。

1. GitHubにて[Repository](https://github.com/akashikaikyouohasi/KAEDEfavoriteONAzure/tree/master/HttpTriggerKAEDEfavorite)を作成
2. 新規に作成したAzure Functionsの`プラットホーム機能->コードデプロイ->セットアップ->ソースの選択->GitHubで、作成したRepository`を選択。
3. GitHubからローカルにClone

#2. Azure FunctionsのHttpTrigger作成
GitHubにPushをすると、Azure Functionsにデプロイされるようになっている。
Functionsを作成[1]。

1. Azure上で表示させたい関数名のフォルダ「HttpTriggerKAEDEfavorite」を作成。
2. Functionsの設定となるfunction.jsonと,JavaScriptのソースコードindex.jsを作成
3. COMMIT&PUSH！

Functionsの設定となる`function.json`の中身

```json
{
    "bindings": [
      {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req"
      },
      {
        "type": "http",
        "direction": "out",
        "name": "res"
      }
    ],
    "disabled": false
}
```

#3.ロジックアプリの作成とFunctionsの連携
ロジックアプリにツイート検索させ、Functionsに渡すようにする[2]。

Azureポータルにて、「Logic App」を作成。
作成したロジックアプリから、`開発ツール->新しいツイートが投稿されたら`を選択。
ツイッターの認証をし、以下のように設定。

- 検索テキスト：楓さん
- 間隔：1
- 頻度：時間

以下のように選択し、ロジックアプリで検索したツイートをFunctionsに渡す。
```新しいステップ->アクションの追加->Azure Functions->作成したAzure Functionsの名前->HttpTriggerKAEDEfavorite```

要求本文には、「OriginalTweet」を設定。
「メディアURL」にしないのは、メディア以外も使うかもと思っているため。

これで、ロジックアプリからFunctionsに検索されたツイートが渡されるようになった。

#4. HttpTriggerの処理作成
ロジックアプリから渡されるツイート内容の処理を作成する[2]。

```javascript
module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var Twitter = require('twitter');

    //入力Tweet
    var inputTweet = req;

    context.log('Create client.');
    //Twitterクライアントの作成
    var client = new Twitter({
        consumer_key: process.env.TWITTER_CONSUMER_KEY,
        consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
        access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
        access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
    });
    context.log('Created client!!');

    if('MediaUrls'in inputTweet.body ){
        client.post('favorites/create', {id: inputTweet.body.TweetId}, function(error, tweet, response) {
            if(error) throw error;
            console.log(tweets);  // The favorites.
            console.log(response);  // Raw response object.
        });
    }else{
        context.log('No Media!!');
    }
};
```

ここでは、環境変数を設定しています[2][3][4]。
また、TwitterをJavaScriptから操作できるパッケージを導入しています[2][5][6]。

#完成
やった！完成だということで動かしてみると…
大量にファボされるので、一瞬で止めました（泣）

#問題点
そもそも、シンデレラの楓さんであるかの判別ができていないため、無差別にファボしてしまう。
ここで画像認識を使い、シンデレラの楓さんがであるかが判別できればかっこいい…

#参考
[1][Azure Functions を GitHub と Continuous Integrationして自動デプロイされるようにしてみた](http://tech.guitarrapc.com/entry/2016/04/03/051552#Azure-Functions-の-Continuous-Deployment)
[2][Logic Apps, Azure Functions を使い 全自動ついふぁぼ機をサーバーレスで作った。]
(https://qiita.com/fumiya-kume/items/edc3b01b8143863e4fd4)
[3][Twitter API Key を取得する方法](http://phiary.me/twitter-api-key-get-how-to/)
[4][TwitterのAPIを使用するために必要なキーを取得する手順](http://hello-apis.blogspot.jp/2013/03/twitterapi.html)
[5][Twitter for Node.js](https://www.npmjs.com/package/twitter)
[6][node-twitter ](https://github.com/desmondmorris/node-twitter)