ricq-axum-api

  1. 下载 UI 文件,放在工作目录 static 文件夹

bash wget https://github.com/lz1998/ricq-react-ui/releases/latest/download/static.zip && unzip static.zip && rm static.zip

  1. 实现 Processor trait(仅包含登录后处理逻辑)

```rust

[asynctrait::asynctrait]

pub trait Processor { async fn onloginsuccess( &self, client: Arc, eventreceiver: broadcast::Receiver, credential: Credential, networkjoinhandle: JoinHandle<()>, ); async fn listclient(&self) -> Vec; async fn delete_client(&self, uin: i64, protocol: u8); } ```

  1. 创建 RicqAxumApi,并启动 axum 服务器

```rust

![feature(async_closure)]

use std::net::SocketAddr; use std::str::FromStr; use std::sync::Arc;

use axum::{ routing::{get, getservice, post}, Extension, Router, }; use dashmap::DashMap; use tower::ServiceBuilder; use towerhttp::services::ServeDir;

use ricq::Client; use ricqaxumapi::handler::{bot, password, qrcode}; use ricqaxumapi::RicqAxumApi;

type ClientProcessor = DashMap<(i64, u8), Arc>;

[tokio::main]

async fn main() { // 默认处理器,登录后什么也不做,仅作为容器 let processor = ClientProcessor::default(); let ricqaxumapi = Arc::new(RicqAxumApi::new(processor));

let app = Router::new()
    .route("/ping", get(async move || "pong"))
    .nest(
        "/login",
        Router::new()
            .nest(
                "/qrcode",
                Router::new()
                    .route("/create", post(qrcode::create))
                    .route("/list", get(qrcode::list))
                    .route("/delete", post(qrcode::delete))
                    .route("/query", post(qrcode::query)),
            )
            .nest(
                "/password",
                Router::new()
                    .route("/create", post(password::login))
                    .route("/request_sms", post(password::request_sms))
                    .route("/submit_sms", post(password::submit_sms))
                    .route("/submit_ticket", post(password::submit_ticket))
                    .route("/list", get(password::list))
                    .route("/delete", post(password::delete)),
            ),
    )
    .nest(
        "/bot",
        Router::new()
            .route("/list", get(bot::list))
            .route("/delete", post(bot::delete)),
    )
    .fallback(get_service(ServeDir::new("static")).handle_error(handle_error))
    .layer(
        ServiceBuilder::new()
            .layer(Extension(ricq_axum_api))
            .into_inner(),
    );
let addr = SocketAddr::from_str("0.0.0.0:9000").expect("failed to parse bind_addr");
println!("listening on {}", addr);
axum::Server::bind(&addr)
    .serve(app.into_make_service())
    .await
    .unwrap();

}

async fn handleerror(: std::io::Error) -> impl axum::response::IntoResponse { (axum::http::StatusCode::NOT_FOUND, "Something went wrong...") } ```

  1. 访问 http://localhost:9000