「AIを利用する」といっても最初から最先端の使い方に到達するのはなかなか大変であろう。「新しい技術」といってもchatGPTが身近に登場したのは昨年の春であるから、もう一年以上が経過している。geminiだったり、copilotだったり、他社が開発した新手のAIやLLMが登場し、ますます状況は複雑化している。そのすべてにわずか1日で追いつくのは不可能である。
ということで、まずはGoogle Classroomの操作から入ろうと思う。そもそもAIをやろうと思ったきっかけも、Google DocumentやGoogle Formsを利用しつつも、その中身は学生たちがAIを使って作成した「答案」を「偽物だ」と見抜き、自力で答案を書く努力をしている学生の答案を正当に評価するなど「適切な採点」を行いたいというものである。もちろん、人力で全ての採点処理をやることは可能だが、それをやると自分自身が消耗し寿命が縮まってしまうため、AIの力を借り、限りなく採点業務を「自動化」したいという野望である。
これまでの経験では、AIを使った答案はどれも大体「似たような」内容になる。そして授業では紹介しなかった概念や授業では導入しなかった専門用語を、さも当たり前かのように、使いこなして多用する傾向がある。こういう答案を「書いた」学生本人が、その中身を理解していないことは明らかである。この部分をAIに検知してもらい、似たような答案を束ねて整理分類してもらいたいのである。
この目標のためにまず身に付けなくてはならないのが、Google Workspaceと呼ばれる(以前はG-suiteと呼ばれていた)クラウドアプリ群で作成したファイルの操作(作成、閲覧、複製、ファイル形式変換、保存)である。このタスクをこなすためのVisual Basicのようなスクリプト(マクロと呼ばれていたこともある)に対応するのがGAS(Google Apps Script)である。しかし、GAS自体もクラウドアプリなので、通信環境によっては作動に不安定性があったり、練習問題が少なく具体的なコーディングの仕方が分かりにくかったりで、なかなか敷居の高いプログラミング言語である。文法はjavascriptに準拠しているそうだが、Google Classroomの機能を操作するためのクラスやメソッドは特異なものであり汎用的ではない。したがって、改めて勉強し直すのが面倒という側面もある。いずれにせよ、とにかく「とっつきにくい」のだ。という言い訳をたらたら書き連ねて、自分自身がやらない理由としているのも、また真理である(笑)。
ということで、今回は、GASを迂回して、なんとか外側から操作できないかと思い、いろいろ調べてみたのである。するとpythonを利用し、Google APIを経由して、Google Classroomを操作できる可能性が浮上したのである。
Google Classroom API
Googleが提供するAPIは多種多様であるが、Goolgle Workspaceに関するものだけでも10種近くある。今回利用するのはClassroom APIというもので、Google Classroomという授業援用クラウドアプリを操作するためのweb-APIである。つまり、手持ちのローカルコードから(自分で書いてもいいし、汎用コードを借用してもいい)、Googleのサーバーにネットワークを介して接続し、必要な処理をGoogleサーバーにやってもらって、その結果を受け取る、というクラウドサービスである。javaなど様々なプログラミング言語を利用してプログラミングすることができるが、文法のシンプルさを考えるとpythonで書くのが(いまは)ベストではないかと思う。
Google Classroom APIについての解説書はこちらから閲覧できる。
解説書を最初から読み込んでいってもいいだろうが、Googleの提供する文書というのは非常に読みにくいので、あまりお勧めしない。Honda CIVICのナビゲーションシステムに採用されているGoogle buit-inについての説明書も非常に読みにくかった。原理的なことはすっ飛ばして、Quick Startから始めるのがいいと思う。使っているうちに慣れてきて、導入部で「丁寧に」書かれている(面倒臭い)概念が少しずつ理解できるようになってくる。
ということで、最初に試したのが次のコードである。これはこちらのHPからダウンロード(コピー)できる。正直、コードの中身の詳細に関しては「ほぼ訳わからん」状態であるが、とにかくこれが動けばわかってくることが増えてくるはずである。
import os.path from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.errors import HttpError # If modifying these scopes, delete the file token.json. SCOPES = ["https://www.googleapis.com/auth/classroom.courses.readonly"] def main(): """Shows basic usage of the Classroom API. Prints the names of the first 10 courses the user has access to. """ creds = None # The file token.json stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists("token.json"): creds = Credentials.from_authorized_user_file("token.json", SCOPES) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( "credentials.json", SCOPES ) creds = flow.run_local_server(port=0) # Save the credentials for the next run with open("token.json", "w") as token: token.write(creds.to_json()) try: service = build("classroom", "v1", credentials=creds) # Call the Classroom API results = service.courses().list(pageSize=10).execute() courses = results.get("courses", []) if not courses: print("No courses found.") return # Prints the names of the first 10 courses. print("Courses:") for course in courses: print(course["name"]) except HttpError as error: print(f"An error occurred: {error}") if __name__ == "__main__": main()
Googleが用意したClassroom APIを操作するための様々なライブラリをコードの冒頭で読み込んでいるが、これはpipでインストールすることになるはずである。
いきなりこのコードを走らせようとしてもエラーメッセージがたくさん出るだけでなにも処理してくれない。APIを利用するためには前処理が色々と必要となるようだ。この部分がGASの設定と同様に非常に面倒臭かった。おそらく、この前処理のところで挫折してしまう人は結構多いのではないかと感じた次第である(私自身も危うく挫折してしまう寸前まで追い込まれた)。
上にリンクを与えた「解説文」に従って前処理を行えば、このコードはexecutableとなり、実行結果は自分自身が管理しているClassroomのリストが生成される(複数のClassroomを生成してある場合は直近の10個がリストアップされる)。しかし、この「解説文」がなんとも面倒で分かりにくいのである(Google built-inに引き続き、またもやである...)。また、ネット上に散らばる「解説文」も無駄な情報や無意味な情報などが混在しており、非常に困惑してしまった。
最初の壁は「Google Cloudプロジェクトの設定」である。Google workspaceはクラウドアプリの集合体であるから、兎にも角にもGoogle Cloudの使用許可をまずは得ないといけないらしいのである。
Google Cloudのプロジェクト設定
Googleを使って"Google Cloud"を検索してみると(「ググって」みると)、次のようなHPが最初に目に飛び込んでくる。
HPには「無料で利用できるパッケージがある」とあるので、喜び勇んで「無料で開始」ボタンを押して飛び込むと、「ステップ2/2」のところで「お支払い方法」の箇所を記入するように促される。「無料ではあるが認証のためにクレジットカードの情報を念のために入力してください」と要求してくるのである。このステップはどうしてもスキップできない。仕方ないので、カード番号と有効期限などを入力し、「さあ使わせてくださいよ」と期待に胸を膨らませて画面が変わるのを待っていると、なにかが変である。「お支払い方法」の部分がクリアにならないのだ。再度クリックしてみると、入力したカード情報はちゃんと受理されているらしく、Visaやマスターカードのアイコンが画面に現れている。しかし、どうも色が薄い。つまり「審査中」だという訳である。審査には数分かかるだろうと思い、5分待ち、10分待ち、そしてついに30分が経過したが、まったく審査受理されない。アイコンの色は「半透明の薄いまま(お化け状態)」である。
「これは何かがおかしい」と思い、一旦google cloudの画面を離れ、google accountの個人情報のセクションに入って「お支払い方法」の情報を確認してみることにした。すると入力したクレジッドカードの項目に、「認証待ち」のような判子風ラベルがついているではないか!クリックして詳細を確認してみると、「更なる認証要素が必要。クレジットカードの画像を送るか、運転免許など顔写真付きの身分証明書の写真をネット経由で送れ」という指示ができた(驚)。これではまるでフィリピンあたりに潜伏している詐欺集団の手口とそっくりではないか。個人情報がこれ以上漏れるのは嫌である。特にそれがGoogle相手となるとなおさらである。Google cloudへの登録は諦めることにした。そしてそれはGoogle Classroom APIの利用を諦めることになると最初は思った(しかしそうではなかったことが後で判明する)。
APIやネットサービスなど素晴らしい商品を提供してくれるGoogleではあるが、そのビジネスモデルに関しては反感ももっている。特に、個人情報の収集に「がっつく姿勢」が気に食わない。かつてGoogleが提供していた別のサービスで煮湯を飲まされた経験もあり、基本的にGoogleの使用/利用は慎重にやるようにしている。しかし、私が所属する大学ではGoogle Classroomをコロナ禍のオンライン講義で採用したこともあり、現在では講義を行う際の重要な「仕事道具」になってしまった。使わないようにするのは困難で、むしろ積極的に利用した方が生活が楽になる。ということで、一見矛盾する対応を取ることにしている。これは自然破壊を助長する高速道路の延長には反対ではあるが、できてしまった高速道路は(泣きながら)積極的に利用するという態度と似ているだろう。「複天一流」の極意は、宮本武蔵の「使えるものは全て使い切る」という思想に基づいているからである。
大学が提供してくれたGoogle Accountの契約内容
APIの利用は諦めて、GASへ戻ることも考えたが、よく考えると大学の講義で利用するために作ったGoogle Accountである。クレジットカードの登録はGoogleサービス利用の対価支払いのためであって、大学の構成員である教員や学生が個別に行うものではなく大学が一括して対価を支払っているはずである。
この信念をもとに幾つかのサーチをかけてみると、大学のGoogle Accountにログインした状態ならば、Google Cloudの登録システムに直接アクセスできることを発見することができたのである!クレジットカードの情報は打ち込まなくてもいい。この「バックドア」的なHPへのリンクについての説明はnoteにて提供することにしよう。
Google Cloudの設定画面
「バックドア」を使って、Google Cloudの設定画面に進むことができれば、最初に紹介した「解説文」通りの手続きを踏むことで、Google Cloudのプロジェクト登録を実施することができる。さらにそこではAPIの利用許可を得ることができる。
(1) Google CloudでGoogle Classroom APIの使用許可を得る(APIの有効化)
まずは、メイン画面の左側に「列メニュー」が現れるので、その中にある「APIs and Services」にマウスポインタを合わせると現れる、選択項目「Enabled APIs and Services」をクリックする。次に画面上部に現れた検索窓を使って"Classroom API"を検索する。"Google Classroom API"というラベルが表示されるのでクリックする。[Manage]というボタンが現れるのでさらにクリックする(すでに有効化されている場合は「✅API enabled」と表示されているので、その場合はこの先の手続きは不要である)。画面が変わって、ページ上部の行に「■Enable API」というリンクが現れるのでそれをクリックすると、「許可された/有効化された」という確認画面が出て手続き終了となる。
(4) OAuthのBrandingの登録を行う
この手続きはどうして必要なのか、いまひとつ理解できていないが、解説書に「やれ」とあるので、盲目的に従うことにする。 ふたたびGoogle Cloudのメイン画面に戻り、左の列メニューの「APIs and Credentials」にマウスポイントを合わせ、ポップアップしたサブメニューの「OAuth consent screen」を選択する。画面が切り替わるので左の列メニューの「Branding」を選ぶ。必要な項目は3箇所で、App name, User support mail, そしてDevelopler contact Informationのemail addressである。最初のApp nameは適当に"quickstart-practice"などとする。残りの2項目は大学から支給されたgmailアドレスを入力する。この部分の手続きは以上である。
(3)OAuth同意jsonファイルを取得する
Google Cloudでの最後の手続きは、APIを利用するプログラムに組み込む「認証ファイル」の取得である。上に引用したコード中にある"credentials.json"というファイルに相当する。このファイルを(コード実行の前に)取得しておかないと、コードを実行してもエラーが出てしまって先に進めない。解説文ではこの部分の説明がとても貧弱なので、私のようなAPI初心者の方々の多くがこの部分で躓いてしまうだろう。この認証方式は"OAuth"と呼ばれているようであるが、その詳細はまだ理解していない。とにかく、手続きのひとつとして割り切り、(1)Google Cloudのシステムを利用してそのファイルをダウンロードし、(2)次いで実行コードが保存してあるディレクトリに(名前をcredentials.jsonとrenameして)置くのである。
具体的な手順は次のとおりである。まずGoogle Cloudのメイン画面に戻る。左の列メニューの「APIs and Services」にマウスポインタを再び合わせる。ポップアップしたサブメニューのうち、今度は「Credentials」を選択する。画面が切り替わったら、上部に出た行に「+ Create Credentials」というリンクがあるのでそれをクリックする。ポップアップメニューが現れるので、「OAuth clientID」を選択する。切り替わった画面で"Application type"を決めるように要請されるので、私はpython3のコマンドライン実行を考えているので、Desktop Appを選んだ。App nameは適当に命名する(practice_apiみたいな感じ)。[create]ボタン(青色)を押してJasonファイルを発行してもらう。画面が切り替わり、OAuthファイルの項目がリストアップされるので、作成したばかりの項目を選択する。スクロールして画面下側に現れる「ダウンロード」を示す「下向き矢印」のアイコンをクリックするとOAuth用のjsonファイルがダウンロードされる。複雑なファイル名がついているが、"credentials.json"と名前を付け替え、APIを利用しているpythonコード(quickstart.pyという名前で解説文にあり、このブログの最初の方で掲載したもの)を保存していあるディレクトリに移動する。
これでquickstart.pyを起動するまで「後少し」となった!Google cloudを利用した準備はこれで終了である。
pipで必要なライブラリをインストール
最後の手続きは、pythonコード中で利用するAPI処理のためのライブラリのインストールである。これはpipを使って行う。 やり方は解説文にある通りである。pipはローカルな環境に応じてインストールされている場合もあるからpathに気をつける(私の場合は、以前自分でインストールした$HOME/bin/bin/pip3というpython3のローカル環境を利用した)。解説書にあるが、下のコマンドを実行する。
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
すでに説明した通り、私の場合は"pip"の部分を自分のローカル環境に合わせて書き換えた。
これで下準備はすべて終了である!
quickstart.pyを実行
いよいよ実行である。実行するとGoogleによる認証ウィンドウが開くので、大学から支給されたGoogle Accountでログインし、必要な確認事項をすべて許可(allow)する。すると、ターミナル画面に、今学期に開講した講義のGoogle Classroomの項目が10個表示される!たとえば、「物理学入門、線形代数II、情報処理I、...」などといった具合である。
ちなみに、実行までなかなか辿り着けない人は世界中に案外たくさんいるようである。たとえば、「認証画面が表示されず、プログラムが実行されない」などといったトラブル相談はネット上のあちこちで散見される。たとえば、Google Workspaceが提供されているgithub下でのやりとり(下の埋め込みリンク)でその一例が確認できる。
いずれも、Google CloudやGoogle Accountシステムなど、複数のGoogleサービスが複雑に入り組んで理解しにくいこと、そしてその説明文書がわかりにくい点が原因である。また、日本人にとってはAIによる説明文書の自動翻訳の質が悪く、意味が取りにくいのも原因にあると思う。たとえば、Google built-inは「Google搭載」と翻訳されるが、「グーグルビルトイン」と書いてしまった方が、下手に漢字を混ぜた翻訳にするより、誤解しにくいと思う。Google APIの説明文書の見出しについても、「Pythonのクイックスタート」と訳されているが、これだとPythonシステム自体のインストール、実行の話かな、と思ってしまうが、実際には「Pythonのコード内でClassroom APIを利用するためのクイックスタート(はじめの一歩)」という意味である。こういう細かい所のニュアンスが、意外に無駄な時間が費やされてしまう原因となっている気がするのである。
quickstart.pyを実行してみての感想
実行してみて、「自分で操作している」実感がもてた点は大きな収穫であった。その一方で、ライブラリに含まれているクラスやメソッドの種類はとてもたくさんあるように感じられるし、またその手続きも面倒に見える。たとえば、「なぜ講義の出力は10個なのか?」とか、「coursesというオブジェクトは一体どんなクラスに含まれているのか?」とか、すぐにはわからない感じがする(今コードを見返してみたらcourse().list(pageSize=10)というメソッドが見つかった。ここで出力数は制御しているようだ)。
やはり、クラスの定義やインスタンスの生成の手続きが「非常に面倒で複雑そう」に見える。外部プログラムであるpythonから制御ができるのは嬉しいのだが、その分、セキュリティ認証の手続きをコード内に取り込まねばならず、コードの前半が非常に複雑な構造となっている。これは大きなマイナス点である。
ということで、やってみた感想は、「これならGASと同じではないか?」という感想である。GASだとGoogle Classroomの中で実行するのでセキュリティ認証部分のコードは書かなくて済む。もちろん、クラウドアプリなので常にネット接続しないといけないという不利な面もあることは確かだ。しかし、もう一度チャレンジしてみてもいいかも、という気になったのは確かである。