Skip to main content

uapi_sdk_rust/services/
mod.rs

1use crate::client::Client;
2use crate::errors::Error;
3use crate::Result;
4use reqwest::header::{HeaderMap, HeaderValue};
5use reqwest::Method;
6use serde_json::Value;
7use tracing::instrument;
8use urlencoding::encode;
9#[derive(Debug, Clone)]
10pub struct ClipzyZaiXianJianTieBanService<'a> {
11    pub(crate) client: &'a Client,
12}
13
14impl<'a> ClipzyZaiXianJianTieBanService<'a> {
15/// 步骤2 (方法一): 获取加密数据
16    #[instrument(skip(self, params))]
17    pub async fn get_clipzy_get(&self, params: GetClipzyGetParams) -> Result<Value> {
18        let mut path = "/api/v1/api/get".to_string();
19
20        let mut query: Vec<(String, String)> = Vec::new();
21        query.push(("id".to_string(), params.id_query.clone()));
22        let query = if query.is_empty() { None } else { Some(query) };
23
24        let mut extra_headers = HeaderMap::new();
25        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
26        let body = None;
27
28        self.client
29            .request_json(
30                Method::GET,
31                &path,
32                headers,
33                query,
34                body,
35            )
36            .await
37    }
38/// 步骤2 (方法二): 获取原始文本
39    #[instrument(skip(self, params))]
40    pub async fn get_clipzy_raw(&self, params: GetClipzyRawParams) -> Result<Value> {
41        let mut path = "/api/v1/api/raw/{id}".to_string();
42        {
43            let encoded = encode(&params.id_path).into_owned();
44            path = path.replace("{id}", &encoded);
45        }
46
47        let mut query: Vec<(String, String)> = Vec::new();
48        query.push(("key".to_string(), params.key_query.clone()));
49        let query = if query.is_empty() { None } else { Some(query) };
50
51        let mut extra_headers = HeaderMap::new();
52        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
53        let body = None;
54
55        self.client
56            .request_json(
57                Method::GET,
58                &path,
59                headers,
60                query,
61                body,
62            )
63            .await
64    }
65/// 步骤1:上传加密数据
66    #[instrument(skip(self, params))]
67    pub async fn post_clipzy_store(&self, params: PostClipzyStoreParams) -> Result<Value> {
68        let mut path = "/api/v1/api/store".to_string();
69
70        let mut query: Vec<(String, String)> = Vec::new();
71        let query = if query.is_empty() { None } else { Some(query) };
72
73        let mut extra_headers = HeaderMap::new();
74        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
75        let body = params.body.clone();
76
77        self.client
78            .request_json(
79                Method::POST,
80                &path,
81                headers,
82                query,
83                body,
84            )
85            .await
86    }
87}
88
89#[derive(Debug, Clone)]
90pub struct GetClipzyGetParams {
91    pub id_query: String,
92}
93
94impl GetClipzyGetParams {
95    pub fn new(id_query: impl Into<String>) -> Self {
96        Self {
97            id_query: id_query.into(),
98        }
99    }
100}
101
102#[derive(Debug, Clone)]
103pub struct GetClipzyRawParams {
104    pub id_path: String,
105    pub key_query: String,
106}
107
108impl GetClipzyRawParams {
109    pub fn new(id_path: impl Into<String>, key_query: impl Into<String>) -> Self {
110        Self {
111            id_path: id_path.into(),
112            key_query: key_query.into(),
113        }
114    }
115}
116
117#[derive(Debug, Clone)]
118pub struct PostClipzyStoreParams {
119    pub body: Option<Value>,
120}
121
122impl PostClipzyStoreParams {
123    pub fn new() -> Self {
124        Self {
125            body: None,
126        }
127    }
128    pub fn body(mut self, value: Value) -> Self {
129        self.body = Some(value);
130        self
131    }
132}
133#[derive(Debug, Clone)]
134pub struct ConvertService<'a> {
135    pub(crate) client: &'a Client,
136}
137
138impl<'a> ConvertService<'a> {
139/// 时间戳转换
140    #[instrument(skip(self, params))]
141    pub async fn get_convert_unixtime(&self, params: GetConvertUnixtimeParams) -> Result<Value> {
142        let mut path = "/api/v1/convert/unixtime".to_string();
143
144        let mut query: Vec<(String, String)> = Vec::new();
145        query.push(("time".to_string(), params.time_query.clone()));
146        let query = if query.is_empty() { None } else { Some(query) };
147
148        let mut extra_headers = HeaderMap::new();
149        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
150        let body = None;
151
152        self.client
153            .request_json(
154                Method::GET,
155                &path,
156                headers,
157                query,
158                body,
159            )
160            .await
161    }
162/// JSON 格式化
163    #[instrument(skip(self, params))]
164    pub async fn post_convert_json(&self, params: PostConvertJsonParams) -> Result<Value> {
165        let mut path = "/api/v1/convert/json".to_string();
166
167        let mut query: Vec<(String, String)> = Vec::new();
168        let query = if query.is_empty() { None } else { Some(query) };
169
170        let mut extra_headers = HeaderMap::new();
171        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
172        let body = params.body.clone();
173
174        self.client
175            .request_json(
176                Method::POST,
177                &path,
178                headers,
179                query,
180                body,
181            )
182            .await
183    }
184}
185
186#[derive(Debug, Clone)]
187pub struct GetConvertUnixtimeParams {
188    pub time_query: String,
189}
190
191impl GetConvertUnixtimeParams {
192    pub fn new(time_query: impl Into<String>) -> Self {
193        Self {
194            time_query: time_query.into(),
195        }
196    }
197}
198
199#[derive(Debug, Clone)]
200pub struct PostConvertJsonParams {
201    pub body: Option<Value>,
202}
203
204impl PostConvertJsonParams {
205    pub fn new() -> Self {
206        Self {
207            body: None,
208        }
209    }
210    pub fn body(mut self, value: Value) -> Self {
211        self.body = Some(value);
212        self
213    }
214}
215#[derive(Debug, Clone)]
216pub struct DailyService<'a> {
217    pub(crate) client: &'a Client,
218}
219
220impl<'a> DailyService<'a> {
221/// 每日新闻图
222    #[instrument(skip(self))]
223    pub async fn get_daily_news_image(&self) -> Result<Value> {
224        let mut path = "/api/v1/daily/news-image".to_string();
225
226        let mut query: Vec<(String, String)> = Vec::new();
227        let query = if query.is_empty() { None } else { Some(query) };
228
229        let mut extra_headers = HeaderMap::new();
230        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
231        let body = None;
232
233        self.client
234            .request_json(
235                Method::GET,
236                &path,
237                headers,
238                query,
239                body,
240            )
241            .await
242    }
243}
244
245#[derive(Debug, Clone)]
246pub struct GameService<'a> {
247    pub(crate) client: &'a Client,
248}
249
250impl<'a> GameService<'a> {
251/// Epic 免费游戏
252    #[instrument(skip(self))]
253    pub async fn get_game_epic_free(&self) -> Result<Value> {
254        let mut path = "/api/v1/game/epic-free".to_string();
255
256        let mut query: Vec<(String, String)> = Vec::new();
257        let query = if query.is_empty() { None } else { Some(query) };
258
259        let mut extra_headers = HeaderMap::new();
260        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
261        let body = None;
262
263        self.client
264            .request_json(
265                Method::GET,
266                &path,
267                headers,
268                query,
269                body,
270            )
271            .await
272    }
273/// 查询 MC 曾用名
274    #[instrument(skip(self, params))]
275    pub async fn get_game_minecraft_historyid(&self, params: GetGameMinecraftHistoryidParams) -> Result<Value> {
276        let mut path = "/api/v1/game/minecraft/historyid".to_string();
277
278        let mut query: Vec<(String, String)> = Vec::new();
279        if let Some(value) = &params.name_query {
280            query.push(("name".to_string(), value.clone()));
281        }
282        if let Some(value) = &params.uuid_query {
283            query.push(("uuid".to_string(), value.clone()));
284        }
285        let query = if query.is_empty() { None } else { Some(query) };
286
287        let mut extra_headers = HeaderMap::new();
288        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
289        let body = None;
290
291        self.client
292            .request_json(
293                Method::GET,
294                &path,
295                headers,
296                query,
297                body,
298            )
299            .await
300    }
301/// 查询 MC 服务器
302    #[instrument(skip(self, params))]
303    pub async fn get_game_minecraft_serverstatus(&self, params: GetGameMinecraftServerstatusParams) -> Result<Value> {
304        let mut path = "/api/v1/game/minecraft/serverstatus".to_string();
305
306        let mut query: Vec<(String, String)> = Vec::new();
307        query.push(("server".to_string(), params.server_query.clone()));
308        let query = if query.is_empty() { None } else { Some(query) };
309
310        let mut extra_headers = HeaderMap::new();
311        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
312        let body = None;
313
314        self.client
315            .request_json(
316                Method::GET,
317                &path,
318                headers,
319                query,
320                body,
321            )
322            .await
323    }
324/// 查询 MC 玩家
325    #[instrument(skip(self, params))]
326    pub async fn get_game_minecraft_userinfo(&self, params: GetGameMinecraftUserinfoParams) -> Result<Value> {
327        let mut path = "/api/v1/game/minecraft/userinfo".to_string();
328
329        let mut query: Vec<(String, String)> = Vec::new();
330        query.push(("username".to_string(), params.username_query.clone()));
331        let query = if query.is_empty() { None } else { Some(query) };
332
333        let mut extra_headers = HeaderMap::new();
334        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
335        let body = None;
336
337        self.client
338            .request_json(
339                Method::GET,
340                &path,
341                headers,
342                query,
343                body,
344            )
345            .await
346    }
347/// 查询 Steam 用户
348    #[instrument(skip(self, params))]
349    pub async fn get_game_steam_summary(&self, params: GetGameSteamSummaryParams) -> Result<Value> {
350        let mut path = "/api/v1/game/steam/summary".to_string();
351
352        let mut query: Vec<(String, String)> = Vec::new();
353        if let Some(value) = &params.steamid_query {
354            query.push(("steamid".to_string(), value.clone()));
355        }
356        if let Some(value) = &params.id_query {
357            query.push(("id".to_string(), value.clone()));
358        }
359        if let Some(value) = &params.id_3_query {
360            query.push(("id3".to_string(), value.clone()));
361        }
362        if let Some(value) = &params.key_query {
363            query.push(("key".to_string(), value.clone()));
364        }
365        let query = if query.is_empty() { None } else { Some(query) };
366
367        let mut extra_headers = HeaderMap::new();
368        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
369        let body = None;
370
371        self.client
372            .request_json(
373                Method::GET,
374                &path,
375                headers,
376                query,
377                body,
378            )
379            .await
380    }
381}
382
383
384#[derive(Debug, Clone)]
385pub struct GetGameMinecraftHistoryidParams {
386    pub name_query: Option<String>,
387    pub uuid_query: Option<String>,
388}
389
390impl GetGameMinecraftHistoryidParams {
391    pub fn new() -> Self {
392        Self {
393            name_query: None,
394            uuid_query: None,
395        }
396    }
397    pub fn name_query(mut self, value: impl Into<String>) -> Self {
398        self.name_query = Some(value.into());
399        self
400    }
401    pub fn uuid_query(mut self, value: impl Into<String>) -> Self {
402        self.uuid_query = Some(value.into());
403        self
404    }
405}
406
407#[derive(Debug, Clone)]
408pub struct GetGameMinecraftServerstatusParams {
409    pub server_query: String,
410}
411
412impl GetGameMinecraftServerstatusParams {
413    pub fn new(server_query: impl Into<String>) -> Self {
414        Self {
415            server_query: server_query.into(),
416        }
417    }
418}
419
420#[derive(Debug, Clone)]
421pub struct GetGameMinecraftUserinfoParams {
422    pub username_query: String,
423}
424
425impl GetGameMinecraftUserinfoParams {
426    pub fn new(username_query: impl Into<String>) -> Self {
427        Self {
428            username_query: username_query.into(),
429        }
430    }
431}
432
433#[derive(Debug, Clone)]
434pub struct GetGameSteamSummaryParams {
435    pub steamid_query: Option<String>,
436    pub id_query: Option<String>,
437    pub id_3_query: Option<String>,
438    pub key_query: Option<String>,
439}
440
441impl GetGameSteamSummaryParams {
442    pub fn new() -> Self {
443        Self {
444            steamid_query: None,
445            id_query: None,
446            id_3_query: None,
447            key_query: None,
448        }
449    }
450    pub fn steamid_query(mut self, value: impl Into<String>) -> Self {
451        self.steamid_query = Some(value.into());
452        self
453    }
454    pub fn id_query(mut self, value: impl Into<String>) -> Self {
455        self.id_query = Some(value.into());
456        self
457    }
458    pub fn id_3_query(mut self, value: impl Into<String>) -> Self {
459        self.id_3_query = Some(value.into());
460        self
461    }
462    pub fn key_query(mut self, value: impl Into<String>) -> Self {
463        self.key_query = Some(value.into());
464        self
465    }
466}
467#[derive(Debug, Clone)]
468pub struct ImageService<'a> {
469    pub(crate) client: &'a Client,
470}
471
472impl<'a> ImageService<'a> {
473/// 获取Gravatar头像
474    #[instrument(skip(self, params))]
475    pub async fn get_avatar_gravatar(&self, params: GetAvatarGravatarParams) -> Result<Value> {
476        let mut path = "/api/v1/avatar/gravatar".to_string();
477
478        let mut query: Vec<(String, String)> = Vec::new();
479        if let Some(value) = &params.email_query {
480            query.push(("email".to_string(), value.clone()));
481        }
482        if let Some(value) = &params.hash_query {
483            query.push(("hash".to_string(), value.clone()));
484        }
485        if let Some(value) = &params.s_query {
486            query.push(("s".to_string(), value.clone()));
487        }
488        if let Some(value) = &params.d_query {
489            query.push(("d".to_string(), value.clone()));
490        }
491        if let Some(value) = &params.r_query {
492            query.push(("r".to_string(), value.clone()));
493        }
494        let query = if query.is_empty() { None } else { Some(query) };
495
496        let mut extra_headers = HeaderMap::new();
497        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
498        let body = None;
499
500        self.client
501            .request_json(
502                Method::GET,
503                &path,
504                headers,
505                query,
506                body,
507            )
508            .await
509    }
510/// 必应壁纸
511    #[instrument(skip(self))]
512    pub async fn get_image_bing_daily(&self) -> Result<Value> {
513        let mut path = "/api/v1/image/bing-daily".to_string();
514
515        let mut query: Vec<(String, String)> = Vec::new();
516        let query = if query.is_empty() { None } else { Some(query) };
517
518        let mut extra_headers = HeaderMap::new();
519        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
520        let body = None;
521
522        self.client
523            .request_json(
524                Method::GET,
525                &path,
526                headers,
527                query,
528                body,
529            )
530            .await
531    }
532/// 生成摸摸头GIF (QQ号)
533    #[instrument(skip(self, params))]
534    pub async fn get_image_motou(&self, params: GetImageMotouParams) -> Result<Value> {
535        let mut path = "/api/v1/image/motou".to_string();
536
537        let mut query: Vec<(String, String)> = Vec::new();
538        query.push(("qq".to_string(), params.qq_query.clone()));
539        if let Some(value) = &params.bg_color_query {
540            query.push(("bg_color".to_string(), value.clone()));
541        }
542        let query = if query.is_empty() { None } else { Some(query) };
543
544        let mut extra_headers = HeaderMap::new();
545        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
546        let body = None;
547
548        self.client
549            .request_json(
550                Method::GET,
551                &path,
552                headers,
553                query,
554                body,
555            )
556            .await
557    }
558/// 生成二维码
559    #[instrument(skip(self, params))]
560    pub async fn get_image_qrcode(&self, params: GetImageQrcodeParams) -> Result<Value> {
561        let mut path = "/api/v1/image/qrcode".to_string();
562
563        let mut query: Vec<(String, String)> = Vec::new();
564        query.push(("text".to_string(), params.text_query.clone()));
565        if let Some(value) = &params.size_query {
566            query.push(("size".to_string(), value.clone()));
567        }
568        if let Some(value) = &params.format_query {
569            query.push(("format".to_string(), value.clone()));
570        }
571        if let Some(value) = &params.transparent_query {
572            query.push(("transparent".to_string(), value.clone()));
573        }
574        if let Some(value) = &params.fgcolor_query {
575            query.push(("fgcolor".to_string(), value.clone()));
576        }
577        if let Some(value) = &params.bgcolor_query {
578            query.push(("bgcolor".to_string(), value.clone()));
579        }
580        let query = if query.is_empty() { None } else { Some(query) };
581
582        let mut extra_headers = HeaderMap::new();
583        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
584        let body = None;
585
586        self.client
587            .request_json(
588                Method::GET,
589                &path,
590                headers,
591                query,
592                body,
593            )
594            .await
595    }
596/// 图片转 Base64
597    #[instrument(skip(self, params))]
598    pub async fn get_image_tobase_64(&self, params: GetImageTobase64Params) -> Result<Value> {
599        let mut path = "/api/v1/image/tobase64".to_string();
600
601        let mut query: Vec<(String, String)> = Vec::new();
602        query.push(("url".to_string(), params.url_query.clone()));
603        let query = if query.is_empty() { None } else { Some(query) };
604
605        let mut extra_headers = HeaderMap::new();
606        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
607        let body = None;
608
609        self.client
610            .request_json(
611                Method::GET,
612                &path,
613                headers,
614                query,
615                body,
616            )
617            .await
618    }
619/// 无损压缩图片
620    #[instrument(skip(self, params))]
621    pub async fn post_image_compress(&self, params: PostImageCompressParams) -> Result<Value> {
622        let mut path = "/api/v1/image/compress".to_string();
623
624        let mut query: Vec<(String, String)> = Vec::new();
625        if let Some(value) = &params.level_query {
626            query.push(("level".to_string(), value.clone()));
627        }
628        if let Some(value) = &params.format_query {
629            query.push(("format".to_string(), value.clone()));
630        }
631        let query = if query.is_empty() { None } else { Some(query) };
632
633        let mut extra_headers = HeaderMap::new();
634        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
635        let body = params.body.clone();
636
637        self.client
638            .request_json(
639                Method::POST,
640                &path,
641                headers,
642                query,
643                body,
644            )
645            .await
646    }
647/// 通过Base64编码上传图片
648    #[instrument(skip(self, params))]
649    pub async fn post_image_frombase_64(&self, params: PostImageFrombase64Params) -> Result<Value> {
650        let mut path = "/api/v1/image/frombase64".to_string();
651
652        let mut query: Vec<(String, String)> = Vec::new();
653        let query = if query.is_empty() { None } else { Some(query) };
654
655        let mut extra_headers = HeaderMap::new();
656        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
657        let body = params.body.clone();
658
659        self.client
660            .request_json(
661                Method::POST,
662                &path,
663                headers,
664                query,
665                body,
666            )
667            .await
668    }
669/// 生成摸摸头GIF
670    #[instrument(skip(self, params))]
671    pub async fn post_image_motou(&self, params: PostImageMotouParams) -> Result<Value> {
672        let mut path = "/api/v1/image/motou".to_string();
673
674        let mut query: Vec<(String, String)> = Vec::new();
675        let query = if query.is_empty() { None } else { Some(query) };
676
677        let mut extra_headers = HeaderMap::new();
678        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
679        let body = params.body.clone();
680
681        self.client
682            .request_json(
683                Method::POST,
684                &path,
685                headers,
686                query,
687                body,
688            )
689            .await
690    }
691/// 图片敏感检测
692    #[instrument(skip(self, params))]
693    pub async fn post_image_nsfw(&self, params: PostImageNsfwParams) -> Result<Value> {
694        let mut path = "/api/v1/image/nsfw".to_string();
695
696        let mut query: Vec<(String, String)> = Vec::new();
697        let query = if query.is_empty() { None } else { Some(query) };
698
699        let mut extra_headers = HeaderMap::new();
700        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
701        let body = params.body.clone();
702
703        self.client
704            .request_json(
705                Method::POST,
706                &path,
707                headers,
708                query,
709                body,
710            )
711            .await
712    }
713/// 生成你们怎么不说话了表情包
714    #[instrument(skip(self, params))]
715    pub async fn post_image_speechless(&self, params: PostImageSpeechlessParams) -> Result<Value> {
716        let mut path = "/api/v1/image/speechless".to_string();
717
718        let mut query: Vec<(String, String)> = Vec::new();
719        let query = if query.is_empty() { None } else { Some(query) };
720
721        let mut extra_headers = HeaderMap::new();
722        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
723        let body = params.body.clone();
724
725        self.client
726            .request_json(
727                Method::POST,
728                &path,
729                headers,
730                query,
731                body,
732            )
733            .await
734    }
735/// SVG转图片
736    #[instrument(skip(self, params))]
737    pub async fn post_image_svg(&self, params: PostImageSvgParams) -> Result<Value> {
738        let mut path = "/api/v1/image/svg".to_string();
739
740        let mut query: Vec<(String, String)> = Vec::new();
741        if let Some(value) = &params.format_query {
742            query.push(("format".to_string(), value.clone()));
743        }
744        if let Some(value) = &params.width_query {
745            query.push(("width".to_string(), value.clone()));
746        }
747        if let Some(value) = &params.height_query {
748            query.push(("height".to_string(), value.clone()));
749        }
750        if let Some(value) = &params.quality_query {
751            query.push(("quality".to_string(), value.clone()));
752        }
753        let query = if query.is_empty() { None } else { Some(query) };
754
755        let mut extra_headers = HeaderMap::new();
756        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
757        let body = params.body.clone();
758
759        self.client
760            .request_json(
761                Method::POST,
762                &path,
763                headers,
764                query,
765                body,
766            )
767            .await
768    }
769}
770
771#[derive(Debug, Clone)]
772pub struct GetAvatarGravatarParams {
773    pub email_query: Option<String>,
774    pub hash_query: Option<String>,
775    pub s_query: Option<String>,
776    pub d_query: Option<String>,
777    pub r_query: Option<String>,
778}
779
780impl GetAvatarGravatarParams {
781    pub fn new() -> Self {
782        Self {
783            email_query: None,
784            hash_query: None,
785            s_query: None,
786            d_query: None,
787            r_query: None,
788        }
789    }
790    pub fn email_query(mut self, value: impl Into<String>) -> Self {
791        self.email_query = Some(value.into());
792        self
793    }
794    pub fn hash_query(mut self, value: impl Into<String>) -> Self {
795        self.hash_query = Some(value.into());
796        self
797    }
798    pub fn s_query(mut self, value: impl Into<String>) -> Self {
799        self.s_query = Some(value.into());
800        self
801    }
802    pub fn d_query(mut self, value: impl Into<String>) -> Self {
803        self.d_query = Some(value.into());
804        self
805    }
806    pub fn r_query(mut self, value: impl Into<String>) -> Self {
807        self.r_query = Some(value.into());
808        self
809    }
810}
811
812
813#[derive(Debug, Clone)]
814pub struct GetImageMotouParams {
815    pub qq_query: String,
816    pub bg_color_query: Option<String>,
817}
818
819impl GetImageMotouParams {
820    pub fn new(qq_query: impl Into<String>) -> Self {
821        Self {
822            qq_query: qq_query.into(),
823            bg_color_query: None,
824        }
825    }
826    pub fn bg_color_query(mut self, value: impl Into<String>) -> Self {
827        self.bg_color_query = Some(value.into());
828        self
829    }
830}
831
832#[derive(Debug, Clone)]
833pub struct GetImageQrcodeParams {
834    pub text_query: String,
835    pub size_query: Option<String>,
836    pub format_query: Option<String>,
837    pub transparent_query: Option<String>,
838    pub fgcolor_query: Option<String>,
839    pub bgcolor_query: Option<String>,
840}
841
842impl GetImageQrcodeParams {
843    pub fn new(text_query: impl Into<String>) -> Self {
844        Self {
845            text_query: text_query.into(),
846            size_query: None,
847            format_query: None,
848            transparent_query: None,
849            fgcolor_query: None,
850            bgcolor_query: None,
851        }
852    }
853    pub fn size_query(mut self, value: impl Into<String>) -> Self {
854        self.size_query = Some(value.into());
855        self
856    }
857    pub fn format_query(mut self, value: impl Into<String>) -> Self {
858        self.format_query = Some(value.into());
859        self
860    }
861    pub fn transparent_query(mut self, value: impl Into<String>) -> Self {
862        self.transparent_query = Some(value.into());
863        self
864    }
865    pub fn fgcolor_query(mut self, value: impl Into<String>) -> Self {
866        self.fgcolor_query = Some(value.into());
867        self
868    }
869    pub fn bgcolor_query(mut self, value: impl Into<String>) -> Self {
870        self.bgcolor_query = Some(value.into());
871        self
872    }
873}
874
875#[derive(Debug, Clone)]
876pub struct GetImageTobase64Params {
877    pub url_query: String,
878}
879
880impl GetImageTobase64Params {
881    pub fn new(url_query: impl Into<String>) -> Self {
882        Self {
883            url_query: url_query.into(),
884        }
885    }
886}
887
888#[derive(Debug, Clone)]
889pub struct PostImageCompressParams {
890    pub level_query: Option<String>,
891    pub format_query: Option<String>,
892    pub body: Option<Value>,
893}
894
895impl PostImageCompressParams {
896    pub fn new() -> Self {
897        Self {
898            level_query: None,
899            format_query: None,
900            body: None,
901        }
902    }
903    pub fn level_query(mut self, value: impl Into<String>) -> Self {
904        self.level_query = Some(value.into());
905        self
906    }
907    pub fn format_query(mut self, value: impl Into<String>) -> Self {
908        self.format_query = Some(value.into());
909        self
910    }
911    pub fn body(mut self, value: Value) -> Self {
912        self.body = Some(value);
913        self
914    }
915}
916
917#[derive(Debug, Clone)]
918pub struct PostImageFrombase64Params {
919    pub body: Option<Value>,
920}
921
922impl PostImageFrombase64Params {
923    pub fn new() -> Self {
924        Self {
925            body: None,
926        }
927    }
928    pub fn body(mut self, value: Value) -> Self {
929        self.body = Some(value);
930        self
931    }
932}
933
934#[derive(Debug, Clone)]
935pub struct PostImageMotouParams {
936    pub body: Option<Value>,
937}
938
939impl PostImageMotouParams {
940    pub fn new() -> Self {
941        Self {
942            body: None,
943        }
944    }
945    pub fn body(mut self, value: Value) -> Self {
946        self.body = Some(value);
947        self
948    }
949}
950
951#[derive(Debug, Clone)]
952pub struct PostImageNsfwParams {
953    pub body: Option<Value>,
954}
955
956impl PostImageNsfwParams {
957    pub fn new() -> Self {
958        Self {
959            body: None,
960        }
961    }
962    pub fn body(mut self, value: Value) -> Self {
963        self.body = Some(value);
964        self
965    }
966}
967
968#[derive(Debug, Clone)]
969pub struct PostImageSpeechlessParams {
970    pub body: Option<Value>,
971}
972
973impl PostImageSpeechlessParams {
974    pub fn new() -> Self {
975        Self {
976            body: None,
977        }
978    }
979    pub fn body(mut self, value: Value) -> Self {
980        self.body = Some(value);
981        self
982    }
983}
984
985#[derive(Debug, Clone)]
986pub struct PostImageSvgParams {
987    pub format_query: Option<String>,
988    pub width_query: Option<String>,
989    pub height_query: Option<String>,
990    pub quality_query: Option<String>,
991    pub body: Option<Value>,
992}
993
994impl PostImageSvgParams {
995    pub fn new() -> Self {
996        Self {
997            format_query: None,
998            width_query: None,
999            height_query: None,
1000            quality_query: None,
1001            body: None,
1002        }
1003    }
1004    pub fn format_query(mut self, value: impl Into<String>) -> Self {
1005        self.format_query = Some(value.into());
1006        self
1007    }
1008    pub fn width_query(mut self, value: impl Into<String>) -> Self {
1009        self.width_query = Some(value.into());
1010        self
1011    }
1012    pub fn height_query(mut self, value: impl Into<String>) -> Self {
1013        self.height_query = Some(value.into());
1014        self
1015    }
1016    pub fn quality_query(mut self, value: impl Into<String>) -> Self {
1017        self.quality_query = Some(value.into());
1018        self
1019    }
1020    pub fn body(mut self, value: Value) -> Self {
1021        self.body = Some(value);
1022        self
1023    }
1024}
1025#[derive(Debug, Clone)]
1026pub struct MiscService<'a> {
1027    pub(crate) client: &'a Client,
1028}
1029
1030impl<'a> MiscService<'a> {
1031/// 程序员历史事件
1032    #[instrument(skip(self, params))]
1033    pub async fn get_history_programmer(&self, params: GetHistoryProgrammerParams) -> Result<Value> {
1034        let mut path = "/api/v1/history/programmer".to_string();
1035
1036        let mut query: Vec<(String, String)> = Vec::new();
1037        query.push(("month".to_string(), params.month_query.clone()));
1038        query.push(("day".to_string(), params.day_query.clone()));
1039        let query = if query.is_empty() { None } else { Some(query) };
1040
1041        let mut extra_headers = HeaderMap::new();
1042        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1043        let body = None;
1044
1045        self.client
1046            .request_json(
1047                Method::GET,
1048                &path,
1049                headers,
1050                query,
1051                body,
1052            )
1053            .await
1054    }
1055/// 程序员历史上的今天
1056    #[instrument(skip(self))]
1057    pub async fn get_history_programmer_today(&self) -> Result<Value> {
1058        let mut path = "/api/v1/history/programmer/today".to_string();
1059
1060        let mut query: Vec<(String, String)> = Vec::new();
1061        let query = if query.is_empty() { None } else { Some(query) };
1062
1063        let mut extra_headers = HeaderMap::new();
1064        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1065        let body = None;
1066
1067        self.client
1068            .request_json(
1069                Method::GET,
1070                &path,
1071                headers,
1072                query,
1073                body,
1074            )
1075            .await
1076    }
1077/// Adcode 国内外行政区域查询
1078    #[instrument(skip(self, params))]
1079    pub async fn get_misc_district(&self, params: GetMiscDistrictParams) -> Result<Value> {
1080        let mut path = "/api/v1/misc/district".to_string();
1081
1082        let mut query: Vec<(String, String)> = Vec::new();
1083        if let Some(value) = &params.keywords_query {
1084            query.push(("keywords".to_string(), value.clone()));
1085        }
1086        if let Some(value) = &params.adcode_query {
1087            query.push(("adcode".to_string(), value.clone()));
1088        }
1089        if let Some(value) = &params.lat_query {
1090            query.push(("lat".to_string(), value.clone()));
1091        }
1092        if let Some(value) = &params.lng_query {
1093            query.push(("lng".to_string(), value.clone()));
1094        }
1095        if let Some(value) = &params.level_query {
1096            query.push(("level".to_string(), value.clone()));
1097        }
1098        if let Some(value) = &params.country_query {
1099            query.push(("country".to_string(), value.clone()));
1100        }
1101        if let Some(value) = &params.limit_query {
1102            query.push(("limit".to_string(), value.clone()));
1103        }
1104        let query = if query.is_empty() { None } else { Some(query) };
1105
1106        let mut extra_headers = HeaderMap::new();
1107        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1108        let body = None;
1109
1110        self.client
1111            .request_json(
1112                Method::GET,
1113                &path,
1114                headers,
1115                query,
1116                body,
1117            )
1118            .await
1119    }
1120/// 查询节假日与万年历
1121    #[instrument(skip(self, params))]
1122    pub async fn get_misc_holiday_calendar(&self, params: GetMiscHolidayCalendarParams) -> Result<Value> {
1123        let mut path = "/api/v1/misc/holiday-calendar".to_string();
1124
1125        let mut query: Vec<(String, String)> = Vec::new();
1126        if let Some(value) = &params.date_query {
1127            query.push(("date".to_string(), value.clone()));
1128        }
1129        if let Some(value) = &params.month_query {
1130            query.push(("month".to_string(), value.clone()));
1131        }
1132        if let Some(value) = &params.year_query {
1133            query.push(("year".to_string(), value.clone()));
1134        }
1135        if let Some(value) = &params.timezone_query {
1136            query.push(("timezone".to_string(), value.clone()));
1137        }
1138        if let Some(value) = &params.holiday_type_query {
1139            query.push(("holiday_type".to_string(), value.clone()));
1140        }
1141        if let Some(value) = &params.include_nearby_query {
1142            query.push(("include_nearby".to_string(), value.clone()));
1143        }
1144        if let Some(value) = &params.nearby_limit_query {
1145            query.push(("nearby_limit".to_string(), value.clone()));
1146        }
1147        let query = if query.is_empty() { None } else { Some(query) };
1148
1149        let mut extra_headers = HeaderMap::new();
1150        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1151        let body = None;
1152
1153        self.client
1154            .request_json(
1155                Method::GET,
1156                &path,
1157                headers,
1158                query,
1159                body,
1160            )
1161            .await
1162    }
1163/// 查询热榜
1164    #[instrument(skip(self, params))]
1165    pub async fn get_misc_hotboard(&self, params: GetMiscHotboardParams) -> Result<Value> {
1166        let mut path = "/api/v1/misc/hotboard".to_string();
1167
1168        let mut query: Vec<(String, String)> = Vec::new();
1169        query.push(("type".to_string(), params.type_query.clone()));
1170        if let Some(value) = &params.time_query {
1171            query.push(("time".to_string(), value.clone()));
1172        }
1173        if let Some(value) = &params.keyword_query {
1174            query.push(("keyword".to_string(), value.clone()));
1175        }
1176        if let Some(value) = &params.time_start_query {
1177            query.push(("time_start".to_string(), value.clone()));
1178        }
1179        if let Some(value) = &params.time_end_query {
1180            query.push(("time_end".to_string(), value.clone()));
1181        }
1182        if let Some(value) = &params.limit_query {
1183            query.push(("limit".to_string(), value.clone()));
1184        }
1185        if let Some(value) = &params.sources_query {
1186            query.push(("sources".to_string(), value.clone()));
1187        }
1188        let query = if query.is_empty() { None } else { Some(query) };
1189
1190        let mut extra_headers = HeaderMap::new();
1191        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1192        let body = None;
1193
1194        self.client
1195            .request_json(
1196                Method::GET,
1197                &path,
1198                headers,
1199                query,
1200                body,
1201            )
1202            .await
1203    }
1204/// 查询农历时间
1205    #[instrument(skip(self, params))]
1206    pub async fn get_misc_lunartime(&self, params: GetMiscLunartimeParams) -> Result<Value> {
1207        let mut path = "/api/v1/misc/lunartime".to_string();
1208
1209        let mut query: Vec<(String, String)> = Vec::new();
1210        if let Some(value) = &params.ts_query {
1211            query.push(("ts".to_string(), value.clone()));
1212        }
1213        if let Some(value) = &params.timezone_query {
1214            query.push(("timezone".to_string(), value.clone()));
1215        }
1216        let query = if query.is_empty() { None } else { Some(query) };
1217
1218        let mut extra_headers = HeaderMap::new();
1219        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1220        let body = None;
1221
1222        self.client
1223            .request_json(
1224                Method::GET,
1225                &path,
1226                headers,
1227                query,
1228                body,
1229            )
1230            .await
1231    }
1232/// 查询手机归属地
1233    #[instrument(skip(self, params))]
1234    pub async fn get_misc_phoneinfo(&self, params: GetMiscPhoneinfoParams) -> Result<Value> {
1235        let mut path = "/api/v1/misc/phoneinfo".to_string();
1236
1237        let mut query: Vec<(String, String)> = Vec::new();
1238        query.push(("phone".to_string(), params.phone_query.clone()));
1239        let query = if query.is_empty() { None } else { Some(query) };
1240
1241        let mut extra_headers = HeaderMap::new();
1242        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1243        let body = None;
1244
1245        self.client
1246            .request_json(
1247                Method::GET,
1248                &path,
1249                headers,
1250                query,
1251                body,
1252            )
1253            .await
1254    }
1255/// 随机数生成
1256    #[instrument(skip(self, params))]
1257    pub async fn get_misc_randomnumber(&self, params: GetMiscRandomnumberParams) -> Result<Value> {
1258        let mut path = "/api/v1/misc/randomnumber".to_string();
1259
1260        let mut query: Vec<(String, String)> = Vec::new();
1261        if let Some(value) = &params.min_query {
1262            query.push(("min".to_string(), value.clone()));
1263        }
1264        if let Some(value) = &params.max_query {
1265            query.push(("max".to_string(), value.clone()));
1266        }
1267        if let Some(value) = &params.count_query {
1268            query.push(("count".to_string(), value.clone()));
1269        }
1270        if let Some(value) = &params.allow_repeat_query {
1271            query.push(("allow_repeat".to_string(), value.clone()));
1272        }
1273        if let Some(value) = &params.allow_decimal_query {
1274            query.push(("allow_decimal".to_string(), value.clone()));
1275        }
1276        if let Some(value) = &params.decimal_places_query {
1277            query.push(("decimal_places".to_string(), value.clone()));
1278        }
1279        let query = if query.is_empty() { None } else { Some(query) };
1280
1281        let mut extra_headers = HeaderMap::new();
1282        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1283        let body = None;
1284
1285        self.client
1286            .request_json(
1287                Method::GET,
1288                &path,
1289                headers,
1290                query,
1291                body,
1292            )
1293            .await
1294    }
1295/// 转换时间戳 (旧版,推荐使用/convert/unixtime)
1296    #[instrument(skip(self, params))]
1297    pub async fn get_misc_timestamp(&self, params: GetMiscTimestampParams) -> Result<Value> {
1298        let mut path = "/api/v1/misc/timestamp".to_string();
1299
1300        let mut query: Vec<(String, String)> = Vec::new();
1301        query.push(("ts".to_string(), params.ts_query.clone()));
1302        let query = if query.is_empty() { None } else { Some(query) };
1303
1304        let mut extra_headers = HeaderMap::new();
1305        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1306        let body = None;
1307
1308        self.client
1309            .request_json(
1310                Method::GET,
1311                &path,
1312                headers,
1313                query,
1314                body,
1315            )
1316            .await
1317    }
1318/// 获取支持的快递公司列表
1319    #[instrument(skip(self))]
1320    pub async fn get_misc_tracking_carriers(&self) -> Result<Value> {
1321        let mut path = "/api/v1/misc/tracking/carriers".to_string();
1322
1323        let mut query: Vec<(String, String)> = Vec::new();
1324        let query = if query.is_empty() { None } else { Some(query) };
1325
1326        let mut extra_headers = HeaderMap::new();
1327        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1328        let body = None;
1329
1330        self.client
1331            .request_json(
1332                Method::GET,
1333                &path,
1334                headers,
1335                query,
1336                body,
1337            )
1338            .await
1339    }
1340/// 识别快递公司
1341    #[instrument(skip(self, params))]
1342    pub async fn get_misc_tracking_detect(&self, params: GetMiscTrackingDetectParams) -> Result<Value> {
1343        let mut path = "/api/v1/misc/tracking/detect".to_string();
1344
1345        let mut query: Vec<(String, String)> = Vec::new();
1346        query.push(("tracking_number".to_string(), params.tracking_number_query.clone()));
1347        let query = if query.is_empty() { None } else { Some(query) };
1348
1349        let mut extra_headers = HeaderMap::new();
1350        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1351        let body = None;
1352
1353        self.client
1354            .request_json(
1355                Method::GET,
1356                &path,
1357                headers,
1358                query,
1359                body,
1360            )
1361            .await
1362    }
1363/// 查询快递物流信息
1364    #[instrument(skip(self, params))]
1365    pub async fn get_misc_tracking_query(&self, params: GetMiscTrackingQueryParams) -> Result<Value> {
1366        let mut path = "/api/v1/misc/tracking/query".to_string();
1367
1368        let mut query: Vec<(String, String)> = Vec::new();
1369        query.push(("tracking_number".to_string(), params.tracking_number_query.clone()));
1370        if let Some(value) = &params.carrier_code_query {
1371            query.push(("carrier_code".to_string(), value.clone()));
1372        }
1373        if let Some(value) = &params.phone_query {
1374            query.push(("phone".to_string(), value.clone()));
1375        }
1376        let query = if query.is_empty() { None } else { Some(query) };
1377
1378        let mut extra_headers = HeaderMap::new();
1379        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1380        let body = None;
1381
1382        self.client
1383            .request_json(
1384                Method::GET,
1385                &path,
1386                headers,
1387                query,
1388                body,
1389            )
1390            .await
1391    }
1392/// 查询天气
1393    #[instrument(skip(self, params))]
1394    pub async fn get_misc_weather(&self, params: GetMiscWeatherParams) -> Result<Value> {
1395        let mut path = "/api/v1/misc/weather".to_string();
1396
1397        let mut query: Vec<(String, String)> = Vec::new();
1398        if let Some(value) = &params.city_query {
1399            query.push(("city".to_string(), value.clone()));
1400        }
1401        if let Some(value) = &params.adcode_query {
1402            query.push(("adcode".to_string(), value.clone()));
1403        }
1404        if let Some(value) = &params.extended_query {
1405            query.push(("extended".to_string(), value.clone()));
1406        }
1407        if let Some(value) = &params.forecast_query {
1408            query.push(("forecast".to_string(), value.clone()));
1409        }
1410        if let Some(value) = &params.hourly_query {
1411            query.push(("hourly".to_string(), value.clone()));
1412        }
1413        if let Some(value) = &params.minutely_query {
1414            query.push(("minutely".to_string(), value.clone()));
1415        }
1416        if let Some(value) = &params.indices_query {
1417            query.push(("indices".to_string(), value.clone()));
1418        }
1419        if let Some(value) = &params.lang_query {
1420            query.push(("lang".to_string(), value.clone()));
1421        }
1422        let query = if query.is_empty() { None } else { Some(query) };
1423
1424        let mut extra_headers = HeaderMap::new();
1425        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1426        let body = None;
1427
1428        self.client
1429            .request_json(
1430                Method::GET,
1431                &path,
1432                headers,
1433                query,
1434                body,
1435            )
1436            .await
1437    }
1438/// 查询世界时间
1439    #[instrument(skip(self, params))]
1440    pub async fn get_misc_worldtime(&self, params: GetMiscWorldtimeParams) -> Result<Value> {
1441        let mut path = "/api/v1/misc/worldtime".to_string();
1442
1443        let mut query: Vec<(String, String)> = Vec::new();
1444        query.push(("city".to_string(), params.city_query.clone()));
1445        let query = if query.is_empty() { None } else { Some(query) };
1446
1447        let mut extra_headers = HeaderMap::new();
1448        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1449        let body = None;
1450
1451        self.client
1452            .request_json(
1453                Method::GET,
1454                &path,
1455                headers,
1456                query,
1457                body,
1458            )
1459            .await
1460    }
1461/// 计算两个日期之间的时间差值
1462    #[instrument(skip(self, params))]
1463    pub async fn post_misc_date_diff(&self, params: PostMiscDateDiffParams) -> Result<Value> {
1464        let mut path = "/api/v1/misc/date-diff".to_string();
1465
1466        let mut query: Vec<(String, String)> = Vec::new();
1467        let query = if query.is_empty() { None } else { Some(query) };
1468
1469        let mut extra_headers = HeaderMap::new();
1470        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1471        let body = params.body.clone();
1472
1473        self.client
1474            .request_json(
1475                Method::POST,
1476                &path,
1477                headers,
1478                query,
1479                body,
1480            )
1481            .await
1482    }
1483}
1484
1485#[derive(Debug, Clone)]
1486pub struct GetHistoryProgrammerParams {
1487    pub month_query: String,
1488    pub day_query: String,
1489}
1490
1491impl GetHistoryProgrammerParams {
1492    pub fn new(month_query: impl Into<String>, day_query: impl Into<String>) -> Self {
1493        Self {
1494            month_query: month_query.into(),
1495            day_query: day_query.into(),
1496        }
1497    }
1498}
1499
1500
1501#[derive(Debug, Clone)]
1502pub struct GetMiscDistrictParams {
1503    pub keywords_query: Option<String>,
1504    pub adcode_query: Option<String>,
1505    pub lat_query: Option<String>,
1506    pub lng_query: Option<String>,
1507    pub level_query: Option<String>,
1508    pub country_query: Option<String>,
1509    pub limit_query: Option<String>,
1510}
1511
1512impl GetMiscDistrictParams {
1513    pub fn new() -> Self {
1514        Self {
1515            keywords_query: None,
1516            adcode_query: None,
1517            lat_query: None,
1518            lng_query: None,
1519            level_query: None,
1520            country_query: None,
1521            limit_query: None,
1522        }
1523    }
1524    pub fn keywords_query(mut self, value: impl Into<String>) -> Self {
1525        self.keywords_query = Some(value.into());
1526        self
1527    }
1528    pub fn adcode_query(mut self, value: impl Into<String>) -> Self {
1529        self.adcode_query = Some(value.into());
1530        self
1531    }
1532    pub fn lat_query(mut self, value: impl Into<String>) -> Self {
1533        self.lat_query = Some(value.into());
1534        self
1535    }
1536    pub fn lng_query(mut self, value: impl Into<String>) -> Self {
1537        self.lng_query = Some(value.into());
1538        self
1539    }
1540    pub fn level_query(mut self, value: impl Into<String>) -> Self {
1541        self.level_query = Some(value.into());
1542        self
1543    }
1544    pub fn country_query(mut self, value: impl Into<String>) -> Self {
1545        self.country_query = Some(value.into());
1546        self
1547    }
1548    pub fn limit_query(mut self, value: impl Into<String>) -> Self {
1549        self.limit_query = Some(value.into());
1550        self
1551    }
1552}
1553
1554#[derive(Debug, Clone)]
1555pub struct GetMiscHolidayCalendarParams {
1556    pub date_query: Option<String>,
1557    pub month_query: Option<String>,
1558    pub year_query: Option<String>,
1559    pub timezone_query: Option<String>,
1560    pub holiday_type_query: Option<String>,
1561    pub include_nearby_query: Option<String>,
1562    pub nearby_limit_query: Option<String>,
1563}
1564
1565impl GetMiscHolidayCalendarParams {
1566    pub fn new() -> Self {
1567        Self {
1568            date_query: None,
1569            month_query: None,
1570            year_query: None,
1571            timezone_query: None,
1572            holiday_type_query: None,
1573            include_nearby_query: None,
1574            nearby_limit_query: None,
1575        }
1576    }
1577    pub fn date_query(mut self, value: impl Into<String>) -> Self {
1578        self.date_query = Some(value.into());
1579        self
1580    }
1581    pub fn month_query(mut self, value: impl Into<String>) -> Self {
1582        self.month_query = Some(value.into());
1583        self
1584    }
1585    pub fn year_query(mut self, value: impl Into<String>) -> Self {
1586        self.year_query = Some(value.into());
1587        self
1588    }
1589    pub fn timezone_query(mut self, value: impl Into<String>) -> Self {
1590        self.timezone_query = Some(value.into());
1591        self
1592    }
1593    pub fn holiday_type_query(mut self, value: impl Into<String>) -> Self {
1594        self.holiday_type_query = Some(value.into());
1595        self
1596    }
1597    pub fn include_nearby_query(mut self, value: impl Into<String>) -> Self {
1598        self.include_nearby_query = Some(value.into());
1599        self
1600    }
1601    pub fn nearby_limit_query(mut self, value: impl Into<String>) -> Self {
1602        self.nearby_limit_query = Some(value.into());
1603        self
1604    }
1605}
1606
1607#[derive(Debug, Clone)]
1608pub struct GetMiscHotboardParams {
1609    pub type_query: String,
1610    pub time_query: Option<String>,
1611    pub keyword_query: Option<String>,
1612    pub time_start_query: Option<String>,
1613    pub time_end_query: Option<String>,
1614    pub limit_query: Option<String>,
1615    pub sources_query: Option<String>,
1616}
1617
1618impl GetMiscHotboardParams {
1619    pub fn new(type_query: impl Into<String>) -> Self {
1620        Self {
1621            type_query: type_query.into(),
1622            time_query: None,
1623            keyword_query: None,
1624            time_start_query: None,
1625            time_end_query: None,
1626            limit_query: None,
1627            sources_query: None,
1628        }
1629    }
1630    pub fn time_query(mut self, value: impl Into<String>) -> Self {
1631        self.time_query = Some(value.into());
1632        self
1633    }
1634    pub fn keyword_query(mut self, value: impl Into<String>) -> Self {
1635        self.keyword_query = Some(value.into());
1636        self
1637    }
1638    pub fn time_start_query(mut self, value: impl Into<String>) -> Self {
1639        self.time_start_query = Some(value.into());
1640        self
1641    }
1642    pub fn time_end_query(mut self, value: impl Into<String>) -> Self {
1643        self.time_end_query = Some(value.into());
1644        self
1645    }
1646    pub fn limit_query(mut self, value: impl Into<String>) -> Self {
1647        self.limit_query = Some(value.into());
1648        self
1649    }
1650    pub fn sources_query(mut self, value: impl Into<String>) -> Self {
1651        self.sources_query = Some(value.into());
1652        self
1653    }
1654}
1655
1656#[derive(Debug, Clone)]
1657pub struct GetMiscLunartimeParams {
1658    pub ts_query: Option<String>,
1659    pub timezone_query: Option<String>,
1660}
1661
1662impl GetMiscLunartimeParams {
1663    pub fn new() -> Self {
1664        Self {
1665            ts_query: None,
1666            timezone_query: None,
1667        }
1668    }
1669    pub fn ts_query(mut self, value: impl Into<String>) -> Self {
1670        self.ts_query = Some(value.into());
1671        self
1672    }
1673    pub fn timezone_query(mut self, value: impl Into<String>) -> Self {
1674        self.timezone_query = Some(value.into());
1675        self
1676    }
1677}
1678
1679#[derive(Debug, Clone)]
1680pub struct GetMiscPhoneinfoParams {
1681    pub phone_query: String,
1682}
1683
1684impl GetMiscPhoneinfoParams {
1685    pub fn new(phone_query: impl Into<String>) -> Self {
1686        Self {
1687            phone_query: phone_query.into(),
1688        }
1689    }
1690}
1691
1692#[derive(Debug, Clone)]
1693pub struct GetMiscRandomnumberParams {
1694    pub min_query: Option<String>,
1695    pub max_query: Option<String>,
1696    pub count_query: Option<String>,
1697    pub allow_repeat_query: Option<String>,
1698    pub allow_decimal_query: Option<String>,
1699    pub decimal_places_query: Option<String>,
1700}
1701
1702impl GetMiscRandomnumberParams {
1703    pub fn new() -> Self {
1704        Self {
1705            min_query: None,
1706            max_query: None,
1707            count_query: None,
1708            allow_repeat_query: None,
1709            allow_decimal_query: None,
1710            decimal_places_query: None,
1711        }
1712    }
1713    pub fn min_query(mut self, value: impl Into<String>) -> Self {
1714        self.min_query = Some(value.into());
1715        self
1716    }
1717    pub fn max_query(mut self, value: impl Into<String>) -> Self {
1718        self.max_query = Some(value.into());
1719        self
1720    }
1721    pub fn count_query(mut self, value: impl Into<String>) -> Self {
1722        self.count_query = Some(value.into());
1723        self
1724    }
1725    pub fn allow_repeat_query(mut self, value: impl Into<String>) -> Self {
1726        self.allow_repeat_query = Some(value.into());
1727        self
1728    }
1729    pub fn allow_decimal_query(mut self, value: impl Into<String>) -> Self {
1730        self.allow_decimal_query = Some(value.into());
1731        self
1732    }
1733    pub fn decimal_places_query(mut self, value: impl Into<String>) -> Self {
1734        self.decimal_places_query = Some(value.into());
1735        self
1736    }
1737}
1738
1739#[derive(Debug, Clone)]
1740pub struct GetMiscTimestampParams {
1741    pub ts_query: String,
1742}
1743
1744impl GetMiscTimestampParams {
1745    pub fn new(ts_query: impl Into<String>) -> Self {
1746        Self {
1747            ts_query: ts_query.into(),
1748        }
1749    }
1750}
1751
1752
1753#[derive(Debug, Clone)]
1754pub struct GetMiscTrackingDetectParams {
1755    pub tracking_number_query: String,
1756}
1757
1758impl GetMiscTrackingDetectParams {
1759    pub fn new(tracking_number_query: impl Into<String>) -> Self {
1760        Self {
1761            tracking_number_query: tracking_number_query.into(),
1762        }
1763    }
1764}
1765
1766#[derive(Debug, Clone)]
1767pub struct GetMiscTrackingQueryParams {
1768    pub tracking_number_query: String,
1769    pub carrier_code_query: Option<String>,
1770    pub phone_query: Option<String>,
1771}
1772
1773impl GetMiscTrackingQueryParams {
1774    pub fn new(tracking_number_query: impl Into<String>) -> Self {
1775        Self {
1776            tracking_number_query: tracking_number_query.into(),
1777            carrier_code_query: None,
1778            phone_query: None,
1779        }
1780    }
1781    pub fn carrier_code_query(mut self, value: impl Into<String>) -> Self {
1782        self.carrier_code_query = Some(value.into());
1783        self
1784    }
1785    pub fn phone_query(mut self, value: impl Into<String>) -> Self {
1786        self.phone_query = Some(value.into());
1787        self
1788    }
1789}
1790
1791#[derive(Debug, Clone)]
1792pub struct GetMiscWeatherParams {
1793    pub city_query: Option<String>,
1794    pub adcode_query: Option<String>,
1795    pub extended_query: Option<String>,
1796    pub forecast_query: Option<String>,
1797    pub hourly_query: Option<String>,
1798    pub minutely_query: Option<String>,
1799    pub indices_query: Option<String>,
1800    pub lang_query: Option<String>,
1801}
1802
1803impl GetMiscWeatherParams {
1804    pub fn new() -> Self {
1805        Self {
1806            city_query: None,
1807            adcode_query: None,
1808            extended_query: None,
1809            forecast_query: None,
1810            hourly_query: None,
1811            minutely_query: None,
1812            indices_query: None,
1813            lang_query: None,
1814        }
1815    }
1816    pub fn city_query(mut self, value: impl Into<String>) -> Self {
1817        self.city_query = Some(value.into());
1818        self
1819    }
1820    pub fn adcode_query(mut self, value: impl Into<String>) -> Self {
1821        self.adcode_query = Some(value.into());
1822        self
1823    }
1824    pub fn extended_query(mut self, value: impl Into<String>) -> Self {
1825        self.extended_query = Some(value.into());
1826        self
1827    }
1828    pub fn forecast_query(mut self, value: impl Into<String>) -> Self {
1829        self.forecast_query = Some(value.into());
1830        self
1831    }
1832    pub fn hourly_query(mut self, value: impl Into<String>) -> Self {
1833        self.hourly_query = Some(value.into());
1834        self
1835    }
1836    pub fn minutely_query(mut self, value: impl Into<String>) -> Self {
1837        self.minutely_query = Some(value.into());
1838        self
1839    }
1840    pub fn indices_query(mut self, value: impl Into<String>) -> Self {
1841        self.indices_query = Some(value.into());
1842        self
1843    }
1844    pub fn lang_query(mut self, value: impl Into<String>) -> Self {
1845        self.lang_query = Some(value.into());
1846        self
1847    }
1848}
1849
1850#[derive(Debug, Clone)]
1851pub struct GetMiscWorldtimeParams {
1852    pub city_query: String,
1853}
1854
1855impl GetMiscWorldtimeParams {
1856    pub fn new(city_query: impl Into<String>) -> Self {
1857        Self {
1858            city_query: city_query.into(),
1859        }
1860    }
1861}
1862
1863#[derive(Debug, Clone)]
1864pub struct PostMiscDateDiffParams {
1865    pub body: Option<Value>,
1866}
1867
1868impl PostMiscDateDiffParams {
1869    pub fn new() -> Self {
1870        Self {
1871            body: None,
1872        }
1873    }
1874    pub fn body(mut self, value: Value) -> Self {
1875        self.body = Some(value);
1876        self
1877    }
1878}
1879#[derive(Debug, Clone)]
1880pub struct NetworkService<'a> {
1881    pub(crate) client: &'a Client,
1882}
1883
1884impl<'a> NetworkService<'a> {
1885/// 执行DNS解析查询
1886    #[instrument(skip(self, params))]
1887    pub async fn get_network_dns(&self, params: GetNetworkDnsParams) -> Result<Value> {
1888        let mut path = "/api/v1/network/dns".to_string();
1889
1890        let mut query: Vec<(String, String)> = Vec::new();
1891        query.push(("domain".to_string(), params.domain_query.clone()));
1892        if let Some(value) = &params.type_query {
1893            query.push(("type".to_string(), value.clone()));
1894        }
1895        let query = if query.is_empty() { None } else { Some(query) };
1896
1897        let mut extra_headers = HeaderMap::new();
1898        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1899        let body = None;
1900
1901        self.client
1902            .request_json(
1903                Method::GET,
1904                &path,
1905                headers,
1906                query,
1907                body,
1908            )
1909            .await
1910    }
1911/// 查询域名ICP备案信息
1912    #[instrument(skip(self, params))]
1913    pub async fn get_network_icp(&self, params: GetNetworkIcpParams) -> Result<Value> {
1914        let mut path = "/api/v1/network/icp".to_string();
1915
1916        let mut query: Vec<(String, String)> = Vec::new();
1917        query.push(("domain".to_string(), params.domain_query.clone()));
1918        let query = if query.is_empty() { None } else { Some(query) };
1919
1920        let mut extra_headers = HeaderMap::new();
1921        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1922        let body = None;
1923
1924        self.client
1925            .request_json(
1926                Method::GET,
1927                &path,
1928                headers,
1929                query,
1930                body,
1931            )
1932            .await
1933    }
1934/// 查询 IP
1935    #[instrument(skip(self, params))]
1936    pub async fn get_network_ipinfo(&self, params: GetNetworkIpinfoParams) -> Result<Value> {
1937        let mut path = "/api/v1/network/ipinfo".to_string();
1938
1939        let mut query: Vec<(String, String)> = Vec::new();
1940        query.push(("ip".to_string(), params.ip_query.clone()));
1941        if let Some(value) = &params.source_query {
1942            query.push(("source".to_string(), value.clone()));
1943        }
1944        let query = if query.is_empty() { None } else { Some(query) };
1945
1946        let mut extra_headers = HeaderMap::new();
1947        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1948        let body = None;
1949
1950        self.client
1951            .request_json(
1952                Method::GET,
1953                &path,
1954                headers,
1955                query,
1956                body,
1957            )
1958            .await
1959    }
1960/// 查询我的 IP
1961    #[instrument(skip(self, params))]
1962    pub async fn get_network_myip(&self, params: GetNetworkMyipParams) -> Result<Value> {
1963        let mut path = "/api/v1/network/myip".to_string();
1964
1965        let mut query: Vec<(String, String)> = Vec::new();
1966        if let Some(value) = &params.source_query {
1967            query.push(("source".to_string(), value.clone()));
1968        }
1969        let query = if query.is_empty() { None } else { Some(query) };
1970
1971        let mut extra_headers = HeaderMap::new();
1972        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1973        let body = None;
1974
1975        self.client
1976            .request_json(
1977                Method::GET,
1978                &path,
1979                headers,
1980                query,
1981                body,
1982            )
1983            .await
1984    }
1985/// Ping 主机
1986    #[instrument(skip(self, params))]
1987    pub async fn get_network_ping(&self, params: GetNetworkPingParams) -> Result<Value> {
1988        let mut path = "/api/v1/network/ping".to_string();
1989
1990        let mut query: Vec<(String, String)> = Vec::new();
1991        query.push(("host".to_string(), params.host_query.clone()));
1992        let query = if query.is_empty() { None } else { Some(query) };
1993
1994        let mut extra_headers = HeaderMap::new();
1995        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1996        let body = None;
1997
1998        self.client
1999            .request_json(
2000                Method::GET,
2001                &path,
2002                headers,
2003                query,
2004                body,
2005            )
2006            .await
2007    }
2008/// Ping 我的 IP
2009    #[instrument(skip(self))]
2010    pub async fn get_network_pingmyip(&self) -> Result<Value> {
2011        let mut path = "/api/v1/network/pingmyip".to_string();
2012
2013        let mut query: Vec<(String, String)> = Vec::new();
2014        let query = if query.is_empty() { None } else { Some(query) };
2015
2016        let mut extra_headers = HeaderMap::new();
2017        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2018        let body = None;
2019
2020        self.client
2021            .request_json(
2022                Method::GET,
2023                &path,
2024                headers,
2025                query,
2026                body,
2027            )
2028            .await
2029    }
2030/// 端口扫描
2031    #[instrument(skip(self, params))]
2032    pub async fn get_network_portscan(&self, params: GetNetworkPortscanParams) -> Result<Value> {
2033        let mut path = "/api/v1/network/portscan".to_string();
2034
2035        let mut query: Vec<(String, String)> = Vec::new();
2036        query.push(("host".to_string(), params.host_query.clone()));
2037        query.push(("port".to_string(), params.port_query.clone()));
2038        if let Some(value) = &params.protocol_query {
2039            query.push(("protocol".to_string(), value.clone()));
2040        }
2041        let query = if query.is_empty() { None } else { Some(query) };
2042
2043        let mut extra_headers = HeaderMap::new();
2044        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2045        let body = None;
2046
2047        self.client
2048            .request_json(
2049                Method::GET,
2050                &path,
2051                headers,
2052                query,
2053                body,
2054            )
2055            .await
2056    }
2057/// 检查URL的可访问性状态
2058    #[instrument(skip(self, params))]
2059    pub async fn get_network_urlstatus(&self, params: GetNetworkUrlstatusParams) -> Result<Value> {
2060        let mut path = "/api/v1/network/urlstatus".to_string();
2061
2062        let mut query: Vec<(String, String)> = Vec::new();
2063        query.push(("url".to_string(), params.url_query.clone()));
2064        let query = if query.is_empty() { None } else { Some(query) };
2065
2066        let mut extra_headers = HeaderMap::new();
2067        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2068        let body = None;
2069
2070        self.client
2071            .request_json(
2072                Method::GET,
2073                &path,
2074                headers,
2075                query,
2076                body,
2077            )
2078            .await
2079    }
2080/// 查询域名的WHOIS注册信息
2081    #[instrument(skip(self, params))]
2082    pub async fn get_network_whois(&self, params: GetNetworkWhoisParams) -> Result<Value> {
2083        let mut path = "/api/v1/network/whois".to_string();
2084
2085        let mut query: Vec<(String, String)> = Vec::new();
2086        query.push(("domain".to_string(), params.domain_query.clone()));
2087        if let Some(value) = &params.format_query {
2088            query.push(("format".to_string(), value.clone()));
2089        }
2090        let query = if query.is_empty() { None } else { Some(query) };
2091
2092        let mut extra_headers = HeaderMap::new();
2093        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2094        let body = None;
2095
2096        self.client
2097            .request_json(
2098                Method::GET,
2099                &path,
2100                headers,
2101                query,
2102                body,
2103            )
2104            .await
2105    }
2106/// 检查域名在微信中的访问状态
2107    #[instrument(skip(self, params))]
2108    pub async fn get_network_wxdomain(&self, params: GetNetworkWxdomainParams) -> Result<Value> {
2109        let mut path = "/api/v1/network/wxdomain".to_string();
2110
2111        let mut query: Vec<(String, String)> = Vec::new();
2112        query.push(("domain".to_string(), params.domain_query.clone()));
2113        let query = if query.is_empty() { None } else { Some(query) };
2114
2115        let mut extra_headers = HeaderMap::new();
2116        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2117        let body = None;
2118
2119        self.client
2120            .request_json(
2121                Method::GET,
2122                &path,
2123                headers,
2124                query,
2125                body,
2126            )
2127            .await
2128    }
2129}
2130
2131#[derive(Debug, Clone)]
2132pub struct GetNetworkDnsParams {
2133    pub domain_query: String,
2134    pub type_query: Option<String>,
2135}
2136
2137impl GetNetworkDnsParams {
2138    pub fn new(domain_query: impl Into<String>) -> Self {
2139        Self {
2140            domain_query: domain_query.into(),
2141            type_query: None,
2142        }
2143    }
2144    pub fn type_query(mut self, value: impl Into<String>) -> Self {
2145        self.type_query = Some(value.into());
2146        self
2147    }
2148}
2149
2150#[derive(Debug, Clone)]
2151pub struct GetNetworkIcpParams {
2152    pub domain_query: String,
2153}
2154
2155impl GetNetworkIcpParams {
2156    pub fn new(domain_query: impl Into<String>) -> Self {
2157        Self {
2158            domain_query: domain_query.into(),
2159        }
2160    }
2161}
2162
2163#[derive(Debug, Clone)]
2164pub struct GetNetworkIpinfoParams {
2165    pub ip_query: String,
2166    pub source_query: Option<String>,
2167}
2168
2169impl GetNetworkIpinfoParams {
2170    pub fn new(ip_query: impl Into<String>) -> Self {
2171        Self {
2172            ip_query: ip_query.into(),
2173            source_query: None,
2174        }
2175    }
2176    pub fn source_query(mut self, value: impl Into<String>) -> Self {
2177        self.source_query = Some(value.into());
2178        self
2179    }
2180}
2181
2182#[derive(Debug, Clone)]
2183pub struct GetNetworkMyipParams {
2184    pub source_query: Option<String>,
2185}
2186
2187impl GetNetworkMyipParams {
2188    pub fn new() -> Self {
2189        Self {
2190            source_query: None,
2191        }
2192    }
2193    pub fn source_query(mut self, value: impl Into<String>) -> Self {
2194        self.source_query = Some(value.into());
2195        self
2196    }
2197}
2198
2199#[derive(Debug, Clone)]
2200pub struct GetNetworkPingParams {
2201    pub host_query: String,
2202}
2203
2204impl GetNetworkPingParams {
2205    pub fn new(host_query: impl Into<String>) -> Self {
2206        Self {
2207            host_query: host_query.into(),
2208        }
2209    }
2210}
2211
2212
2213#[derive(Debug, Clone)]
2214pub struct GetNetworkPortscanParams {
2215    pub host_query: String,
2216    pub port_query: String,
2217    pub protocol_query: Option<String>,
2218}
2219
2220impl GetNetworkPortscanParams {
2221    pub fn new(host_query: impl Into<String>, port_query: impl Into<String>) -> Self {
2222        Self {
2223            host_query: host_query.into(),
2224            port_query: port_query.into(),
2225            protocol_query: None,
2226        }
2227    }
2228    pub fn protocol_query(mut self, value: impl Into<String>) -> Self {
2229        self.protocol_query = Some(value.into());
2230        self
2231    }
2232}
2233
2234#[derive(Debug, Clone)]
2235pub struct GetNetworkUrlstatusParams {
2236    pub url_query: String,
2237}
2238
2239impl GetNetworkUrlstatusParams {
2240    pub fn new(url_query: impl Into<String>) -> Self {
2241        Self {
2242            url_query: url_query.into(),
2243        }
2244    }
2245}
2246
2247#[derive(Debug, Clone)]
2248pub struct GetNetworkWhoisParams {
2249    pub domain_query: String,
2250    pub format_query: Option<String>,
2251}
2252
2253impl GetNetworkWhoisParams {
2254    pub fn new(domain_query: impl Into<String>) -> Self {
2255        Self {
2256            domain_query: domain_query.into(),
2257            format_query: None,
2258        }
2259    }
2260    pub fn format_query(mut self, value: impl Into<String>) -> Self {
2261        self.format_query = Some(value.into());
2262        self
2263    }
2264}
2265
2266#[derive(Debug, Clone)]
2267pub struct GetNetworkWxdomainParams {
2268    pub domain_query: String,
2269}
2270
2271impl GetNetworkWxdomainParams {
2272    pub fn new(domain_query: impl Into<String>) -> Self {
2273        Self {
2274            domain_query: domain_query.into(),
2275        }
2276    }
2277}
2278#[derive(Debug, Clone)]
2279pub struct PoemService<'a> {
2280    pub(crate) client: &'a Client,
2281}
2282
2283impl<'a> PoemService<'a> {
2284/// 一言
2285    #[instrument(skip(self))]
2286    pub async fn get_saying(&self) -> Result<Value> {
2287        let mut path = "/api/v1/saying".to_string();
2288
2289        let mut query: Vec<(String, String)> = Vec::new();
2290        let query = if query.is_empty() { None } else { Some(query) };
2291
2292        let mut extra_headers = HeaderMap::new();
2293        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2294        let body = None;
2295
2296        self.client
2297            .request_json(
2298                Method::GET,
2299                &path,
2300                headers,
2301                query,
2302                body,
2303            )
2304            .await
2305    }
2306}
2307
2308#[derive(Debug, Clone)]
2309pub struct RandomService<'a> {
2310    pub(crate) client: &'a Client,
2311}
2312
2313impl<'a> RandomService<'a> {
2314/// 答案之书
2315    #[instrument(skip(self, params))]
2316    pub async fn get_answerbook_ask(&self, params: GetAnswerbookAskParams) -> Result<Value> {
2317        let mut path = "/api/v1/answerbook/ask".to_string();
2318
2319        let mut query: Vec<(String, String)> = Vec::new();
2320        query.push(("question".to_string(), params.question_query.clone()));
2321        let query = if query.is_empty() { None } else { Some(query) };
2322
2323        let mut extra_headers = HeaderMap::new();
2324        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2325        let body = None;
2326
2327        self.client
2328            .request_json(
2329                Method::GET,
2330                &path,
2331                headers,
2332                query,
2333                body,
2334            )
2335            .await
2336    }
2337/// 随机图片
2338    #[instrument(skip(self, params))]
2339    pub async fn get_random_image(&self, params: GetRandomImageParams) -> Result<Value> {
2340        let mut path = "/api/v1/random/image".to_string();
2341
2342        let mut query: Vec<(String, String)> = Vec::new();
2343        if let Some(value) = &params.category_query {
2344            query.push(("category".to_string(), value.clone()));
2345        }
2346        if let Some(value) = &params.type_query {
2347            query.push(("type".to_string(), value.clone()));
2348        }
2349        let query = if query.is_empty() { None } else { Some(query) };
2350
2351        let mut extra_headers = HeaderMap::new();
2352        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2353        let body = None;
2354
2355        self.client
2356            .request_json(
2357                Method::GET,
2358                &path,
2359                headers,
2360                query,
2361                body,
2362            )
2363            .await
2364    }
2365/// 随机字符串
2366    #[instrument(skip(self, params))]
2367    pub async fn get_random_string(&self, params: GetRandomStringParams) -> Result<Value> {
2368        let mut path = "/api/v1/random/string".to_string();
2369
2370        let mut query: Vec<(String, String)> = Vec::new();
2371        if let Some(value) = &params.length_query {
2372            query.push(("length".to_string(), value.clone()));
2373        }
2374        if let Some(value) = &params.type_query {
2375            query.push(("type".to_string(), value.clone()));
2376        }
2377        let query = if query.is_empty() { None } else { Some(query) };
2378
2379        let mut extra_headers = HeaderMap::new();
2380        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2381        let body = None;
2382
2383        self.client
2384            .request_json(
2385                Method::GET,
2386                &path,
2387                headers,
2388                query,
2389                body,
2390            )
2391            .await
2392    }
2393/// 答案之书 (POST)
2394    #[instrument(skip(self, params))]
2395    pub async fn post_answerbook_ask(&self, params: PostAnswerbookAskParams) -> Result<Value> {
2396        let mut path = "/api/v1/answerbook/ask".to_string();
2397
2398        let mut query: Vec<(String, String)> = Vec::new();
2399        let query = if query.is_empty() { None } else { Some(query) };
2400
2401        let mut extra_headers = HeaderMap::new();
2402        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2403        let body = params.body.clone();
2404
2405        self.client
2406            .request_json(
2407                Method::POST,
2408                &path,
2409                headers,
2410                query,
2411                body,
2412            )
2413            .await
2414    }
2415}
2416
2417#[derive(Debug, Clone)]
2418pub struct GetAnswerbookAskParams {
2419    pub question_query: String,
2420}
2421
2422impl GetAnswerbookAskParams {
2423    pub fn new(question_query: impl Into<String>) -> Self {
2424        Self {
2425            question_query: question_query.into(),
2426        }
2427    }
2428}
2429
2430#[derive(Debug, Clone)]
2431pub struct GetRandomImageParams {
2432    pub category_query: Option<String>,
2433    pub type_query: Option<String>,
2434}
2435
2436impl GetRandomImageParams {
2437    pub fn new() -> Self {
2438        Self {
2439            category_query: None,
2440            type_query: None,
2441        }
2442    }
2443    pub fn category_query(mut self, value: impl Into<String>) -> Self {
2444        self.category_query = Some(value.into());
2445        self
2446    }
2447    pub fn type_query(mut self, value: impl Into<String>) -> Self {
2448        self.type_query = Some(value.into());
2449        self
2450    }
2451}
2452
2453#[derive(Debug, Clone)]
2454pub struct GetRandomStringParams {
2455    pub length_query: Option<String>,
2456    pub type_query: Option<String>,
2457}
2458
2459impl GetRandomStringParams {
2460    pub fn new() -> Self {
2461        Self {
2462            length_query: None,
2463            type_query: None,
2464        }
2465    }
2466    pub fn length_query(mut self, value: impl Into<String>) -> Self {
2467        self.length_query = Some(value.into());
2468        self
2469    }
2470    pub fn type_query(mut self, value: impl Into<String>) -> Self {
2471        self.type_query = Some(value.into());
2472        self
2473    }
2474}
2475
2476#[derive(Debug, Clone)]
2477pub struct PostAnswerbookAskParams {
2478    pub body: Option<Value>,
2479}
2480
2481impl PostAnswerbookAskParams {
2482    pub fn new() -> Self {
2483        Self {
2484            body: None,
2485        }
2486    }
2487    pub fn body(mut self, value: Value) -> Self {
2488        self.body = Some(value);
2489        self
2490    }
2491}
2492#[derive(Debug, Clone)]
2493pub struct SocialService<'a> {
2494    pub(crate) client: &'a Client,
2495}
2496
2497impl<'a> SocialService<'a> {
2498/// 查询 GitHub 仓库
2499    #[instrument(skip(self, params))]
2500    pub async fn get_github_repo(&self, params: GetGithubRepoParams) -> Result<Value> {
2501        let mut path = "/api/v1/github/repo".to_string();
2502
2503        let mut query: Vec<(String, String)> = Vec::new();
2504        query.push(("repo".to_string(), params.repo_query.clone()));
2505        let query = if query.is_empty() { None } else { Some(query) };
2506
2507        let mut extra_headers = HeaderMap::new();
2508        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2509        let body = None;
2510
2511        self.client
2512            .request_json(
2513                Method::GET,
2514                &path,
2515                headers,
2516                query,
2517                body,
2518            )
2519            .await
2520    }
2521/// 查询 B站投稿
2522    #[instrument(skip(self, params))]
2523    pub async fn get_social_bilibili_archives(&self, params: GetSocialBilibiliArchivesParams) -> Result<Value> {
2524        let mut path = "/api/v1/social/bilibili/archives".to_string();
2525
2526        let mut query: Vec<(String, String)> = Vec::new();
2527        query.push(("mid".to_string(), params.mid_query.clone()));
2528        if let Some(value) = &params.keywords_query {
2529            query.push(("keywords".to_string(), value.clone()));
2530        }
2531        if let Some(value) = &params.orderby_query {
2532            query.push(("orderby".to_string(), value.clone()));
2533        }
2534        if let Some(value) = &params.ps_query {
2535            query.push(("ps".to_string(), value.clone()));
2536        }
2537        if let Some(value) = &params.pn_query {
2538            query.push(("pn".to_string(), value.clone()));
2539        }
2540        let query = if query.is_empty() { None } else { Some(query) };
2541
2542        let mut extra_headers = HeaderMap::new();
2543        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2544        let body = None;
2545
2546        self.client
2547            .request_json(
2548                Method::GET,
2549                &path,
2550                headers,
2551                query,
2552                body,
2553            )
2554            .await
2555    }
2556/// 查询 B站直播间
2557    #[instrument(skip(self, params))]
2558    pub async fn get_social_bilibili_liveroom(&self, params: GetSocialBilibiliLiveroomParams) -> Result<Value> {
2559        let mut path = "/api/v1/social/bilibili/liveroom".to_string();
2560
2561        let mut query: Vec<(String, String)> = Vec::new();
2562        if let Some(value) = &params.mid_query {
2563            query.push(("mid".to_string(), value.clone()));
2564        }
2565        if let Some(value) = &params.room_id_query {
2566            query.push(("room_id".to_string(), value.clone()));
2567        }
2568        let query = if query.is_empty() { None } else { Some(query) };
2569
2570        let mut extra_headers = HeaderMap::new();
2571        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2572        let body = None;
2573
2574        self.client
2575            .request_json(
2576                Method::GET,
2577                &path,
2578                headers,
2579                query,
2580                body,
2581            )
2582            .await
2583    }
2584/// 查询 B站评论
2585    #[instrument(skip(self, params))]
2586    pub async fn get_social_bilibili_replies(&self, params: GetSocialBilibiliRepliesParams) -> Result<Value> {
2587        let mut path = "/api/v1/social/bilibili/replies".to_string();
2588
2589        let mut query: Vec<(String, String)> = Vec::new();
2590        query.push(("oid".to_string(), params.oid_query.clone()));
2591        if let Some(value) = &params.sort_query {
2592            query.push(("sort".to_string(), value.clone()));
2593        }
2594        if let Some(value) = &params.ps_query {
2595            query.push(("ps".to_string(), value.clone()));
2596        }
2597        if let Some(value) = &params.pn_query {
2598            query.push(("pn".to_string(), value.clone()));
2599        }
2600        let query = if query.is_empty() { None } else { Some(query) };
2601
2602        let mut extra_headers = HeaderMap::new();
2603        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2604        let body = None;
2605
2606        self.client
2607            .request_json(
2608                Method::GET,
2609                &path,
2610                headers,
2611                query,
2612                body,
2613            )
2614            .await
2615    }
2616/// 查询 B站用户
2617    #[instrument(skip(self, params))]
2618    pub async fn get_social_bilibili_userinfo(&self, params: GetSocialBilibiliUserinfoParams) -> Result<Value> {
2619        let mut path = "/api/v1/social/bilibili/userinfo".to_string();
2620
2621        let mut query: Vec<(String, String)> = Vec::new();
2622        query.push(("uid".to_string(), params.uid_query.clone()));
2623        let query = if query.is_empty() { None } else { Some(query) };
2624
2625        let mut extra_headers = HeaderMap::new();
2626        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2627        let body = None;
2628
2629        self.client
2630            .request_json(
2631                Method::GET,
2632                &path,
2633                headers,
2634                query,
2635                body,
2636            )
2637            .await
2638    }
2639/// 查询 B站视频
2640    #[instrument(skip(self, params))]
2641    pub async fn get_social_bilibili_videoinfo(&self, params: GetSocialBilibiliVideoinfoParams) -> Result<Value> {
2642        let mut path = "/api/v1/social/bilibili/videoinfo".to_string();
2643
2644        let mut query: Vec<(String, String)> = Vec::new();
2645        if let Some(value) = &params.aid_query {
2646            query.push(("aid".to_string(), value.clone()));
2647        }
2648        if let Some(value) = &params.bvid_query {
2649            query.push(("bvid".to_string(), value.clone()));
2650        }
2651        let query = if query.is_empty() { None } else { Some(query) };
2652
2653        let mut extra_headers = HeaderMap::new();
2654        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2655        let body = None;
2656
2657        self.client
2658            .request_json(
2659                Method::GET,
2660                &path,
2661                headers,
2662                query,
2663                body,
2664            )
2665            .await
2666    }
2667/// 查询 QQ 群信息
2668    #[instrument(skip(self, params))]
2669    pub async fn get_social_qq_groupinfo(&self, params: GetSocialQqGroupinfoParams) -> Result<Value> {
2670        let mut path = "/api/v1/social/qq/groupinfo".to_string();
2671
2672        let mut query: Vec<(String, String)> = Vec::new();
2673        query.push(("group_id".to_string(), params.group_id_query.clone()));
2674        let query = if query.is_empty() { None } else { Some(query) };
2675
2676        let mut extra_headers = HeaderMap::new();
2677        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2678        let body = None;
2679
2680        self.client
2681            .request_json(
2682                Method::GET,
2683                &path,
2684                headers,
2685                query,
2686                body,
2687            )
2688            .await
2689    }
2690/// 查询 QQ 信息
2691    #[instrument(skip(self, params))]
2692    pub async fn get_social_qq_userinfo(&self, params: GetSocialQqUserinfoParams) -> Result<Value> {
2693        let mut path = "/api/v1/social/qq/userinfo".to_string();
2694
2695        let mut query: Vec<(String, String)> = Vec::new();
2696        query.push(("qq".to_string(), params.qq_query.clone()));
2697        let query = if query.is_empty() { None } else { Some(query) };
2698
2699        let mut extra_headers = HeaderMap::new();
2700        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2701        let body = None;
2702
2703        self.client
2704            .request_json(
2705                Method::GET,
2706                &path,
2707                headers,
2708                query,
2709                body,
2710            )
2711            .await
2712    }
2713}
2714
2715#[derive(Debug, Clone)]
2716pub struct GetGithubRepoParams {
2717    pub repo_query: String,
2718}
2719
2720impl GetGithubRepoParams {
2721    pub fn new(repo_query: impl Into<String>) -> Self {
2722        Self {
2723            repo_query: repo_query.into(),
2724        }
2725    }
2726}
2727
2728#[derive(Debug, Clone)]
2729pub struct GetSocialBilibiliArchivesParams {
2730    pub mid_query: String,
2731    pub keywords_query: Option<String>,
2732    pub orderby_query: Option<String>,
2733    pub ps_query: Option<String>,
2734    pub pn_query: Option<String>,
2735}
2736
2737impl GetSocialBilibiliArchivesParams {
2738    pub fn new(mid_query: impl Into<String>) -> Self {
2739        Self {
2740            mid_query: mid_query.into(),
2741            keywords_query: None,
2742            orderby_query: None,
2743            ps_query: None,
2744            pn_query: None,
2745        }
2746    }
2747    pub fn keywords_query(mut self, value: impl Into<String>) -> Self {
2748        self.keywords_query = Some(value.into());
2749        self
2750    }
2751    pub fn orderby_query(mut self, value: impl Into<String>) -> Self {
2752        self.orderby_query = Some(value.into());
2753        self
2754    }
2755    pub fn ps_query(mut self, value: impl Into<String>) -> Self {
2756        self.ps_query = Some(value.into());
2757        self
2758    }
2759    pub fn pn_query(mut self, value: impl Into<String>) -> Self {
2760        self.pn_query = Some(value.into());
2761        self
2762    }
2763}
2764
2765#[derive(Debug, Clone)]
2766pub struct GetSocialBilibiliLiveroomParams {
2767    pub mid_query: Option<String>,
2768    pub room_id_query: Option<String>,
2769}
2770
2771impl GetSocialBilibiliLiveroomParams {
2772    pub fn new() -> Self {
2773        Self {
2774            mid_query: None,
2775            room_id_query: None,
2776        }
2777    }
2778    pub fn mid_query(mut self, value: impl Into<String>) -> Self {
2779        self.mid_query = Some(value.into());
2780        self
2781    }
2782    pub fn room_id_query(mut self, value: impl Into<String>) -> Self {
2783        self.room_id_query = Some(value.into());
2784        self
2785    }
2786}
2787
2788#[derive(Debug, Clone)]
2789pub struct GetSocialBilibiliRepliesParams {
2790    pub oid_query: String,
2791    pub sort_query: Option<String>,
2792    pub ps_query: Option<String>,
2793    pub pn_query: Option<String>,
2794}
2795
2796impl GetSocialBilibiliRepliesParams {
2797    pub fn new(oid_query: impl Into<String>) -> Self {
2798        Self {
2799            oid_query: oid_query.into(),
2800            sort_query: None,
2801            ps_query: None,
2802            pn_query: None,
2803        }
2804    }
2805    pub fn sort_query(mut self, value: impl Into<String>) -> Self {
2806        self.sort_query = Some(value.into());
2807        self
2808    }
2809    pub fn ps_query(mut self, value: impl Into<String>) -> Self {
2810        self.ps_query = Some(value.into());
2811        self
2812    }
2813    pub fn pn_query(mut self, value: impl Into<String>) -> Self {
2814        self.pn_query = Some(value.into());
2815        self
2816    }
2817}
2818
2819#[derive(Debug, Clone)]
2820pub struct GetSocialBilibiliUserinfoParams {
2821    pub uid_query: String,
2822}
2823
2824impl GetSocialBilibiliUserinfoParams {
2825    pub fn new(uid_query: impl Into<String>) -> Self {
2826        Self {
2827            uid_query: uid_query.into(),
2828        }
2829    }
2830}
2831
2832#[derive(Debug, Clone)]
2833pub struct GetSocialBilibiliVideoinfoParams {
2834    pub aid_query: Option<String>,
2835    pub bvid_query: Option<String>,
2836}
2837
2838impl GetSocialBilibiliVideoinfoParams {
2839    pub fn new() -> Self {
2840        Self {
2841            aid_query: None,
2842            bvid_query: None,
2843        }
2844    }
2845    pub fn aid_query(mut self, value: impl Into<String>) -> Self {
2846        self.aid_query = Some(value.into());
2847        self
2848    }
2849    pub fn bvid_query(mut self, value: impl Into<String>) -> Self {
2850        self.bvid_query = Some(value.into());
2851        self
2852    }
2853}
2854
2855#[derive(Debug, Clone)]
2856pub struct GetSocialQqGroupinfoParams {
2857    pub group_id_query: String,
2858}
2859
2860impl GetSocialQqGroupinfoParams {
2861    pub fn new(group_id_query: impl Into<String>) -> Self {
2862        Self {
2863            group_id_query: group_id_query.into(),
2864        }
2865    }
2866}
2867
2868#[derive(Debug, Clone)]
2869pub struct GetSocialQqUserinfoParams {
2870    pub qq_query: String,
2871}
2872
2873impl GetSocialQqUserinfoParams {
2874    pub fn new(qq_query: impl Into<String>) -> Self {
2875        Self {
2876            qq_query: qq_query.into(),
2877        }
2878    }
2879}
2880#[derive(Debug, Clone)]
2881pub struct StatusService<'a> {
2882    pub(crate) client: &'a Client,
2883}
2884
2885impl<'a> StatusService<'a> {
2886/// 限流状态
2887    #[instrument(skip(self, params))]
2888    pub async fn get_status_ratelimit(&self, params: GetStatusRatelimitParams) -> Result<Value> {
2889        let mut path = "/api/v1/status/ratelimit".to_string();
2890
2891        let mut query: Vec<(String, String)> = Vec::new();
2892        let query = if query.is_empty() { None } else { Some(query) };
2893
2894        let mut extra_headers = HeaderMap::new();
2895        extra_headers.insert(
2896            "Authorization",
2897            HeaderValue::from_str(&params.authorization_header).map_err(|_| Error::InvalidHeader { name: "Authorization".into() })?,
2898        );
2899        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2900        let body = None;
2901
2902        self.client
2903            .request_json(
2904                Method::GET,
2905                &path,
2906                headers,
2907                query,
2908                body,
2909            )
2910            .await
2911    }
2912/// 获取API端点使用统计
2913    #[instrument(skip(self, params))]
2914    pub async fn get_status_usage(&self, params: GetStatusUsageParams) -> Result<Value> {
2915        let mut path = "/api/v1/status/usage".to_string();
2916
2917        let mut query: Vec<(String, String)> = Vec::new();
2918        if let Some(value) = &params.path_query {
2919            query.push(("path".to_string(), value.clone()));
2920        }
2921        let query = if query.is_empty() { None } else { Some(query) };
2922
2923        let mut extra_headers = HeaderMap::new();
2924        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2925        let body = None;
2926
2927        self.client
2928            .request_json(
2929                Method::GET,
2930                &path,
2931                headers,
2932                query,
2933                body,
2934            )
2935            .await
2936    }
2937}
2938
2939#[derive(Debug, Clone)]
2940pub struct GetStatusRatelimitParams {
2941    pub authorization_header: String,
2942}
2943
2944impl GetStatusRatelimitParams {
2945    pub fn new(authorization_header: impl Into<String>) -> Self {
2946        Self {
2947            authorization_header: authorization_header.into(),
2948        }
2949    }
2950}
2951
2952#[derive(Debug, Clone)]
2953pub struct GetStatusUsageParams {
2954    pub path_query: Option<String>,
2955}
2956
2957impl GetStatusUsageParams {
2958    pub fn new() -> Self {
2959        Self {
2960            path_query: None,
2961        }
2962    }
2963    pub fn path_query(mut self, value: impl Into<String>) -> Self {
2964        self.path_query = Some(value.into());
2965        self
2966    }
2967}
2968#[derive(Debug, Clone)]
2969pub struct TextService<'a> {
2970    pub(crate) client: &'a Client,
2971}
2972
2973impl<'a> TextService<'a> {
2974/// MD5 哈希
2975    #[instrument(skip(self, params))]
2976    pub async fn get_text_md_5(&self, params: GetTextMd5Params) -> Result<Value> {
2977        let mut path = "/api/v1/text/md5".to_string();
2978
2979        let mut query: Vec<(String, String)> = Vec::new();
2980        query.push(("text".to_string(), params.text_query.clone()));
2981        let query = if query.is_empty() { None } else { Some(query) };
2982
2983        let mut extra_headers = HeaderMap::new();
2984        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2985        let body = None;
2986
2987        self.client
2988            .request_json(
2989                Method::GET,
2990                &path,
2991                headers,
2992                query,
2993                body,
2994            )
2995            .await
2996    }
2997/// AES 解密
2998    #[instrument(skip(self, params))]
2999    pub async fn post_text_aes_decrypt(&self, params: PostTextAesDecryptParams) -> Result<Value> {
3000        let mut path = "/api/v1/text/aes/decrypt".to_string();
3001
3002        let mut query: Vec<(String, String)> = Vec::new();
3003        let query = if query.is_empty() { None } else { Some(query) };
3004
3005        let mut extra_headers = HeaderMap::new();
3006        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3007        let body = params.body.clone();
3008
3009        self.client
3010            .request_json(
3011                Method::POST,
3012                &path,
3013                headers,
3014                query,
3015                body,
3016            )
3017            .await
3018    }
3019/// AES高级解密
3020    #[instrument(skip(self, params))]
3021    pub async fn post_text_aes_decrypt_advanced(&self, params: PostTextAesDecryptAdvancedParams) -> Result<Value> {
3022        let mut path = "/api/v1/text/aes/decrypt-advanced".to_string();
3023
3024        let mut query: Vec<(String, String)> = Vec::new();
3025        let query = if query.is_empty() { None } else { Some(query) };
3026
3027        let mut extra_headers = HeaderMap::new();
3028        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3029        let body = params.body.clone();
3030
3031        self.client
3032            .request_json(
3033                Method::POST,
3034                &path,
3035                headers,
3036                query,
3037                body,
3038            )
3039            .await
3040    }
3041/// AES 加密
3042    #[instrument(skip(self, params))]
3043    pub async fn post_text_aes_encrypt(&self, params: PostTextAesEncryptParams) -> Result<Value> {
3044        let mut path = "/api/v1/text/aes/encrypt".to_string();
3045
3046        let mut query: Vec<(String, String)> = Vec::new();
3047        let query = if query.is_empty() { None } else { Some(query) };
3048
3049        let mut extra_headers = HeaderMap::new();
3050        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3051        let body = params.body.clone();
3052
3053        self.client
3054            .request_json(
3055                Method::POST,
3056                &path,
3057                headers,
3058                query,
3059                body,
3060            )
3061            .await
3062    }
3063/// AES高级加密
3064    #[instrument(skip(self, params))]
3065    pub async fn post_text_aes_encrypt_advanced(&self, params: PostTextAesEncryptAdvancedParams) -> Result<Value> {
3066        let mut path = "/api/v1/text/aes/encrypt-advanced".to_string();
3067
3068        let mut query: Vec<(String, String)> = Vec::new();
3069        let query = if query.is_empty() { None } else { Some(query) };
3070
3071        let mut extra_headers = HeaderMap::new();
3072        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3073        let body = params.body.clone();
3074
3075        self.client
3076            .request_json(
3077                Method::POST,
3078                &path,
3079                headers,
3080                query,
3081                body,
3082            )
3083            .await
3084    }
3085/// 文本分析
3086    #[instrument(skip(self, params))]
3087    pub async fn post_text_analyze(&self, params: PostTextAnalyzeParams) -> Result<Value> {
3088        let mut path = "/api/v1/text/analyze".to_string();
3089
3090        let mut query: Vec<(String, String)> = Vec::new();
3091        let query = if query.is_empty() { None } else { Some(query) };
3092
3093        let mut extra_headers = HeaderMap::new();
3094        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3095        let body = params.body.clone();
3096
3097        self.client
3098            .request_json(
3099                Method::POST,
3100                &path,
3101                headers,
3102                query,
3103                body,
3104            )
3105            .await
3106    }
3107/// Base64 解码
3108    #[instrument(skip(self, params))]
3109    pub async fn post_text_base_64_decode(&self, params: PostTextBase64DecodeParams) -> Result<Value> {
3110        let mut path = "/api/v1/text/base64/decode".to_string();
3111
3112        let mut query: Vec<(String, String)> = Vec::new();
3113        let query = if query.is_empty() { None } else { Some(query) };
3114
3115        let mut extra_headers = HeaderMap::new();
3116        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3117        let body = params.body.clone();
3118
3119        self.client
3120            .request_json(
3121                Method::POST,
3122                &path,
3123                headers,
3124                query,
3125                body,
3126            )
3127            .await
3128    }
3129/// Base64 编码
3130    #[instrument(skip(self, params))]
3131    pub async fn post_text_base_64_encode(&self, params: PostTextBase64EncodeParams) -> Result<Value> {
3132        let mut path = "/api/v1/text/base64/encode".to_string();
3133
3134        let mut query: Vec<(String, String)> = Vec::new();
3135        let query = if query.is_empty() { None } else { Some(query) };
3136
3137        let mut extra_headers = HeaderMap::new();
3138        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3139        let body = params.body.clone();
3140
3141        self.client
3142            .request_json(
3143                Method::POST,
3144                &path,
3145                headers,
3146                query,
3147                body,
3148            )
3149            .await
3150    }
3151/// 格式转换
3152    #[instrument(skip(self, params))]
3153    pub async fn post_text_convert(&self, params: PostTextConvertParams) -> Result<Value> {
3154        let mut path = "/api/v1/text/convert".to_string();
3155
3156        let mut query: Vec<(String, String)> = Vec::new();
3157        let query = if query.is_empty() { None } else { Some(query) };
3158
3159        let mut extra_headers = HeaderMap::new();
3160        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3161        let body = params.body.clone();
3162
3163        self.client
3164            .request_json(
3165                Method::POST,
3166                &path,
3167                headers,
3168                query,
3169                body,
3170            )
3171            .await
3172    }
3173/// MD5 哈希 (POST)
3174    #[instrument(skip(self, params))]
3175    pub async fn post_text_md_5(&self, params: PostTextMd5Params) -> Result<Value> {
3176        let mut path = "/api/v1/text/md5".to_string();
3177
3178        let mut query: Vec<(String, String)> = Vec::new();
3179        let query = if query.is_empty() { None } else { Some(query) };
3180
3181        let mut extra_headers = HeaderMap::new();
3182        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3183        let body = params.body.clone();
3184
3185        self.client
3186            .request_json(
3187                Method::POST,
3188                &path,
3189                headers,
3190                query,
3191                body,
3192            )
3193            .await
3194    }
3195/// MD5 校验
3196    #[instrument(skip(self, params))]
3197    pub async fn post_text_md_5_verify(&self, params: PostTextMd5VerifyParams) -> Result<Value> {
3198        let mut path = "/api/v1/text/md5/verify".to_string();
3199
3200        let mut query: Vec<(String, String)> = Vec::new();
3201        let query = if query.is_empty() { None } else { Some(query) };
3202
3203        let mut extra_headers = HeaderMap::new();
3204        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3205        let body = params.body.clone();
3206
3207        self.client
3208            .request_json(
3209                Method::POST,
3210                &path,
3211                headers,
3212                query,
3213                body,
3214            )
3215            .await
3216    }
3217}
3218
3219#[derive(Debug, Clone)]
3220pub struct GetTextMd5Params {
3221    pub text_query: String,
3222}
3223
3224impl GetTextMd5Params {
3225    pub fn new(text_query: impl Into<String>) -> Self {
3226        Self {
3227            text_query: text_query.into(),
3228        }
3229    }
3230}
3231
3232#[derive(Debug, Clone)]
3233pub struct PostTextAesDecryptParams {
3234    pub body: Option<Value>,
3235}
3236
3237impl PostTextAesDecryptParams {
3238    pub fn new() -> Self {
3239        Self {
3240            body: None,
3241        }
3242    }
3243    pub fn body(mut self, value: Value) -> Self {
3244        self.body = Some(value);
3245        self
3246    }
3247}
3248
3249#[derive(Debug, Clone)]
3250pub struct PostTextAesDecryptAdvancedParams {
3251    pub body: Option<Value>,
3252}
3253
3254impl PostTextAesDecryptAdvancedParams {
3255    pub fn new() -> Self {
3256        Self {
3257            body: None,
3258        }
3259    }
3260    pub fn body(mut self, value: Value) -> Self {
3261        self.body = Some(value);
3262        self
3263    }
3264}
3265
3266#[derive(Debug, Clone)]
3267pub struct PostTextAesEncryptParams {
3268    pub body: Option<Value>,
3269}
3270
3271impl PostTextAesEncryptParams {
3272    pub fn new() -> Self {
3273        Self {
3274            body: None,
3275        }
3276    }
3277    pub fn body(mut self, value: Value) -> Self {
3278        self.body = Some(value);
3279        self
3280    }
3281}
3282
3283#[derive(Debug, Clone)]
3284pub struct PostTextAesEncryptAdvancedParams {
3285    pub body: Option<Value>,
3286}
3287
3288impl PostTextAesEncryptAdvancedParams {
3289    pub fn new() -> Self {
3290        Self {
3291            body: None,
3292        }
3293    }
3294    pub fn body(mut self, value: Value) -> Self {
3295        self.body = Some(value);
3296        self
3297    }
3298}
3299
3300#[derive(Debug, Clone)]
3301pub struct PostTextAnalyzeParams {
3302    pub body: Option<Value>,
3303}
3304
3305impl PostTextAnalyzeParams {
3306    pub fn new() -> Self {
3307        Self {
3308            body: None,
3309        }
3310    }
3311    pub fn body(mut self, value: Value) -> Self {
3312        self.body = Some(value);
3313        self
3314    }
3315}
3316
3317#[derive(Debug, Clone)]
3318pub struct PostTextBase64DecodeParams {
3319    pub body: Option<Value>,
3320}
3321
3322impl PostTextBase64DecodeParams {
3323    pub fn new() -> Self {
3324        Self {
3325            body: None,
3326        }
3327    }
3328    pub fn body(mut self, value: Value) -> Self {
3329        self.body = Some(value);
3330        self
3331    }
3332}
3333
3334#[derive(Debug, Clone)]
3335pub struct PostTextBase64EncodeParams {
3336    pub body: Option<Value>,
3337}
3338
3339impl PostTextBase64EncodeParams {
3340    pub fn new() -> Self {
3341        Self {
3342            body: None,
3343        }
3344    }
3345    pub fn body(mut self, value: Value) -> Self {
3346        self.body = Some(value);
3347        self
3348    }
3349}
3350
3351#[derive(Debug, Clone)]
3352pub struct PostTextConvertParams {
3353    pub body: Option<Value>,
3354}
3355
3356impl PostTextConvertParams {
3357    pub fn new() -> Self {
3358        Self {
3359            body: None,
3360        }
3361    }
3362    pub fn body(mut self, value: Value) -> Self {
3363        self.body = Some(value);
3364        self
3365    }
3366}
3367
3368#[derive(Debug, Clone)]
3369pub struct PostTextMd5Params {
3370    pub body: Option<Value>,
3371}
3372
3373impl PostTextMd5Params {
3374    pub fn new() -> Self {
3375        Self {
3376            body: None,
3377        }
3378    }
3379    pub fn body(mut self, value: Value) -> Self {
3380        self.body = Some(value);
3381        self
3382    }
3383}
3384
3385#[derive(Debug, Clone)]
3386pub struct PostTextMd5VerifyParams {
3387    pub body: Option<Value>,
3388}
3389
3390impl PostTextMd5VerifyParams {
3391    pub fn new() -> Self {
3392        Self {
3393            body: None,
3394        }
3395    }
3396    pub fn body(mut self, value: Value) -> Self {
3397        self.body = Some(value);
3398        self
3399    }
3400}
3401#[derive(Debug, Clone)]
3402pub struct TranslateService<'a> {
3403    pub(crate) client: &'a Client,
3404}
3405
3406impl<'a> TranslateService<'a> {
3407/// AI翻译配置
3408    #[instrument(skip(self))]
3409    pub async fn get_ai_translate_languages(&self) -> Result<Value> {
3410        let mut path = "/api/v1/ai/translate/languages".to_string();
3411
3412        let mut query: Vec<(String, String)> = Vec::new();
3413        let query = if query.is_empty() { None } else { Some(query) };
3414
3415        let mut extra_headers = HeaderMap::new();
3416        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3417        let body = None;
3418
3419        self.client
3420            .request_json(
3421                Method::GET,
3422                &path,
3423                headers,
3424                query,
3425                body,
3426            )
3427            .await
3428    }
3429/// AI智能翻译
3430    #[instrument(skip(self, params))]
3431    pub async fn post_ai_translate(&self, params: PostAiTranslateParams) -> Result<Value> {
3432        let mut path = "/api/v1/ai/translate".to_string();
3433
3434        let mut query: Vec<(String, String)> = Vec::new();
3435        query.push(("target_lang".to_string(), params.target_lang_query.clone()));
3436        let query = if query.is_empty() { None } else { Some(query) };
3437
3438        let mut extra_headers = HeaderMap::new();
3439        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3440        let body = params.body.clone();
3441
3442        self.client
3443            .request_json(
3444                Method::POST,
3445                &path,
3446                headers,
3447                query,
3448                body,
3449            )
3450            .await
3451    }
3452/// 流式翻译(中英互译)
3453    #[instrument(skip(self, params))]
3454    pub async fn post_translate_stream(&self, params: PostTranslateStreamParams) -> Result<Value> {
3455        let mut path = "/api/v1/translate/stream".to_string();
3456
3457        let mut query: Vec<(String, String)> = Vec::new();
3458        let query = if query.is_empty() { None } else { Some(query) };
3459
3460        let mut extra_headers = HeaderMap::new();
3461        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3462        let body = params.body.clone();
3463
3464        self.client
3465            .request_json(
3466                Method::POST,
3467                &path,
3468                headers,
3469                query,
3470                body,
3471            )
3472            .await
3473    }
3474/// 翻译
3475    #[instrument(skip(self, params))]
3476    pub async fn post_translate_text(&self, params: PostTranslateTextParams) -> Result<Value> {
3477        let mut path = "/api/v1/translate/text".to_string();
3478
3479        let mut query: Vec<(String, String)> = Vec::new();
3480        query.push(("to_lang".to_string(), params.to_lang_query.clone()));
3481        let query = if query.is_empty() { None } else { Some(query) };
3482
3483        let mut extra_headers = HeaderMap::new();
3484        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3485        let body = params.body.clone();
3486
3487        self.client
3488            .request_json(
3489                Method::POST,
3490                &path,
3491                headers,
3492                query,
3493                body,
3494            )
3495            .await
3496    }
3497}
3498
3499
3500#[derive(Debug, Clone)]
3501pub struct PostAiTranslateParams {
3502    pub target_lang_query: String,
3503    pub body: Option<Value>,
3504}
3505
3506impl PostAiTranslateParams {
3507    pub fn new(target_lang_query: impl Into<String>) -> Self {
3508        Self {
3509            target_lang_query: target_lang_query.into(),
3510            body: None,
3511        }
3512    }
3513    pub fn body(mut self, value: Value) -> Self {
3514        self.body = Some(value);
3515        self
3516    }
3517}
3518
3519#[derive(Debug, Clone)]
3520pub struct PostTranslateStreamParams {
3521    pub body: Option<Value>,
3522}
3523
3524impl PostTranslateStreamParams {
3525    pub fn new() -> Self {
3526        Self {
3527            body: None,
3528        }
3529    }
3530    pub fn body(mut self, value: Value) -> Self {
3531        self.body = Some(value);
3532        self
3533    }
3534}
3535
3536#[derive(Debug, Clone)]
3537pub struct PostTranslateTextParams {
3538    pub to_lang_query: String,
3539    pub body: Option<Value>,
3540}
3541
3542impl PostTranslateTextParams {
3543    pub fn new(to_lang_query: impl Into<String>) -> Self {
3544        Self {
3545            to_lang_query: to_lang_query.into(),
3546            body: None,
3547        }
3548    }
3549    pub fn body(mut self, value: Value) -> Self {
3550        self.body = Some(value);
3551        self
3552    }
3553}
3554#[derive(Debug, Clone)]
3555pub struct WebparseService<'a> {
3556    pub(crate) client: &'a Client,
3557}
3558
3559impl<'a> WebparseService<'a> {
3560/// 转换任务状态
3561    #[instrument(skip(self, params))]
3562    pub async fn get_web_tomarkdown_async_status(&self, params: GetWebTomarkdownAsyncStatusParams) -> Result<Value> {
3563        let mut path = "/api/v1/web/tomarkdown/async/{task_id}".to_string();
3564        {
3565            let encoded = encode(&params.task_id_path).into_owned();
3566            path = path.replace("{task_id}", &encoded);
3567        }
3568
3569        let mut query: Vec<(String, String)> = Vec::new();
3570        let query = if query.is_empty() { None } else { Some(query) };
3571
3572        let mut extra_headers = HeaderMap::new();
3573        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3574        let body = None;
3575
3576        self.client
3577            .request_json(
3578                Method::GET,
3579                &path,
3580                headers,
3581                query,
3582                body,
3583            )
3584            .await
3585    }
3586/// 提取网页图片
3587    #[instrument(skip(self, params))]
3588    pub async fn get_webparse_extractimages(&self, params: GetWebparseExtractimagesParams) -> Result<Value> {
3589        let mut path = "/api/v1/webparse/extractimages".to_string();
3590
3591        let mut query: Vec<(String, String)> = Vec::new();
3592        query.push(("url".to_string(), params.url_query.clone()));
3593        let query = if query.is_empty() { None } else { Some(query) };
3594
3595        let mut extra_headers = HeaderMap::new();
3596        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3597        let body = None;
3598
3599        self.client
3600            .request_json(
3601                Method::GET,
3602                &path,
3603                headers,
3604                query,
3605                body,
3606            )
3607            .await
3608    }
3609/// 提取网页元数据
3610    #[instrument(skip(self, params))]
3611    pub async fn get_webparse_metadata(&self, params: GetWebparseMetadataParams) -> Result<Value> {
3612        let mut path = "/api/v1/webparse/metadata".to_string();
3613
3614        let mut query: Vec<(String, String)> = Vec::new();
3615        query.push(("url".to_string(), params.url_query.clone()));
3616        let query = if query.is_empty() { None } else { Some(query) };
3617
3618        let mut extra_headers = HeaderMap::new();
3619        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3620        let body = None;
3621
3622        self.client
3623            .request_json(
3624                Method::GET,
3625                &path,
3626                headers,
3627                query,
3628                body,
3629            )
3630            .await
3631    }
3632/// 网页转 Markdown
3633    #[instrument(skip(self, params))]
3634    pub async fn post_web_tomarkdown_async(&self, params: PostWebTomarkdownAsyncParams) -> Result<Value> {
3635        let mut path = "/api/v1/web/tomarkdown/async".to_string();
3636
3637        let mut query: Vec<(String, String)> = Vec::new();
3638        query.push(("url".to_string(), params.url_query.clone()));
3639        let query = if query.is_empty() { None } else { Some(query) };
3640
3641        let mut extra_headers = HeaderMap::new();
3642        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3643        let body = None;
3644
3645        self.client
3646            .request_json(
3647                Method::POST,
3648                &path,
3649                headers,
3650                query,
3651                body,
3652            )
3653            .await
3654    }
3655}
3656
3657#[derive(Debug, Clone)]
3658pub struct GetWebTomarkdownAsyncStatusParams {
3659    pub task_id_path: String,
3660}
3661
3662impl GetWebTomarkdownAsyncStatusParams {
3663    pub fn new(task_id_path: impl Into<String>) -> Self {
3664        Self {
3665            task_id_path: task_id_path.into(),
3666        }
3667    }
3668}
3669
3670#[derive(Debug, Clone)]
3671pub struct GetWebparseExtractimagesParams {
3672    pub url_query: String,
3673}
3674
3675impl GetWebparseExtractimagesParams {
3676    pub fn new(url_query: impl Into<String>) -> Self {
3677        Self {
3678            url_query: url_query.into(),
3679        }
3680    }
3681}
3682
3683#[derive(Debug, Clone)]
3684pub struct GetWebparseMetadataParams {
3685    pub url_query: String,
3686}
3687
3688impl GetWebparseMetadataParams {
3689    pub fn new(url_query: impl Into<String>) -> Self {
3690        Self {
3691            url_query: url_query.into(),
3692        }
3693    }
3694}
3695
3696#[derive(Debug, Clone)]
3697pub struct PostWebTomarkdownAsyncParams {
3698    pub url_query: String,
3699}
3700
3701impl PostWebTomarkdownAsyncParams {
3702    pub fn new(url_query: impl Into<String>) -> Self {
3703        Self {
3704            url_query: url_query.into(),
3705        }
3706    }
3707}
3708#[derive(Debug, Clone)]
3709pub struct MinGanCiShiBieService<'a> {
3710    pub(crate) client: &'a Client,
3711}
3712
3713impl<'a> MinGanCiShiBieService<'a> {
3714/// 敏感词分析 (GET)
3715    #[instrument(skip(self, params))]
3716    pub async fn get_sensitive_word_analyze_query(&self, params: GetSensitiveWordAnalyzeQueryParams) -> Result<Value> {
3717        let mut path = "/api/v1/sensitive-word/analyze-query".to_string();
3718
3719        let mut query: Vec<(String, String)> = Vec::new();
3720        query.push(("keyword".to_string(), params.keyword_query.clone()));
3721        let query = if query.is_empty() { None } else { Some(query) };
3722
3723        let mut extra_headers = HeaderMap::new();
3724        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3725        let body = None;
3726
3727        self.client
3728            .request_json(
3729                Method::GET,
3730                &path,
3731                headers,
3732                query,
3733                body,
3734            )
3735            .await
3736    }
3737/// 分析敏感词
3738    #[instrument(skip(self, params))]
3739    pub async fn post_sensitive_word_analyze(&self, params: PostSensitiveWordAnalyzeParams) -> Result<Value> {
3740        let mut path = "/api/v1/sensitive-word/analyze".to_string();
3741
3742        let mut query: Vec<(String, String)> = Vec::new();
3743        let query = if query.is_empty() { None } else { Some(query) };
3744
3745        let mut extra_headers = HeaderMap::new();
3746        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3747        let body = params.body.clone();
3748
3749        self.client
3750            .request_json(
3751                Method::POST,
3752                &path,
3753                headers,
3754                query,
3755                body,
3756            )
3757            .await
3758    }
3759/// 敏感词检测(快速)
3760    #[instrument(skip(self, params))]
3761    pub async fn post_sensitive_word_quick_check(&self, params: PostSensitiveWordQuickCheckParams) -> Result<Value> {
3762        let mut path = "/api/v1/text/profanitycheck".to_string();
3763
3764        let mut query: Vec<(String, String)> = Vec::new();
3765        let query = if query.is_empty() { None } else { Some(query) };
3766
3767        let mut extra_headers = HeaderMap::new();
3768        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3769        let body = params.body.clone();
3770
3771        self.client
3772            .request_json(
3773                Method::POST,
3774                &path,
3775                headers,
3776                query,
3777                body,
3778            )
3779            .await
3780    }
3781}
3782
3783#[derive(Debug, Clone)]
3784pub struct GetSensitiveWordAnalyzeQueryParams {
3785    pub keyword_query: String,
3786}
3787
3788impl GetSensitiveWordAnalyzeQueryParams {
3789    pub fn new(keyword_query: impl Into<String>) -> Self {
3790        Self {
3791            keyword_query: keyword_query.into(),
3792        }
3793    }
3794}
3795
3796#[derive(Debug, Clone)]
3797pub struct PostSensitiveWordAnalyzeParams {
3798    pub body: Option<Value>,
3799}
3800
3801impl PostSensitiveWordAnalyzeParams {
3802    pub fn new() -> Self {
3803        Self {
3804            body: None,
3805        }
3806    }
3807    pub fn body(mut self, value: Value) -> Self {
3808        self.body = Some(value);
3809        self
3810    }
3811}
3812
3813#[derive(Debug, Clone)]
3814pub struct PostSensitiveWordQuickCheckParams {
3815    pub body: Option<Value>,
3816}
3817
3818impl PostSensitiveWordQuickCheckParams {
3819    pub fn new() -> Self {
3820        Self {
3821            body: None,
3822        }
3823    }
3824    pub fn body(mut self, value: Value) -> Self {
3825        self.body = Some(value);
3826        self
3827    }
3828}
3829#[derive(Debug, Clone)]
3830pub struct ZhiNengSouSuoService<'a> {
3831    pub(crate) client: &'a Client,
3832}
3833
3834impl<'a> ZhiNengSouSuoService<'a> {
3835/// 搜索引擎配置
3836    #[instrument(skip(self))]
3837    pub async fn get_search_engines(&self) -> Result<Value> {
3838        let mut path = "/api/v1/search/engines".to_string();
3839
3840        let mut query: Vec<(String, String)> = Vec::new();
3841        let query = if query.is_empty() { None } else { Some(query) };
3842
3843        let mut extra_headers = HeaderMap::new();
3844        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3845        let body = None;
3846
3847        self.client
3848            .request_json(
3849                Method::GET,
3850                &path,
3851                headers,
3852                query,
3853                body,
3854            )
3855            .await
3856    }
3857/// 智能搜索
3858    #[instrument(skip(self, params))]
3859    pub async fn post_search_aggregate(&self, params: PostSearchAggregateParams) -> Result<Value> {
3860        let mut path = "/api/v1/search/aggregate".to_string();
3861
3862        let mut query: Vec<(String, String)> = Vec::new();
3863        let query = if query.is_empty() { None } else { Some(query) };
3864
3865        let mut extra_headers = HeaderMap::new();
3866        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3867        let body = params.body.clone();
3868
3869        self.client
3870            .request_json(
3871                Method::POST,
3872                &path,
3873                headers,
3874                query,
3875                body,
3876            )
3877            .await
3878    }
3879}
3880
3881
3882#[derive(Debug, Clone)]
3883pub struct PostSearchAggregateParams {
3884    pub body: Option<Value>,
3885}
3886
3887impl PostSearchAggregateParams {
3888    pub fn new() -> Self {
3889        Self {
3890            body: None,
3891        }
3892    }
3893    pub fn body(mut self, value: Value) -> Self {
3894        self.body = Some(value);
3895        self
3896    }
3897}