Skip to content

Instantly share code, notes, and snippets.

@KMConner
Last active April 12, 2021 00:05
Show Gist options
  • Save KMConner/6589886d4ae19d223f455b7a4ab76dbe to your computer and use it in GitHub Desktop.
Save KMConner/6589886d4ae19d223f455b7a4ab76dbe to your computer and use it in GitHub Desktop.

KULASIS のアプリでの API

通信を解析しただけなので、正確性は保証しかねます。
使用時は自己責任で!

サインイン (トークンの取得)

※どうしてこんなに複雑なのかは不明

  1. https://www.k.kyoto-u.ac.jp/api/app/v1/auth/get_j_session_complete にアクセス
    レスポンスの Body (JSON 形式) の中の jsessionlocation を記録

  2. https://www.k.kyoto-u.ac.jp/secure/student/shibboleth_account_list?keep=true にアクセス
    この時、 www.k.kyoto-u.ac.jp ドメインの Cookie に 1 で得られた JSESSIONID=...cserver=ku_europa 含めてアクセスする

  3. 1 で得られた location の URL にユーザー名、パスワードを POST する。 Content-Typeapplication/x-www-form-urlencoded
    Bodyは j_username=a0000000&j_password=P@ssw0rd&_eventId_proceed= の形式で (最後の _eventId_proceed の意味は不明)
    Cookie には 2 と同じように JSESSSIONID のみセットする。 (Cookie のドメインが authidp1.iimc.kyoto-u.ac.jp なので注意すること)

  4. 3の結果としてかなり長い HTML が返される。ここに含まれる form の中身をし、 name 属性が RelayStateSAMLResponse である input タグの value 属性の値を取得する

  5. 4 で得られた値を https://www.k.kyoto-u.ac.jp/api/app/v1/auth/get_shibboleth_session に POST する。
    Content-Typeapplication/x-www-form-urlencoded とし、 Bodyは RelayState=...&SAMLResponse=...&requestUrl=https%3A%2F%2Fwww.k.kyoto-u.ac.jp%2FShibboleth.sso%2FSAML2%2FPOST の形式で。 それぞれの値は適切にパーセントエンコードされている必要がある。
    Cookie には 2 と同様に JSESSIONID を入れる必要がある。

  6. 最後に、 https://www.k.kyoto-u.ac.jp/secure/student/shibboleth_account_list?keep=true に対して GET リクエストを送信する。
    2 で指定した 2 つの Cookie を指定する必要がある。

  7. 6 へのレスポンスとして accessToken 及び account の含まれた JSON が返ってくるのでそれを認証用に使用する。

注意点

  • Cookie に追加する JSESSIONID は 1 で取得したものを使い続けること。 (レスポンスヘッダの Set-Cookie で指定されたものは無視)

  • 値を POST するときに Content-Type を指定しないと正常に動作しない場合がある

時間割の取得

URLは

https://www.k.kyoto-u.ac.jp/api/app/v1/timetable/get_table

このリクエストで、前期・後期共に時間割を一括で取得できる。

返ってくるフォーマットは以下

{
  "showWhichSemester":"second",
  "timetables":[
  ]
}

showWhichSemester は 2018/12/11 時点では (後期だからと思われるが、 second が入っている。)

timetables の配列には以下の構造のオブジェクトが入っている。 (それぞれの値がその項目の説明)

{
    "departmentMinimalName":"学部の略称",
    "departmentMinimalNameEn":"学部名の略称 (英語)",
    "departmentName":"学部名",
    "departmentNameEn":"学部名 (英語)",
    "departmentNo":"学部の番号? (Number として格納されている)",
    "isLa": "全学共通科目かどうか (bool)",
    "isNew": "KULASIS の時間割の NEW があるかどうか (bool)",
    "isShownOnKouki": "後期の時間割に表示されているか (bool)",
    "isShownOnZenki": "前期の時間割に表示されているか (bool)",
    "isSyutyuSemester": "集中講義かどうか (bool)",
    "lectureName":"講義の名称",
    "lectureNameEn":"講義の名称 (英語)",
    "lectureNo": "講義の番号 (Number)",
    "lectureWeekSchedule":"講義の曜時限 (複数あるときには 月1, 月2 のようにカンマで区切られる。)",
    "lectureWeekScheduleEn":"講義の曜時限 (英語、複数あるときのはカンマ区切り。)",
    "newFamily": (不明),
    "newFamilyEn": (不明),
    "periodNo": "何時限目か (Number, 1-5)",
    "roomName":"講義の教室名",
    "roomNameEn":"講義の教室名 (英語)",
    "semester":"前期か後期か",
    "semesterEn":"前期か後期か (英語)",
    "shortTeacherName":"担当教員 (省略形 ?)",
    "shortTeacherNameEn":"担当教員 (省略形 ? 英語)",
    "targetDiscipline":"対象学科",
    "targetDisciplineEn":"対象学科 (英語)",
    "teacherName":"担当教員",
    "teacherNameEn":"担当教員 (英語)",
    "weekdayNo": "曜日 (月曜から順に 1) (Number)"
}

講義の詳細情報の取得

この API に関しては全学共通科目は動作が不明

リクエスト URl

https://www.k.kyoto-u.ac.jp/api/app/v1/support/lecture_detail

リクエストの URL には、認証情報のパラメーターに加えて、取得したい講義の departmentNo 及び lectureNo を含める必要がある。

返ってくるオブジェクトは以下の通り

{
    "departmentMinimalName":"学部名",
    "departmentMinimalNameEn":"学部名 (英語)",
    "departmentNo": "学部の番号 (Number)",
    "isCourseMailChanged": "新しい授業連絡メールがあるかどうか (bool)",
    "isLa": "全学共通科目かどうか ? (bool)",
    "isLectureMaterialChanged": "新しい講義資料があるか (bool)",
    "isLectureSupportChanged": "不明 (bool)",
    "isReportChanged": "新しいレポート情報があるか (bool)",
    "lectureCode":"講義番号",
    "lectureName":"講義名",
    "lectureNameEn":"講義名 (英語)",
    "lectureNo":"講義番号 (リクエストと同じもの、 lectureCode との使い分けは不明) (Number)",
    "lectureWeekSchedule":"講義の曜時限",
    "lectureWeekScheduleEn":"講義の曜時限 (英語)",
    "newFamily":"不明",
    "newFamilyEn":"不明",
    "oldFamily":"不明",
    "oldFamilyEn":"不明",
    "pandaURL":"Panda の URL",
    "roomName":"教室名",
    "roomNameEn":"教室名 (英語)",
    "semester":"前期 or 後期",
    "semesterEn":"前期 or 後期 (英語)",
    "syllabusURL":"シラバスの URL",
    "targetDiscipline":"対象学科",
    "targetDisciplineEn":"対象学科 (英語)",
    "teacherName":"教員名",
    "teacherNameEn":"教員名 (英語)"
}

講義資料の一覧の取得

この API に関しては全学共通科目は動作が不明

リクエストする URL

https://www.k.kyoto-u.ac.jp/api/app/v1/support/lecture_material

リクエストの URL には、認証情報のパラメーターに加えて、取得したい講義の departmentNo 及び lectureNo を含める必要がある。

返ってくるオブジェクトは以下

{
   "lectureMaterials": [
   ]
}

また、 lectureMaterials のリストには以下のオブジェクトが含まれる。

{

    "comment":"コメント",
    "commentEn":"コメント (英語)",
    "isNew": "新しいかどうか ? (bool)",
    "lastModifiedAt":"更新日時",
    "lastModifiedAtEn":"更新日時 (英語)",
    "lectureMaterialAttachmentNumbers": "資料の番号のリスト (Number の list)",
    "lectureWeekSchedule":"曜時限",
    "lectureWeekScheduleEn":"曜時限 (英語)",
    "teacherName":"教員名",
    "teacherNameEn":"教員名 (英語)",
    "title":"タイトル",
    "titleEn":"タイトル (英語)"
}

なお、コメント、タイトルは英語のものでも日本語がそのまま設定されていることもある模様。

講義資料のダウンロード

リクエストする URL

https://www.k.kyoto-u.ac.jp/api/app/v1/support/lecture_material_attachment?lectureMateralAttachmentNo=7739&departmentNo=16

リクエストの URL には、認証情報のパラメーターに加えて、ダウンロードしたい資料の departmentNo 及び lectureMateralAttachmentNo を含める必要がある。

レスポンスは以下のような JSON

{
  "contentType":"ファイル形式 (MIME ?)",
  "fileBody":"ファイルの中身 (base64)",
  "fileName":"ファイル名"
}

授業連絡メールの一覧の取得

リクエスト URL

https://www.k.kyoto-u.ac.jp/api/app/v1/support/course_mail_list

リクエストの URL には、認証情報のパラメーターに加えて、取得したい講義の departmentNo 及び lectureNo を含める必要がある。

返ってくるオブジェクト

{
    "courseMails":[
    ]
}

また、 courceMails には以下のようなオブジェクトが含まれる。

{
  "courseMailNo": "連絡メールのメッセージ番号 (Number)",
  "date":"送信日時",
  "dateEn":"送信日時 (英語)",
  "departmentNo":"学部の番号 (Number)",
  "isNew":"新しいかどうか ? (bool)",
  "lectureWeekSchedule":"講義の曜時限",
  "lectureWeekScheduleEn":"講義の曜時限 (英語)",
  "teacherName":"講義の担当教員",
  "teacherNameEn":"講義の担当教員 (英語)",
  "title":"件名",
  "titleEn":"件名 (英語)"
}

件名は英語となっていても日本語がそのまま入ることもある模様。

講義連絡メールの内容の取得

リクエストする URL

https://www.k.kyoto-u.ac.jp/api/app/v1/support/course_mail?departmentNo=16&courseMailNo=6794&accessToken=f0

リクエスト URL には 認証情報の他に departmentNo 及び courseMailNo を含める必要がある。

レスポンスには以下の様なオブジェクトが含まれる。

{
  "date":"送信日時",
  "textBody":"本文",
  "title":"件名"
}

備考

  • 上記のリクエストの User Agent は常に KULASIS/4 CFNetwork/976 Darwin/18.2.0 が使用されている。
  • エンコードは UTF-8 っぽい (要検証)
  • トークンを取得してからはそれのみで認証しているので cookie はいらない
  • どうやら HTTP 1.1 しか対応していない模様
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment