はじめに
本記事は LoGeek のサークル内 LT 会の登壇資料としても使用します.
技術部分だけ読みたい方は,概要まで読み飛ばしてください.
自己紹介
名前
渡邊陽翔(わたなべはると)
あだ名:wata_haru(わたはる)
所属
- 日本大学文理学部
- 情報科学科
- LoGeek
- 次世代社会研究センター(RINGS)
好きなこと
- アニメ
- 最近見たアニメ
- よふかしのうた
- 炎炎ノ消防隊
- かぐや様は告らせたい
- 東京喰種
- 【推しの子】
- 鬼滅の刃
- 最近見たアニメ
- ゲーム
- 最近やったゲーム
- ゼルダの伝説 ティアーズ オブ ザ キングダム
- 1年半くらいやってるけど全然クリアできない
- ゼルダの伝説 ティアーズ オブ ザ キングダム
- 最近あんまやってないけどハマってたゲーム
- VALORANT
- Minceraft
- 最近やったゲーム
経緯
私が所属しているゼミでは,毎週週報ミーティングを行います.
その前までに,esa で週報記事を投稿する必要があります.
前期が始まってしばらく経ったときに,指導教員から以下のように週報ケツ叩き係を命じられました.
このような形で,ゼミの Discord 内で週報を書いていない人たちにメンションを飛ばします.
たいていときには,私自身もケツ叩きの対象になります.
しかしながら,私には S の素質がありませんでした.
前期の間,毎週ケツ叩きをしていましたが,楽しんで叩くことができずに面倒くさくなってしまいました.
そこで今回,このケツ叩きを自動化するに至りました.
いや,実は自動化できそうだなっていう考え自体は,ケツ叩き係をお願いされた数日後にはもうあったんですけどね.ずっとやるやる言ってやらずにいました...
概要
今回作成したツールは,以下の挙動をする Python コードを GitHub Actions で定期実行するものです.
- esa API v1 を使用して,esa に投稿された記事の一覧から投稿者のスクリーンネームを取得
- あらかじめ作成しておいた esa のスクリーンネームと Discord のユーザー ID との対応表をもとに,スクリーンネームをメンション形式に変換
- Discord の Webhook を利用して,対象メンバーにメンションを飛ばすメッセージを投稿
今回実装したコードはこちらから確認できます.
そもそも esa とは
「まずは気軽に生煮えの情報をチーム内で共有しながら何度も更新し、みんなで徐々に育ていく」という発想で作られた情報共有ツールです.
書き途中(WIP)から仲間と共有して徐々にドキュメントを育て,最終的には適したカテゴリーごとに整理することができます.
引用:esa 公式サイト
記事取得〜 Discord 内でのメンション処理
esa API から記事情報を取得する
https://api.esa.io/v1/teams/[team]/posts
へアクセスし,GET
リクエストを送信します.
返却される記事の一覧の例(esa API の公式ページから引用)
{
"posts": [
{
"number": 1,
"name": "hi!",
"full_name": "日報/2015/05/09/hi! #api #dev",
"wip": true,
"body_md": "# Getting Started",
"body_html": "<h1 id=\"1-0-0\" name=\"1-0-0\">\n<a class=\"anchor\" href=\"#1-0-0\"><i class=\"fa fa-link\"></i><span class=\"hidden\" data-text=\"Getting Started\"> > Getting Started</span></a>Getting Started</h1>\n",
"created_at": "2015-05-09T11:54:50+09:00",
"message": "Add Getting Started section",
"url": "https://docs.esa.io/posts/1",
"updated_at": "2015-05-09T11:54:51+09:00",
"tags": [
"api",
"dev"
],
"category": "日報/2015/05/09",
"revision_number": 1,
"created_by": {
"myself": true,
"name": "Atsuo Fukaya",
"screen_name": "fukayatsu",
"icon": "http://img.esa.io/uploads/production/users/1/icon/thumb_m_402685a258cf2a33c1d6c13a89adec92.png"
},
"updated_by": {
"myself": true,
"name": "Atsuo Fukaya",
"screen_name": "fukayatsu",
"icon": "http://img.esa.io/uploads/production/users/1/icon/thumb_m_402685a258cf2a33c1d6c13a89adec92.png"
}
}
],
"prev_page": null,
"next_page": null,
"total_count": 1,
"page": 1,
"per_page": 20,
"max_per_page": 100
}
これの created_by
要素の screen_name
を取得します.
ユーザーマップ
esa のスクリーンネームと Discord のユーザー ID との対応データ
{
"wata_haru": "<@1234567890123456789>"
}
Discord へのメッセージ投稿
DiscordのWebhook URL へアクセスし,POST
リクエストを送信する.
https://discord.com/api/webhooks/1234567890123456789/...
GitHub Actions を利用した定期実行
GitHub Actoins とは
GitHub が提供しているワークフローを自動化する機能
結果
未投稿者あり
全員投稿済み