通信を解析しただけなので、正確性は保証しかねます。
使用時は自己責任で!
※どうしてこんなに複雑なのかは不明
-
https://www.k.kyoto-u.ac.jp/api/app/v1/auth/get_j_session_complete にアクセス
レスポンスの Body (JSON 形式) の中のjsession
とlocation
を記録 -
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
含めてアクセスする -
1 で得られた
location
の URL にユーザー名、パスワードを POST する。Content-Type
はapplication/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
なので注意すること) -
3の結果としてかなり長い HTML が返される。ここに含まれる
form
の中身をし、name
属性がRelayState
とSAMLResponse
であるinput
タグのvalue
属性の値を取得する -
4 で得られた値を https://www.k.kyoto-u.ac.jp/api/app/v1/auth/get_shibboleth_session に POST する。
Content-Type
はapplication/x-www-form-urlencoded
とし、 BodyはRelayState=...&SAMLResponse=...&requestUrl=https%3A%2F%2Fwww.k.kyoto-u.ac.jp%2FShibboleth.sso%2FSAML2%2FPOST
の形式で。 それぞれの値は適切にパーセントエンコードされている必要がある。
Cookie には 2 と同様にJSESSIONID
を入れる必要がある。 -
最後に、 https://www.k.kyoto-u.ac.jp/secure/student/shibboleth_account_list?keep=true に対して GET リクエストを送信する。
2 で指定した 2 つの Cookie を指定する必要がある。 -
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 しか対応していない模様