1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WebClassの更新をLINEで通知させる! Vol.1 - LINE公式アカウント作成編

Last updated at Posted at 2025-07-08

はじめに

「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に登録

  1. 以下にアクセス
    :point_right: LINE Developers

  2. LINEアカウントでログイン

  3. 「プロバイダー」横の「作成」ボタンから新しいプロバイダーを作成
    (プロバイダー名:WebClass更新通知などお好きな名前で:ok_hand:

    S__23363588.jpg

✅ ステップ②:チャネル(Bot)を作成

  1. 「チャネル設定」タブでは、4つの選択肢(絵付き)があるのでその中の「Messaging API」を選択
    S__23363587.jpg

  2. 「LINE公式アカウントを作成する」をタップして、入力項目を記入

    • アプリ名:例 WebClass更新通知
    • メールアドレス、地域
    • 会社・事業者名:例 個人tarosukeなど
    • 業種:個人個人(学生)
    • 運用目的や主な使い方は適宜選択
  3. 作成後、利用規約に同意すると、「LINE Official Account Manager」が開きます

✅ ステップ③:Messaging APIを設定

  1. LINE Official Account Managerで以下の設定を行う

    • 右上にある :gear: 設定 ボタンをクリックし、設定画面へ
        S__23371781.jpg

    • 左の「Messaging API」タブを選択

    • 「Messaging APIを利用する」をクリック
        S__23371784.jpg

    • 「WebClass更新通知」を選択

    • プライバシーポリシーと利用規約それぞれのサイトのURL →「https://...」の入力を求められるが、「ok」ボタンでスルー

    • 「Webhook URL」には一旦、ダミーURL ( https://example.com ) を入力
      S__23371783.jpg

  2. LINE Developersで設定続行!

    • ステップ①で作ったプロバイダを選択

    • ステップ②で作ったチャネルを選択

    • 「Messaging API設定」タブを開く
      S__23371793.jpg

    • webhookの設定で先ほど入力したダミーURLがあるので,
      その下の「Webhookの利用」 → オン
      S__23371787.jpg

    • 1番下までスクロールして「チャネルアクセストークン(長期)」を発行 → (例:Mde48fg5da2firf19br)メモ帳などにコピペ保存(ステップ⑤で使用)
      S__23371789.jpg

    • 右の「編集」からLINE Official Account Managerに遷移して「応答メッセージ」と「あいさつメッセージ」を無効に設定する。
      S__23371790.jpg

    • LINE Developersに戻ってくる

    • 「チャンネル基本設定」タブを開く
      S__23371794.jpg

    • 1番下までスクロールして「あなたのユーザーID」(例:Ucbd3fer5bj4)をメモ帳などにコピペ保存(ステップ④,⑤で使用)
      S__23371792.jpg

✅ ステップ④:Googleスプレッドシートの作成

  1. Googleスプレッドシートのページ にアクセス
    • 「空白のスプレッドシート」をクリック

    • 題名を「user」に変更
      A1のセル(名前ボックス → A1 ):line_user_id
      A2のセル(名前ボックス → A2 ):name
      B1のセル(名前ボックス → line_user_id ):例Ucbd3fer5bj4 (ステップ③でメモした「あなたのユーザーID」)
      B2のセル(名前ボックス → name ):tarosuke

    • スプレッドシート内の上タブにある「拡張機能」をクリック

    • Apps script を選択
      S__23371795.jpg

    • このスプレッドシートに紐付けされたGASプロジェクトに飛ばされる。

    • プロジェクト名を「新しいプロジェクト」→「WebClassUpdateChecker」に変更

✅ ステップ⑤:GAS(Google Apps Script)の作成

  1. GASのページ にアクセスする。
    • スプレッドシートに紐付いた「WebClassUpdateChecker」をクリック
    • サイドバーの「ライブラリ」の「+」をクリック
      スクリプトIDは下記をコピペして検索
      1KsjhQa6oymhUiACWsAlFTG_XoN8Pnz4px2ekABPjO4tSMX6xRSQMBicy
      バージョンは「32」を選択(動作確認済み)
    • 左にあるアイコンが縦に連なっているタブの :gear: 設定 ボタンをクリックし、「スクリプトプロパティ」に以下の2つを追加する(ステップ③-2でメモしたもの)
      プロパティ:LINE_ACCESS_TOKEN, 値:例Mde48fg5da2firf19br
      プロパティ:ADMIN_USER_ID, 値:例Ucbd3fer5bj4
    • 下記のコードをコピーし、GASにペースト
    .gs
    const 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)をデプロイする

  1. 右上の「デプロイ」をクリック
    • 「新しいデプロイ」を選択
    • 種類の選択横の :gear: 設定 ボタンをクリックし、「ウェブアプリ」を選択
      説明:友達登録した人のユーザーIDを管理者に自動送信する。
      ウェブアプリ:自分 ( hogehoge@gmail.com )
      アクセスできるユーザー:全員
  2. 右下の「デプロイ」をクリック
    • https://script.google.com/...のようにURLが発行されるので、コピー
    • Step③のダミーURLを取得したURLにすり替えて「検証」ボタンをクリック
    • 成功であればいいのですが、失敗した場合はすみませんが調べてください。

ここまでの成果物

こんな感じで、友達登録されたらユーザーの名前とID(次回使用する)を管理者に通知されます。また、コードの中で設定したテキストを返すようになっています。
S__23461899.jpg

次回予告

Vol.2では、いよいよWebClassからの情報取得に挑戦します!

  • Pythonでのスクレイピング基礎
  • ログイン認証の突破方法
  • 取得データの構造化

お楽しみに!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?