让我们阅读Hoppii的API吧(包含使用Golang调用API的额外内容)

这是法政大学信息科学部 2022 年圣诞倒数日历的第 20 篇文章。

你好,我是信息科学部的磯貝。

我非常感激去年开始的”法政大学信息科学部2022年圣诞日历”的聊天与同学们的合作。之前只有同班同学投稿,但今年不仅有其他年级的同学,还有其他系的同学们一起投稿,感觉非常开阔。非常感谢为今年的日历制作的@HirokiLucky以及去年和今年的合作帮助的@AbeTetsuya20。

好的,这次我们来说一下「让我们来读一读 Hoppii API」,顺便说一下,这是一种在法政大学使用的学习辅助系统 Hoppii 的API。

关于Hoppii

Hoppii是一個由法政大學提供的學習支援系統。
因為它為法大生每天提供幫助,所以應該沒有不認識的人…

Hoppii是基于Sakai Project的Sakai这个开源Java(tomcat)软件制作的。(源代码在这里,似乎还有一个Confluence的规范文件。)

Sakai提供了REST API作为其功能,并且使用Sakai的Hoppii也存在这个机制。
这次我们来阅读Hoppii的API参考文档,然后随便试试做点什么吧!

让我们阅读Hoppii的API参考文档。

您可以在这里阅读有关Hoppii API的说明。

据说API 是由包括公告、作业、内容等74个称为实体的功能组成的。

我打算让我们来看看上面提到的三个实体。

*注意:由于这个服务只限Hoppii用户使用,请谅解…请Hoppii用户先进行一次统一认证登录,然后再体验下面的实体。

公告实体

我們來看看Hoppii公司的發布實體的說明。根據官方說明,該實體的說明如下。

指定されたサイトに対するお知らせ (マージされたお知らせを含む) またはユーザに対するすべてのお知らせを表します.今日のメッセージおよび公開のお知らせも含みます.

简单地说,这是一个用于显示Portal主页上的“课程相关公告”栏目中的公告的实体。

我会尝试使用公告实体的自定义操作中的用户操作。
这个操作是用来获取已发送给用户的公告通知的。

让我们尝试访问 https://hoppii.hosei.ac.jp/direct/announcement/user.json。
应该会显示在门户网站首页的“课程相关公告”栏中的公告。

任务实体

接下来,让我们看一下作业实体。

引用Hoppii的解释,其中写着以下内容。

課題:

这很容易理解啊,哈哈。
这似乎是关于任务的实体。

我将尝试自定义动作中的”my”动作。
这个动作可以获取所有网站的所有任务。

让我们尝试访问 https://hoppii.hosei.ac.jp/direct/assignment/my.json。
您应该能够看到以前完成的任务以及当前分配的任务的显示。

内容实体

让我们来看一下内容实体。

引用Hoppii中的说明会得到以下内容:

コンテンツ/リソースツールを表示

我认为有一个类似教室页面上“教材”的页面,可以列出内容。这样的页面文件的属性(例如直接链接)可以获取,作为一个能够列举资源的实体。

那么,让我们试试 Content Entity 中的自定义动作中的 site 动作。这个动作可以获取指定网站的内容项。

首先,让我们访问任意课程的页面。
URL 的格式应该是 https://hoppii.hosei.ac.jp/portal/site/XXXXX。
这个 XXXXX 在 Hoppii API 中被称为 SITEID。

让我们来实际尝试一下 API。
请访问 https://hoppii.hosei.ac.jp/direct/content/site/SITEID.json。
您应该能够获取到”教材”栏中教材的属性。

特别是URL非常有趣,可以直接访问教材的链接。通过编写程序,并使用for循环等方法,即使不使用WebDav客户端,也可以批量下载文件等,似乎有着有趣的用法!

我试着使用Golang实现了一个库。

法政大学情報科学部是日本唯一一個以學習Golang聞名的大學。

我实现了一个可以调用 Announcement Entity 的 user 动作和 Assignment Entity 的 my 动作的开源库。

此外,API的源代码在这里!(虽然只是简单地写了一下,但在撰写这篇文章时,其中95%甚至相当长的时间都花在这里。)

因为是 Golang,所以我认为实现很容易理解,但只是访问每个操作的 URL 而已(笑)
功能还有很大的改进空间,所以希望以后有空的时候能够增加更多功能!
对于 Issue 的请求和贡献也非常欢迎!
请多多关照。

让我们尝试操作Hoppii API库

让我们来使用Golang来尝试使用我创建的Hoppii API库。

另外,我们假设您使用的是 Golang 1.19 版本。
如果您尚未安装过 Golang,请参考这里的指南来安装 Golang 1.19。(这是由大学中的 tenntenn 先生提供的 Golang 教学视频)

从这里开始操作终端。

# advent-hosei-2022 フォルダの作成
mkdir advent-hosei-2022

# go get で hoppii-api を取得
go get github.com/isso-719/hoppii-api@v0.0.1

使用编辑器等在 advent-hosei-2022 文件夹下创建以下的 main.go 文件。(请自行更改学籍号和密码部分)

package main

import (
	"fmt"
	"github.com/isso-719/hoppii-api"
	"github.com/isso-719/hoppii-api/pkg/announcement"
	"github.com/isso-719/hoppii-api/pkg/assignment"
	"github.com/isso-719/hoppii-api/pkg/user"
)

func main() {
	// ここに学籍番号を入力
	studentId := "99z9999"
	// ここにパスワードを入力
	password := "password"

	hoppiiApi := hoppii_api.NewHoppiiApi()

    // ユーザクライアントの作成 (これを使用して Hoppii にアクセスする)
	user, err := hoppiiApi.User.CreateUser(&user.UserInput{
		StudentId: studentId,
		Password:  password,
	})
	if err != nil {
		panic(err)
	}

    // Announcement Entity の User Action を取得
	auo, err := hoppiiApi.Announcement.User(&announcement.AnnouncementUserInput{
		UserCookie: user.Cookie,
	})
	if err != nil {
		panic(err)
	}
    // 結果を出力
	fmt.Println(auo.AnnouncementUserResult.AnnouncementCollection[0].Title)

    // Assignment Entity の My Action を取得
	ao, err := hoppiiApi.Assignment.My(&assignment.AssignmentMyInput{
		UserCookie: user.Cookie,
	})
	if err != nil {
		panic(err)
	}
    // 結果を出力
	fmt.Println(ao.AssignmentMyResult.AssignmentCollection[0].Title)
}

然后在终端上解决依赖关系…

# モジュールの依存関係の解決と整理を行う
go mod tidy

准备好了!

让我们在终端上运行程序吧(由于需要通过互联网访问,所以在不同环境下可能运行较慢)。

% go run main.go
Today's Class Canceled
Quiz for week 2

我遇到了和上述一样的情况!!!这是最近的通知和我最先做的任务呢(笑)

我在Golang中成功地调用了Hoppii的API!!!

最后

这次我们介绍了Hoppii API,并且还成功地在Golang中实际调用了它。
Hoppii仍然非常复杂…从这篇文章中,我希望能让Hoppii变得更加易于使用。

这次在实施库时,由于登录方面遇到了一些问题,所以我打算在明年的圣诞日历中介绍如何在不使用WebDriver的情况下,只通过代码来实现Hoppii的统一认证登录。笑

感謝您閱讀到最後。

这篇文章是关于“2022年法政大学信息科学部圣诞日历”的第20篇。

广告
将在 10 秒后关闭
bannerAds