はじめに
「WebClassで講義情報が更新されても、いちいちWebClassを開かないと分からない…」
「課題の締切や出席確認を忘れがち…」
そんな悩みを解決するために、WebClassの講義情報をLINEで通知するシステムを作りました!
このシステムで実現できること:
- 複数科目の一括管理
- 講義資料や課題、メール、タイムラインの新着情報を1日3回の定刻で通知
- 締切1週間、3日前、1日前の自動リマインダー
このシリーズでは、プログラミング初心者でも同じものを作れるように、ステップ・バイ・ステップで解説していきます。
対象読者
本記事における読者
- 公式LINEの自動応答を実装したい人
このシリーズでの読者
- WebClassを使っている大学生・専門学生
- GmailとLINEアカウントを持っている方
- 課題の締切や講義変更に気づきにくくて困っている人
- プログラミング経験は不問(コピー&ペーストができればOK)
- プログラミングの経験がなくても、自動化に挑戦してみたい人
システム全体像
本シリーズで構築するシステムの構成
Vol.1(本記事): LINE Bot作成 → 自動応答機能
Vol.2: WebClassスクレイピング → データ取得
Vol.3: 定期実行設定 → 通知ロジック
Vol.4: エラーハンドリング → 運用最適化
重要な注意事項
※1. スクレイピングは利用規約違反の危険性があります。実際の運用前には必ずスクレイピング使用時の注意点を調べ、対象サイトの利用規約を確認し、適切な利用許可を得てください。
※2. 本シリーズではスクレイピングによる実装方法を解説していますが、WebClassを提供している日本データパシフィック株式会社が公式APIを提供していることが判明しました。より安全で持続可能なソリューションとして、公式APIを利用した実装方法についても別途記事を投稿予定です。
必要なもの
- Googleアカウント(Gmailなど)
- LINEアカウント(普段使っているものでOK)
- PCブラウザ(Chrome推奨)
- Pythonが使える環境(次回以降で使います)
✅ ステップ①:LINE Developersに登録
-
以下にアクセス
LINE Developers
-
LINEアカウントでログイン
-
「プロバイダー」横の「作成」ボタンから新しいプロバイダーを作成
(プロバイダー名:WebClass更新通知
などお好きな名前で)
✅ ステップ②:チャネル(Bot)を作成
-
「LINE公式アカウントを作成する」をタップして、入力項目を記入
- アプリ名:例
WebClass更新通知
- メールアドレス、地域
- 会社・事業者名:例
個人
、tarosuke
など - 業種:
個人
→個人(学生)
- 運用目的や主な使い方は適宜選択
- アプリ名:例
-
作成後、利用規約に同意すると、「LINE Official Account Manager」が開きます
✅ ステップ③:Messaging APIを設定
-
LINE Official Account Managerで以下の設定を行う
-
LINE Developersで設定続行!
-
ステップ①で作ったプロバイダを選択
-
ステップ②で作ったチャネルを選択
-
1番下までスクロールして「チャネルアクセストークン(長期)」を発行 → (例:Mde48fg5da2firf19br)メモ帳などにコピペ保存(ステップ⑤で使用)
-
右の「編集」からLINE Official Account Managerに遷移して「応答メッセージ」と「あいさつメッセージ」を無効に設定する。
-
LINE Developersに戻ってくる
-
1番下までスクロールして「あなたのユーザーID」(例:Ucbd3fer5bj4)をメモ帳などにコピペ保存(ステップ④,⑤で使用)
-
✅ ステップ④:Googleスプレッドシートの作成
-
Googleスプレッドシートのページ にアクセス
-
「空白のスプレッドシート」をクリック
-
題名を「user」に変更
A1のセル(名前ボックス → A1 ):line_user_id
A2のセル(名前ボックス → A2 ):name
B1のセル(名前ボックス → line_user_id ):例Ucbd3fer5bj4 (ステップ③でメモした「あなたのユーザーID」)
B2のセル(名前ボックス → name ):tarosuke -
スプレッドシート内の上タブにある「拡張機能」をクリック
-
このスプレッドシートに紐付けされたGASプロジェクトに飛ばされる。
-
プロジェクト名を「新しいプロジェクト」→「WebClassUpdateChecker」に変更
-
✅ ステップ⑤:GAS(Google Apps Script)の作成
-
GASのページ にアクセスする。
- スプレッドシートに紐付いた「WebClassUpdateChecker」をクリック
- サイドバーの「ライブラリ」の「+」をクリック
スクリプトIDは下記をコピペして検索
1KsjhQa6oymhUiACWsAlFTG_XoN8Pnz4px2ekABPjO4tSMX6xRSQMBicy
バージョンは「32」を選択(動作確認済み) - 左にあるアイコンが縦に連なっているタブの
設定 ボタンをクリックし、「スクリプトプロパティ」に以下の2つを追加する(ステップ③-2でメモしたもの)
プロパティ:LINE_ACCESS_TOKEN, 値:例Mde48fg5da2firf19br
プロパティ:ADMIN_USER_ID, 値:例Ucbd3fer5bj4 - 下記のコードをコピーし、GASにペースト
.gsconst ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("LINE_ACCESS_TOKEN"); const ADMIN_USER_ID = PropertiesService.getScriptProperties().getProperty("ADMIN_USER_ID"); function doPost(e) { try { const event = JSON.parse(e.postData.contents).events[0]; const userId = event.source.userId; if (event.type === 'follow') { const profile = getUserProfile(userId); const displayName = profile ? profile.displayName : '不明なユーザー'; sendPushMessage(ADMIN_USER_ID, `新しい友だちが追加されました!\nユーザー名: ${displayName}\nユーザーID: ${userId}`); return; } // それ以外のメッセージイベント if (event.type === 'message') { const replyToken = event.replyToken; const userMessage = event.message.text; let replyText = ''; if (userMessage === 'ユーザーID') { replyText = `あなたのユーザーIDは ${userId} です。`; } else { replyText = '更新時間は am.7:00, am.12:00, pm.6:00です。'; } replyMessage(replyToken, replyText); } } catch (error) { Logger.log('エラー: ' + error); } } function getUserProfile(userId) { const url = 'https://api.line.me/v2/bot/profile/' + userId; const options = { method: 'get', headers: { Authorization: 'Bearer ' + ACCESS_TOKEN }, muteHttpExceptions: true }; const response = UrlFetchApp.fetch(url, options); if (response.getResponseCode() === 200) { return JSON.parse(response.getContentText()); } else { Logger.log('プロフィール取得失敗: ' + response.getContentText()); return null; } } // 返信用(Reply API) function replyMessage(replyToken, text) { const url = 'https://api.line.me/v2/bot/message/reply'; const payload = JSON.stringify({ replyToken: replyToken, messages: [{ type: 'text', text: text }] }); const options = { method: 'post', contentType: 'application/json', headers: { Authorization: 'Bearer ' + ACCESS_TOKEN }, payload: payload }; UrlFetchApp.fetch(url, options); } // 管理者へ通知(Push API) function sendPushMessage(toUserId, text) { const url = 'https://api.line.me/v2/bot/message/push'; const payload = JSON.stringify({ to: toUserId, messages: [{ type: 'text', text: text }] }); const options = { method: 'post', contentType: 'application/json', headers: { Authorization: 'Bearer ' + ACCESS_TOKEN }, payload: payload }; UrlFetchApp.fetch(url, options); }
✅ ステップ⑥:GAS(Google Apps Script)をデプロイする
- 右上の「デプロイ」をクリック
- 「新しいデプロイ」を選択
- 種類の選択横の
設定 ボタンをクリックし、「ウェブアプリ」を選択
説明:友達登録した人のユーザーIDを管理者に自動送信する。
ウェブアプリ:自分 ( hogehoge@gmail.com )
アクセスできるユーザー:全員
- 右下の「デプロイ」をクリック
-
https://script.google.com/...
のようにURLが発行されるので、コピー - Step③のダミーURLを取得したURLにすり替えて「
検証
」ボタンをクリック - 成功であればいいのですが、失敗した場合はすみませんが調べてください。
-
ここまでの成果物
こんな感じで、友達登録されたらユーザーの名前とID(次回使用する)を管理者に通知されます。また、コードの中で設定したテキストを返すようになっています。
次回予告
Vol.2では、いよいよWebClassからの情報取得に挑戦します!
- Pythonでのスクレイピング基礎
- ログイン認証の突破方法
- 取得データの構造化
お楽しみに!