connpass新着イベントをLINE BotにEverything It's you してみた！


# connpass API
なるものがあります。というわけで、api たたいて LINEDC の新着イベント通知Botを作ってみました。
アドベントカレンダーに空きがあり、どうしても埋めたい衝動に駆られ、何かネタをと思い事前に仕込んでおきました・・笑
connpass api 初めてたたいてみたし、一石二鳥です！

動画は動いている様子をテスト実行したものです。
GASを実行するとスプレッドシートにconnpassイベント情報が3件取得され、それがBotに通知されている様子です。

https://twitter.com/h2m_kinoko/status/1604779843458961408

ということで下記アドベントカレンダー21日目の記事でもあります！

https://qiita.com/advent-calendar/2022/linedc


# ざっくり構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/b66bb51d-70f0-74dc-605d-03713c13a15f.png)


# API の詳細

https://connpass.com/about/api/

`https://connpass.com/api/v1/event/` にリクエスト投げるとそれなりに情報を取得でるっぽい。


:::note warn
※過度な検索やクローリングに対しては、アクセス制限を施す可能性があります。robots.txt を遵守してください。
:::

とありますので、 robots.txt を確認します。

robots.txt をあまり意識したことがなかったのでちょうど良い理解にもなりました。

### [robots.txtって？](https://developers.google.com/search/docs/crawling-indexing/robots/intro?hl=ja)

>robots.txt ファイルとは、検索エンジンのクローラに対して、サイトのどの URL にアクセスしてよいかを伝えるものです。 

とあります。クロールのお作法が書いてあるようです。
connpassサイトの robots.txt は以下のようになってます。


```connpassのrobots.txt
User-agent: *
Crawl-delay: 5
Allow: /
Disallow: /series/optout/
Disallow: /account/
```


| パラメータ | 用途 | 今回の例では |
|:-:|:-|:-|
|User-agent   |ルールの適用対象   |* なので全ユーザー(全てのクローラ)  |
|Crawl-delay   |次のクロールまでの間隔(秒)   |5秒間隔でクロール   |
|Allow   |クロールを許可するディレクトリまたはページで、ルートドメインからの相対パス   |ルート以下を許可   |
|Disallow   |クロールを禁止するディレクトリまたはページで、ルートドメインからの相対パス    |/series/optout/と/account/ は拒否   |

ということで、最低でも5秒はあけてリクエストすることにします。（今回の場合は1日に1回だけですが・・）
リクエスト先も `https://connpass.com/api/v1/event/` だけですね。

# LINEDC グループID を取得

connpass api を見ると、グループに紐づいたイベントを検索できるようですので、まずは LINEDC の グループIDを調べます。

| パラメータ | 項目名 | 型 | 説明 |
|:-:|:-:|:-:|:-:|
|series_id|グループID   |整数   |グループ毎に割り当てられた番号で、ひもづいたイベントを検索します。複数指定可能です|

ダッシュボードなどから分かるのかな？と思ったのですが、それっぽいIDを見つけられなかったので、とりあえず LINEDC のイベントを1件取得してみました。

取得対象のイベントは以下です。まだ見てない方は是非見てみてください！

https://linedevelopercommunity.connpass.com/event/265838/

LINEDC アドベントカレンダーの1日目の記事でもありますので、こちらも参考に。

https://qiita.com/h2m_kinoko/items/4ed881dcfbb8ebc6cb7e

上記イベントIDは URL より `265838` ということがわかりますので、GET リクエストを投げてみます

`https://linedevelopercommunity.connpass.com/event/265838/ `

```
GET https://connpass.com/api/v1/event/?event_id=265838
```

#### レスポンス
<details><summary>（ここをクリック）</summary>

```
{
  "results_start": 1,
  "results_returned": 1,
  "results_available": 1,
  "events": [
    {
      "event_id": 265838,
      "title": "たった30分でできる！？サンタから毎日メッセージが届くLINE Botを作るチャレンジ",
      "catch": "今年のクリスマスは何しようか考えてる親御さんにオススメ　by スペシャルマン & マッシュルーマン",
      "description": "(略)",
      "event_url": "https://linedevelopercommunity.connpass.com/event/265838/",
      "started_at": "2022-11-28T19:00:00+09:00",
      "ended_at": "2022-11-28T20:00:00+09:00",
      "limit": null,
      "hash_tag": "LINEDC",
      "event_type": "participation",
      "accepted": 37,
      "waiting": 0,
      "updated_at": "2022-11-27T22:49:05+09:00",
      "owner_id": 485331,
      "owner_nickname": "linedc_jp",
      "owner_display_name": "linedc_jp",
      "place": "オンライン",
      "address": "オンライン",
      "lat": null,
      "lon": null,
      "series": {
        "id": 7348,
        "title": "LINE Developer Community",
        "url": "https://linedevelopercommunity.connpass.com/"
      }
    }
  ]
}

```

</details>

上記レスポンスの以下の部分

```
"series": {
        "id": 7348,
        "title": "LINE Developer Community",
        "url": "https://linedevelopercommunity.connpass.com/"
      }
```

series id 7348 がLINEDCのグループIDになります。グループのタイトルやURLも取得できてますね。
グループではなく、内部ではシリーズというようですね。

# LINEDC のイベントを取得

細かいパラメータは [connpass api](https://connpass.com/about/api/) を参照いただくとして、開催日が直近3件のイベントを取得してみました。 `order=2` としているのは、開催日順 に取得したいからです。

```
GET https://connpass.com/api/v1/event/?series_id=7348&count=3&order=2
```

#### レスポンス
<details><summary>（ここをクリック）</summary>

```
{
  "results_start": 1,
  "results_returned": 3,
  "results_available": 189,
  "events": [
    {
      "event_id": 265942,
      "title": "【約3年ぶりオフライン会場有り！】LINE Developer Community忘年LT大会",
      "catch": "LINE開発者全員集合！2022年アウトプットの総決算に！登壇者募集中！",
      "description": "（略）",
      "event_url": "https://linedevelopercommunity.connpass.com/event/265942/",
      "started_at": "2022-12-02T19:00:00+09:00",
      "ended_at": "2022-12-02T21:00:00+09:00",
      "limit": null,
      "hash_tag": "LINEDC",
      "event_type": "participation",
      "accepted": 73,
      "waiting": 0,
      "updated_at": "2022-12-02T19:35:16+09:00",
      "owner_id": 485331,
      "owner_nickname": "linedc_jp",
      "owner_display_name": "linedc_jp",
      "place": "コンフォート新宿",
      "address": "東京都新宿区新宿4-3-25　TOKYU REIT新宿ビル 7階",
      "lat": "35.689352900000",
      "lon": "139.704340400000",
      "series": {
        "id": 7348,
        "title": "LINE Developer Community",
        "url": "https://linedevelopercommunity.connpass.com/"
      }
    },
    {
      "event_id": 265838,
      "title": "たった30分でできる！？サンタから毎日メッセージが届くLINE Botを作るチャレンジ",
      "catch": "今年のクリスマスは何しようか考えてる親御さんにオススメ　by スペシャルマン & マッシュルーマン",
      "description": "（略）",
      "event_url": "https://linedevelopercommunity.connpass.com/event/265838/",
      "started_at": "2022-11-28T19:00:00+09:00",
      "ended_at": "2022-11-28T20:00:00+09:00",
      "limit": null,
      "hash_tag": "LINEDC",
      "event_type": "participation",
      "accepted": 37,
      "waiting": 0,
      "updated_at": "2022-11-27T22:49:05+09:00",
      "owner_id": 485331,
      "owner_nickname": "linedc_jp",
      "owner_display_name": "linedc_jp",
      "place": "オンライン",
      "address": "オンライン",
      "lat": null,
      "lon": null,
      "series": {
        "id": 7348,
        "title": "LINE Developer Community",
        "url": "https://linedevelopercommunity.connpass.com/"
      }
    },
    {
      "event_id": 265087,
      "title": "【ハンズオン】Flutter Web X Google App ScriptでLIFFアプリを作ろう",
      "catch": "",
      "description": "（略）",
      "event_url": "https://linedevelopercommunity.connpass.com/event/265087/",
      "started_at": "2022-11-24T19:00:00+09:00",
      "ended_at": "2022-11-24T21:00:00+09:00",
      "limit": null,
      "hash_tag": "LINEDC",
      "event_type": "participation",
      "accepted": 95,
      "waiting": 0,
      "updated_at": "2022-11-24T19:05:14+09:00",
      "owner_id": 485331,
      "owner_nickname": "linedc_jp",
      "owner_display_name": "linedc_jp",
      "place": "オンライン",
      "address": "オンライン",
      "lat": null,
      "lon": null,
      "series": {
        "id": 7348,
        "title": "LINE Developer Community",
        "url": "https://linedevelopercommunity.connpass.com/"
      }
    }
  ]
}

```

</details>


この記事投稿時点の直近3件は以下です。

- [【約3年ぶりオフライン会場有り！】LINE Developer Community忘年LT大会](https://linedevelopercommunity.connpass.com/event/265942/)
- [たった30分でできる！？サンタから毎日メッセージが届くLINE Botを作るチャレンジ
](https://linedevelopercommunity.connpass.com/event/265838/)
- [【ハンズオン】Flutter Web X Google App ScriptでLIFFアプリを作ろう](https://linedevelopercommunity.connpass.com/event/265087/)

レスポンスと一致してますね。

ということで、あとは

1. LINE Bot 作成（Developers console）
1. Google Spreadsheet 作成
1. GAS実装＆トリガー設定

です。 この辺りは参考になりそうな記事がたくさんありますので、そちらを参考にしつつ補足程度に。

# LINE Botの準備（Developers Console)

以下のDevelopers Console にログインし、LINE Bot の準備をします。

https://developers.line.biz/ja/

LINE Bot （Messaging API） の設定をしていきます。以下の記事に手順がありますので、こちらを参考に。

- プロバイダーとチャネルを作成
- ユーザーIDをメモ
- チャネルアクセストークンを発行しメモ
- Bot　をお友達登録

https://qiita.com/h2m_kinoko/items/d55623425415ed2b7f9c

:::note info
今回、ユーザーがBotにメッセージを送信してBotが応答を返すようなことはしないため、Webhook の設定や応答メッセージの設定などは不要です。ユーザーIDとチャネルアクセストークンをメモしておくだけです。
:::

# Google Spreadsheet 作成

今回、デイリーのトリガーにて connpass に新しいイベントが登録されているか？を取得します。
その管理用に Spreadsheet を使っています。この辺りは　LINE x Spreadsheet x GAS の手軽さですね。

#### こんな感じのスプレッドシートを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/1a32acf8-8f61-dea4-bad3-aacacdf02d79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/0b31e503-4bc1-52b8-ccfa-3c4a9cc4e20b.png)


- connpass シート（特に変更は不要）
    - １行目は項目名で、２行目以下に取得したイベント情報が追加されます
- setting シート（要設定）
    - LINEのチャネルアクセストークンやconnpassグループIDなどをセットします
    - 前述の LINE Botの準備（Developers Console) を参考に





# GAS実装

#### ざっくり仕様・処理として

- connpass api を叩いて新着イベント3件を取得
- Bot に一度も通知していなければ、新着イベントとして通知
- 明日開催予定のイベントがあれば、明日開催イベントとして通知
- 過去開催のイベントはスプレッドシートから削除＆通知もしない
- Bot には[カルーセル形式](https://developers.line.biz/ja/docs/messaging-api/message-types/#carousel-template)で通知
- イベントのサムネイルが欲しかったので、各イベントページのHTMLをパースしてサムネイル(og:image)を取得
    - 下図の通り Parser ライブラリを使ってパースしてみました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/5dfdccd6-9edd-db74-966b-536cb6b0ddaa.png)
- トリガーは `getLineDCEvents` 関数を指定します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/a33f9b9a-3a89-642b-20bd-1621aaabe89a.png)

#### ソースは以下にアップしてます

https://github.com/happy2mylife/ConnpassAPI2Line


# ということで

connpass api 使ってサクッとLINEに通知できるのはいいなぁと思いました。今回の内容をLINEDCのイベントでやるのもありかな？？興味ある方は是非以下を or [Twitter](https://twitter.com/h2m_kinoko/) フォローいただければと思います♪

https://linedevelopercommunity.connpass.com/