プロトアウトスタジオの投稿記事、読むのを習慣化するためにLINE BOTを作ってみた。強くなりたいので。

# そもそもの動機

**「強くなりたい」**
史上最強の男にだれでも一度は憧れるものです。
とはいえ、僕は筋力が無ければ、運動神経も悪い、ただの独身男性なので早々と断念しました。
方向性をぐるんと変えて、「妄想を形にできる最強のクリエイター」を目指すことに。
それがきっかけとなり、僕は[プロトアウトスタジオ](https://protoout.studio/)の門を叩いたのでした。

# なぜ習慣化するためのBOTを作るのか

プロトアウトスタジオには[Qiita上](https://qiita.com/organizations/protoout-studio)にメンバーが執筆した記事がたくさん投稿されています。
ので、まずは記事をたくさん読み込んで圧倒的に成長しようと考えたのですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/267f5593-15c4-f7ce-6ad3-31ca1a36d4e5.png)
そして、すぐに挫折することとなりました。
* 「よく投稿されているタグ」があるもののなんの技術もないのでどれを読めばいいか分からない
* 「人気の記事」をひとまず読んでみるも、そこから次の記事に発展していかない

つまり、あまりに記事が多く、かつ取っ掛かりがないので記事を継続して読めなかったのです。
これを受けて、技術の知識がない僕でも毎日読むのを習慣化できるようなBOTを作りたくなりました。

# 必要な機能は

毎日送られてきた記事は必ず読むというルールにすれば、
習慣化され、かつ次第に知識がついていくんじゃないかと考えました。

LINE BOTの機能は下の２つにしました
1. プロトアウトスタジオメンバが投稿した記事からランダムに３つ選択する
2. 毎日決められた時間に記事を送ってくれる

# 完成デモ

<img width="500" alt="IMG_4673.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/d374cf5c-d9f5-6a0f-c559-acfadf0c4a3c.jpeg">

これなら記事選択に迷うことがなさそうです。
ちなみに送ってくれた記事はこちら
1. [スクールに通ったら意識はどうなる？Word2Vecで調べてみた](https://qiita.com/suo-takefumi/items/14c73baa7a0cce300526)
2. [暑くなったらクーラーをつけるよう呼びかけ熱中症予防する](https://qiita.com/naokiuc/items/171fee6d2b8503a2f0e0)
3. [ド素人がプロトタイピングスクールに入ったらどうなったか＆宿題公開](https://qiita.com/hiromae0213/items/3f398da78db6c6c0d951)

# 環境

Visual Studio Code　v1.71.0
node v18.8.0
@line/bot-sdk

# 制作①：LINE BOTアカウントを作成する

[LINE公式アカウントの作成 / LINE Botの初め方](https://zenn.dev/protoout/articles/16-line-bot-setup)
▲こちらの記事を参考に、まずLINE BOTアカウントを作成

<img width="500" alt="IMG_4676.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281755/60d4339f-7c92-6852-5c27-e2825d27ff26.jpeg">

(友達に、、、なって、、、、)

# 制作②：Node.jsでQiita APIを使ってみる

「プロトアウトスタジオ」で検索してヒットした記事を格納する
```JavaScript:記事格納
let responses = await axios.get('https://qiita.com/api/v2/items?per_page=50&&query='+ encodeURIComponent("プロトアウトスタジオ"));
```


記事件数分のランダムな数値が格納された配列を作成する
```JavaScript:ランダム配列
        var randoms = [];
        var min = 1, max = 49;
       
        for(i = min; i <= max; i++){
          while(true){
            var tmp = intRandom(min, max);
            if(!randoms.includes(tmp)){
              randoms.push(tmp);
              break;
            }
          }
        }
       
        function intRandom(min, max){
          return Math.floor( Math.random() * (max - min + 1)) + min;
        }
```

配列の数値を使って、ランダムに記事を３つプッシュメッセージする
```JavaScript:PushMessages
        for(let i = 0; i<3; i++){
         let num = randoms[i];
         

         const messages = [{
            type: 'text',
            text: `${responses.data[num].title} \n ${responses.data[num].url}`
        }];

        try {
            const res = await client.broadcast(messages);
            console.log(res);
        } catch (error) {
            console.log(`エラー: ${error.statusMessage}`);
            console.log(error.originalError.response.data);
        }
       }
```
# 終わりに

本当は、毎日早朝にランダム記事を送ってくれる機能を実装したかったのですが実現せず、、、
近いうちに実装して、習慣化を図りたいと思います。強くなりたいので。

最後に現状のコードを全文載せておきます。
今日も読んでいただいてありがとうございます。

# サンプルコード全文
```JavaScript:全文
const line = require('@line/bot-sdk');
const axios = require('axios');

const config = {
    channelSecret: '＊＊＊＊＊＊＊＊＊＊＊＊＊',
    channelAccessToken: '＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊'
};

const client = new line.Client(config);

const main = async () => {

  const messages = [{
    type: 'text',
    text: "おはよう！今日もいってみよー！"
}];

try {
    const res = await client.broadcast(messages);
    console.log(res);
} catch (error) {
    console.log(`エラー: ${error.statusMessage}`);
    console.log(error.originalError.response.data);
}
       
       
         let responses = await axios.get('https://qiita.com/api/v2/items?per_page=50&&query='+ encodeURIComponent("プロトアウトスタジオ"));

         var randoms = [];
         var min = 1, max = 49;
        
         for(i = min; i <= max; i++){
           while(true){
             var tmp = intRandom(min, max);
             if(!randoms.includes(tmp)){
               randoms.push(tmp);
               break;
             }
           }
         }
        
         function intRandom(min, max){
           return Math.floor( Math.random() * (max - min + 1)) + min;
         }
         
       for(let i = 0; i<3; i++){
         let num = randoms[i];
         

         const messages = [{
            type: 'text',
            text: `${responses.data[num].title} \n ${responses.data[num].url}`
        }];

        try {
            const res = await client.broadcast(messages);
            console.log(res);
        } catch (error) {
            console.log(`エラー: ${error.statusMessage}`);
            console.log(error.originalError.response.data);
        }
       }
}

main();
```