#scraper #jw #api-bindings #testing #zju

nightly zju-jw-scraper

浙江大学教务网爬虫库

3 个不稳定版本

0.2.1 2019年9月15日
0.2.0 2019年9月11日
0.1.0 2019年9月5日

#21 in #scraper

MIT 协议

440KB
3.5K SLoC

ZJU-JWB 爬虫

Build status Coverage Status Crate version License: MIT Rust Docs

服务

#[async_trait]
pub trait JWService {
    type Err;
    async fn login(&self, stu_id: &str, password: &str) -> Result<String, Self::Err>;
    async fn get_course_info(&self, code: &str) -> Result<CourseInfo, Self::Err>;
    async fn get_courses(
        &self,
        stu_id: &str,
        school_year: SchoolYear,
        semester: CourseSemester,
        cookie: &str,
    ) -> Result<Vec<Course>, Self::Err>;
    async fn get_exams(
        &self,
        stu_id: &str,
        school_year: SchoolYear,
        semester: ExamSemester,
        cookie: &str,
    ) -> Result<Vec<Exam>, Self::Err>;
    async fn get_scores(&self, stu_id: &str, cookie: &str) -> Result<Vec<Score>, Self::Err>;
    async fn get_major_scores(
        &self,
        stu_id: &str,
        cookie: &str,
    ) -> Result<Vec<MajorScore>, Self::Err>;
    async fn get_total_credit(&self, stu_id: &str, cookie: &str) -> Result<f32, Self::Err>;
}

JWService 为实现了 interfacer_http::HttpClient 的所有类型实现了。

您可以参考 src/test.rs 以了解所有用例。

客户端

您可以使用此crate的 client 功能,如下所示

zju-jw-scraper = { version = "0.2", features = ["client"] }

然后,您可以使用由 interfacer-http-hyper 提供的默认客户端

use zju_jw_scraper::{client::client, JWService};

#[tokio::test]
async fn test_login() -> Result<(), Box<dyn std::error::Error>> {
    let service = client("http://jwbinfosys.zju.edu.cn".parse()?);
    let cookie = service.login("319000000", "test").await?;
    assert!(!cookie.is_empty());
    Ok(())
}

然而,默认客户端只能处理HTTP请求,如果您想使用其他协议,如HTTPS,则需要其他 Connect

例如,使用 connector

use hyper_tls::HttpsConnector;
use zju_jw_scraper::{client::client_on, JWService};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let service = client_on("https://jw.zjuqsc.com".parse()?, HttpsConnector::new()?);
    let cookie = service.login("319000000", "test").await?;
    assert!(!cookie.is_empty());
    Ok(())
}

测试

运行基本测试

cargo test

要完全测试此crate,请创建一个配置文件 test-settings.toml,并根据 test-settings.toml.sample 进行填充。然后运行测试

cargo test --all --all-features

作为替代,您可以使用以 TEST_ 为前缀的环境变量来配置测试。

TEST_stu_id=3190000000 cargo test --all --all-features

环境变量始终具有更高的优先级。

依赖项

~10–14MB
~266K SLoC