Crates.io | zju-jw-scraper |
lib.rs | zju-jw-scraper |
version | 0.2.1 |
source | src |
created_at | 2019-09-05 12:19:37.364629 |
updated_at | 2019-09-15 15:51:38.26251 |
description | 浙江大学教务网爬虫库 |
homepage | |
repository | https://github.com/QSCTech/jw-scraper-rs |
max_upload_size | |
id | 162423 |
size | 541,660 |
#[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>;
}
The JWService
is implemented for all types which implements interfacer_http::HttpClient
.
You can refer to src/test.rs
for all use cases.
You can use this crate with client
feature, like this:
zju-jw-scraper = { version = "0.2", features = ["client"] }
Then, you can use default client provided by 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(())
}
However, the default client can only handle requests on HTTP, if you want to use other protocol like HTTPS, you need other Connect
.
As the example 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(())
}
Run basic tests:
cargo test
To test this crate fully, create a config file test-settings.toml
, and fill it referring to test-settings.toml.sample
. Then run tests:
cargo test --all --all-features
As an alternative, you can configure tests using environment variables with prefix TEST_
.
TEST_stu_id=3190000000 cargo test --all --all-features
Environment variables always have higher priority.