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/// Unix时间戳与日期字符串双向转换
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 Games免费游戏
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/// 查询Minecraft玩家历史用户名
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        query.push(("uuid".to_string(), params.uuid_query.clone()));
280        let query = if query.is_empty() { None } else { Some(query) };
281
282        let mut extra_headers = HeaderMap::new();
283        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
284        let body = None;
285
286        self.client
287            .request_json(
288                Method::GET,
289                &path,
290                headers,
291                query,
292                body,
293            )
294            .await
295    }
296/// 查询Minecraft服务器状态
297    #[instrument(skip(self, params))]
298    pub async fn get_game_minecraft_serverstatus(&self, params: GetGameMinecraftServerstatusParams) -> Result<Value> {
299        let mut path = "/api/v1/game/minecraft/serverstatus".to_string();
300
301        let mut query: Vec<(String, String)> = Vec::new();
302        query.push(("server".to_string(), params.server_query.clone()));
303        let query = if query.is_empty() { None } else { Some(query) };
304
305        let mut extra_headers = HeaderMap::new();
306        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
307        let body = None;
308
309        self.client
310            .request_json(
311                Method::GET,
312                &path,
313                headers,
314                query,
315                body,
316            )
317            .await
318    }
319/// 查询Minecraft玩家信息
320    #[instrument(skip(self, params))]
321    pub async fn get_game_minecraft_userinfo(&self, params: GetGameMinecraftUserinfoParams) -> Result<Value> {
322        let mut path = "/api/v1/game/minecraft/userinfo".to_string();
323
324        let mut query: Vec<(String, String)> = Vec::new();
325        query.push(("username".to_string(), params.username_query.clone()));
326        let query = if query.is_empty() { None } else { Some(query) };
327
328        let mut extra_headers = HeaderMap::new();
329        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
330        let body = None;
331
332        self.client
333            .request_json(
334                Method::GET,
335                &path,
336                headers,
337                query,
338                body,
339            )
340            .await
341    }
342/// 获取Steam用户公开摘要
343    #[instrument(skip(self, params))]
344    pub async fn get_game_steam_summary(&self, params: GetGameSteamSummaryParams) -> Result<Value> {
345        let mut path = "/api/v1/game/steam/summary".to_string();
346
347        let mut query: Vec<(String, String)> = Vec::new();
348        if let Some(value) = &params.steamid_query {
349            query.push(("steamid".to_string(), value.clone()));
350        }
351        if let Some(value) = &params.id_query {
352            query.push(("id".to_string(), value.clone()));
353        }
354        if let Some(value) = &params.id_3_query {
355            query.push(("id3".to_string(), value.clone()));
356        }
357        if let Some(value) = &params.key_query {
358            query.push(("key".to_string(), value.clone()));
359        }
360        let query = if query.is_empty() { None } else { Some(query) };
361
362        let mut extra_headers = HeaderMap::new();
363        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
364        let body = None;
365
366        self.client
367            .request_json(
368                Method::GET,
369                &path,
370                headers,
371                query,
372                body,
373            )
374            .await
375    }
376}
377
378
379#[derive(Debug, Clone)]
380pub struct GetGameMinecraftHistoryidParams {
381    pub uuid_query: String,
382}
383
384impl GetGameMinecraftHistoryidParams {
385    pub fn new(uuid_query: impl Into<String>) -> Self {
386        Self {
387            uuid_query: uuid_query.into(),
388        }
389    }
390}
391
392#[derive(Debug, Clone)]
393pub struct GetGameMinecraftServerstatusParams {
394    pub server_query: String,
395}
396
397impl GetGameMinecraftServerstatusParams {
398    pub fn new(server_query: impl Into<String>) -> Self {
399        Self {
400            server_query: server_query.into(),
401        }
402    }
403}
404
405#[derive(Debug, Clone)]
406pub struct GetGameMinecraftUserinfoParams {
407    pub username_query: String,
408}
409
410impl GetGameMinecraftUserinfoParams {
411    pub fn new(username_query: impl Into<String>) -> Self {
412        Self {
413            username_query: username_query.into(),
414        }
415    }
416}
417
418#[derive(Debug, Clone)]
419pub struct GetGameSteamSummaryParams {
420    pub steamid_query: Option<String>,
421    pub id_query: Option<String>,
422    pub id_3_query: Option<String>,
423    pub key_query: Option<String>,
424}
425
426impl GetGameSteamSummaryParams {
427    pub fn new() -> Self {
428        Self {
429            steamid_query: None,
430            id_query: None,
431            id_3_query: None,
432            key_query: None,
433        }
434    }
435    pub fn steamid_query(mut self, value: impl Into<String>) -> Self {
436        self.steamid_query = Some(value.into());
437        self
438    }
439    pub fn id_query(mut self, value: impl Into<String>) -> Self {
440        self.id_query = Some(value.into());
441        self
442    }
443    pub fn id_3_query(mut self, value: impl Into<String>) -> Self {
444        self.id_3_query = Some(value.into());
445        self
446    }
447    pub fn key_query(mut self, value: impl Into<String>) -> Self {
448        self.key_query = Some(value.into());
449        self
450    }
451}
452#[derive(Debug, Clone)]
453pub struct ImageService<'a> {
454    pub(crate) client: &'a Client,
455}
456
457impl<'a> ImageService<'a> {
458/// 获取Gravatar头像
459    #[instrument(skip(self, params))]
460    pub async fn get_avatar_gravatar(&self, params: GetAvatarGravatarParams) -> Result<Value> {
461        let mut path = "/api/v1/avatar/gravatar".to_string();
462
463        let mut query: Vec<(String, String)> = Vec::new();
464        if let Some(value) = &params.email_query {
465            query.push(("email".to_string(), value.clone()));
466        }
467        if let Some(value) = &params.hash_query {
468            query.push(("hash".to_string(), value.clone()));
469        }
470        if let Some(value) = &params.s_query {
471            query.push(("s".to_string(), value.clone()));
472        }
473        if let Some(value) = &params.d_query {
474            query.push(("d".to_string(), value.clone()));
475        }
476        if let Some(value) = &params.r_query {
477            query.push(("r".to_string(), value.clone()));
478        }
479        let query = if query.is_empty() { None } else { Some(query) };
480
481        let mut extra_headers = HeaderMap::new();
482        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
483        let body = None;
484
485        self.client
486            .request_json(
487                Method::GET,
488                &path,
489                headers,
490                query,
491                body,
492            )
493            .await
494    }
495/// 获取必应每日壁纸
496    #[instrument(skip(self))]
497    pub async fn get_image_bing_daily(&self) -> Result<Value> {
498        let mut path = "/api/v1/image/bing-daily".to_string();
499
500        let mut query: Vec<(String, String)> = Vec::new();
501        let query = if query.is_empty() { None } else { Some(query) };
502
503        let mut extra_headers = HeaderMap::new();
504        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
505        let body = None;
506
507        self.client
508            .request_json(
509                Method::GET,
510                &path,
511                headers,
512                query,
513                body,
514            )
515            .await
516    }
517/// 生成摸摸头GIF (QQ号方式)
518    #[instrument(skip(self, params))]
519    pub async fn get_image_motou(&self, params: GetImageMotouParams) -> Result<Value> {
520        let mut path = "/api/v1/image/motou".to_string();
521
522        let mut query: Vec<(String, String)> = Vec::new();
523        query.push(("qq".to_string(), params.qq_query.clone()));
524        if let Some(value) = &params.bg_color_query {
525            query.push(("bg_color".to_string(), value.clone()));
526        }
527        let query = if query.is_empty() { None } else { Some(query) };
528
529        let mut extra_headers = HeaderMap::new();
530        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
531        let body = None;
532
533        self.client
534            .request_json(
535                Method::GET,
536                &path,
537                headers,
538                query,
539                body,
540            )
541            .await
542    }
543/// 动态生成二维码
544    #[instrument(skip(self, params))]
545    pub async fn get_image_qrcode(&self, params: GetImageQrcodeParams) -> Result<Value> {
546        let mut path = "/api/v1/image/qrcode".to_string();
547
548        let mut query: Vec<(String, String)> = Vec::new();
549        query.push(("text".to_string(), params.text_query.clone()));
550        if let Some(value) = &params.size_query {
551            query.push(("size".to_string(), value.clone()));
552        }
553        if let Some(value) = &params.format_query {
554            query.push(("format".to_string(), value.clone()));
555        }
556        let query = if query.is_empty() { None } else { Some(query) };
557
558        let mut extra_headers = HeaderMap::new();
559        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
560        let body = None;
561
562        self.client
563            .request_json(
564                Method::GET,
565                &path,
566                headers,
567                query,
568                body,
569            )
570            .await
571    }
572/// 将在线图片转换为Base64
573    #[instrument(skip(self, params))]
574    pub async fn get_image_tobase_64(&self, params: GetImageTobase64Params) -> Result<Value> {
575        let mut path = "/api/v1/image/tobase64".to_string();
576
577        let mut query: Vec<(String, String)> = Vec::new();
578        query.push(("url".to_string(), params.url_query.clone()));
579        let query = if query.is_empty() { None } else { Some(query) };
580
581        let mut extra_headers = HeaderMap::new();
582        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
583        let body = None;
584
585        self.client
586            .request_json(
587                Method::GET,
588                &path,
589                headers,
590                query,
591                body,
592            )
593            .await
594    }
595/// 无损压缩图片
596    #[instrument(skip(self, params))]
597    pub async fn post_image_compress(&self, params: PostImageCompressParams) -> Result<Value> {
598        let mut path = "/api/v1/image/compress".to_string();
599
600        let mut query: Vec<(String, String)> = Vec::new();
601        if let Some(value) = &params.level_query {
602            query.push(("level".to_string(), value.clone()));
603        }
604        if let Some(value) = &params.format_query {
605            query.push(("format".to_string(), value.clone()));
606        }
607        let query = if query.is_empty() { None } else { Some(query) };
608
609        let mut extra_headers = HeaderMap::new();
610        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
611        let body = params.body.clone();
612
613        self.client
614            .request_json(
615                Method::POST,
616                &path,
617                headers,
618                query,
619                body,
620            )
621            .await
622    }
623/// 通过Base64编码上传图片
624    #[instrument(skip(self, params))]
625    pub async fn post_image_frombase_64(&self, params: PostImageFrombase64Params) -> Result<Value> {
626        let mut path = "/api/v1/image/frombase64".to_string();
627
628        let mut query: Vec<(String, String)> = Vec::new();
629        let query = if query.is_empty() { None } else { Some(query) };
630
631        let mut extra_headers = HeaderMap::new();
632        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
633        let body = params.body.clone();
634
635        self.client
636            .request_json(
637                Method::POST,
638                &path,
639                headers,
640                query,
641                body,
642            )
643            .await
644    }
645/// 生成摸摸头GIF (图片上传或URL方式)
646    #[instrument(skip(self, params))]
647    pub async fn post_image_motou(&self, params: PostImageMotouParams) -> Result<Value> {
648        let mut path = "/api/v1/image/motou".to_string();
649
650        let mut query: Vec<(String, String)> = Vec::new();
651        let query = if query.is_empty() { None } else { Some(query) };
652
653        let mut extra_headers = HeaderMap::new();
654        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
655        let body = params.body.clone();
656
657        self.client
658            .request_json(
659                Method::POST,
660                &path,
661                headers,
662                query,
663                body,
664            )
665            .await
666    }
667/// 生成你们怎么不说话了表情包
668    #[instrument(skip(self, params))]
669    pub async fn post_image_speechless(&self, params: PostImageSpeechlessParams) -> Result<Value> {
670        let mut path = "/api/v1/image/speechless".to_string();
671
672        let mut query: Vec<(String, String)> = Vec::new();
673        let query = if query.is_empty() { None } else { Some(query) };
674
675        let mut extra_headers = HeaderMap::new();
676        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
677        let body = params.body.clone();
678
679        self.client
680            .request_json(
681                Method::POST,
682                &path,
683                headers,
684                query,
685                body,
686            )
687            .await
688    }
689/// SVG转图片
690    #[instrument(skip(self, params))]
691    pub async fn post_image_svg(&self, params: PostImageSvgParams) -> Result<Value> {
692        let mut path = "/api/v1/image/svg".to_string();
693
694        let mut query: Vec<(String, String)> = Vec::new();
695        if let Some(value) = &params.format_query {
696            query.push(("format".to_string(), value.clone()));
697        }
698        if let Some(value) = &params.width_query {
699            query.push(("width".to_string(), value.clone()));
700        }
701        if let Some(value) = &params.height_query {
702            query.push(("height".to_string(), value.clone()));
703        }
704        if let Some(value) = &params.quality_query {
705            query.push(("quality".to_string(), value.clone()));
706        }
707        let query = if query.is_empty() { None } else { Some(query) };
708
709        let mut extra_headers = HeaderMap::new();
710        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
711        let body = params.body.clone();
712
713        self.client
714            .request_json(
715                Method::POST,
716                &path,
717                headers,
718                query,
719                body,
720            )
721            .await
722    }
723}
724
725#[derive(Debug, Clone)]
726pub struct GetAvatarGravatarParams {
727    pub email_query: Option<String>,
728    pub hash_query: Option<String>,
729    pub s_query: Option<String>,
730    pub d_query: Option<String>,
731    pub r_query: Option<String>,
732}
733
734impl GetAvatarGravatarParams {
735    pub fn new() -> Self {
736        Self {
737            email_query: None,
738            hash_query: None,
739            s_query: None,
740            d_query: None,
741            r_query: None,
742        }
743    }
744    pub fn email_query(mut self, value: impl Into<String>) -> Self {
745        self.email_query = Some(value.into());
746        self
747    }
748    pub fn hash_query(mut self, value: impl Into<String>) -> Self {
749        self.hash_query = Some(value.into());
750        self
751    }
752    pub fn s_query(mut self, value: impl Into<String>) -> Self {
753        self.s_query = Some(value.into());
754        self
755    }
756    pub fn d_query(mut self, value: impl Into<String>) -> Self {
757        self.d_query = Some(value.into());
758        self
759    }
760    pub fn r_query(mut self, value: impl Into<String>) -> Self {
761        self.r_query = Some(value.into());
762        self
763    }
764}
765
766
767#[derive(Debug, Clone)]
768pub struct GetImageMotouParams {
769    pub qq_query: String,
770    pub bg_color_query: Option<String>,
771}
772
773impl GetImageMotouParams {
774    pub fn new(qq_query: impl Into<String>) -> Self {
775        Self {
776            qq_query: qq_query.into(),
777            bg_color_query: None,
778        }
779    }
780    pub fn bg_color_query(mut self, value: impl Into<String>) -> Self {
781        self.bg_color_query = Some(value.into());
782        self
783    }
784}
785
786#[derive(Debug, Clone)]
787pub struct GetImageQrcodeParams {
788    pub text_query: String,
789    pub size_query: Option<String>,
790    pub format_query: Option<String>,
791}
792
793impl GetImageQrcodeParams {
794    pub fn new(text_query: impl Into<String>) -> Self {
795        Self {
796            text_query: text_query.into(),
797            size_query: None,
798            format_query: None,
799        }
800    }
801    pub fn size_query(mut self, value: impl Into<String>) -> Self {
802        self.size_query = Some(value.into());
803        self
804    }
805    pub fn format_query(mut self, value: impl Into<String>) -> Self {
806        self.format_query = Some(value.into());
807        self
808    }
809}
810
811#[derive(Debug, Clone)]
812pub struct GetImageTobase64Params {
813    pub url_query: String,
814}
815
816impl GetImageTobase64Params {
817    pub fn new(url_query: impl Into<String>) -> Self {
818        Self {
819            url_query: url_query.into(),
820        }
821    }
822}
823
824#[derive(Debug, Clone)]
825pub struct PostImageCompressParams {
826    pub level_query: Option<String>,
827    pub format_query: Option<String>,
828    pub body: Option<Value>,
829}
830
831impl PostImageCompressParams {
832    pub fn new() -> Self {
833        Self {
834            level_query: None,
835            format_query: None,
836            body: None,
837        }
838    }
839    pub fn level_query(mut self, value: impl Into<String>) -> Self {
840        self.level_query = Some(value.into());
841        self
842    }
843    pub fn format_query(mut self, value: impl Into<String>) -> Self {
844        self.format_query = Some(value.into());
845        self
846    }
847    pub fn body(mut self, value: Value) -> Self {
848        self.body = Some(value);
849        self
850    }
851}
852
853#[derive(Debug, Clone)]
854pub struct PostImageFrombase64Params {
855    pub body: Option<Value>,
856}
857
858impl PostImageFrombase64Params {
859    pub fn new() -> Self {
860        Self {
861            body: None,
862        }
863    }
864    pub fn body(mut self, value: Value) -> Self {
865        self.body = Some(value);
866        self
867    }
868}
869
870#[derive(Debug, Clone)]
871pub struct PostImageMotouParams {
872    pub body: Option<Value>,
873}
874
875impl PostImageMotouParams {
876    pub fn new() -> Self {
877        Self {
878            body: None,
879        }
880    }
881    pub fn body(mut self, value: Value) -> Self {
882        self.body = Some(value);
883        self
884    }
885}
886
887#[derive(Debug, Clone)]
888pub struct PostImageSpeechlessParams {
889    pub body: Option<Value>,
890}
891
892impl PostImageSpeechlessParams {
893    pub fn new() -> Self {
894        Self {
895            body: None,
896        }
897    }
898    pub fn body(mut self, value: Value) -> Self {
899        self.body = Some(value);
900        self
901    }
902}
903
904#[derive(Debug, Clone)]
905pub struct PostImageSvgParams {
906    pub format_query: Option<String>,
907    pub width_query: Option<String>,
908    pub height_query: Option<String>,
909    pub quality_query: Option<String>,
910    pub body: Option<Value>,
911}
912
913impl PostImageSvgParams {
914    pub fn new() -> Self {
915        Self {
916            format_query: None,
917            width_query: None,
918            height_query: None,
919            quality_query: None,
920            body: None,
921        }
922    }
923    pub fn format_query(mut self, value: impl Into<String>) -> Self {
924        self.format_query = Some(value.into());
925        self
926    }
927    pub fn width_query(mut self, value: impl Into<String>) -> Self {
928        self.width_query = Some(value.into());
929        self
930    }
931    pub fn height_query(mut self, value: impl Into<String>) -> Self {
932        self.height_query = Some(value.into());
933        self
934    }
935    pub fn quality_query(mut self, value: impl Into<String>) -> Self {
936        self.quality_query = Some(value.into());
937        self
938    }
939    pub fn body(mut self, value: Value) -> Self {
940        self.body = Some(value);
941        self
942    }
943}
944#[derive(Debug, Clone)]
945pub struct MiscService<'a> {
946    pub(crate) client: &'a Client,
947}
948
949impl<'a> MiscService<'a> {
950/// 获取指定日期的程序员历史事件
951    #[instrument(skip(self, params))]
952    pub async fn get_history_programmer(&self, params: GetHistoryProgrammerParams) -> Result<Value> {
953        let mut path = "/api/v1/history/programmer".to_string();
954
955        let mut query: Vec<(String, String)> = Vec::new();
956        query.push(("month".to_string(), params.month_query.clone()));
957        query.push(("day".to_string(), params.day_query.clone()));
958        let query = if query.is_empty() { None } else { Some(query) };
959
960        let mut extra_headers = HeaderMap::new();
961        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
962        let body = None;
963
964        self.client
965            .request_json(
966                Method::GET,
967                &path,
968                headers,
969                query,
970                body,
971            )
972            .await
973    }
974/// 获取今天的程序员历史事件
975    #[instrument(skip(self))]
976    pub async fn get_history_programmer_today(&self) -> Result<Value> {
977        let mut path = "/api/v1/history/programmer/today".to_string();
978
979        let mut query: Vec<(String, String)> = Vec::new();
980        let query = if query.is_empty() { None } else { Some(query) };
981
982        let mut extra_headers = HeaderMap::new();
983        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
984        let body = None;
985
986        self.client
987            .request_json(
988                Method::GET,
989                &path,
990                headers,
991                query,
992                body,
993            )
994            .await
995    }
996/// 获取多平台实时热榜
997    #[instrument(skip(self, params))]
998    pub async fn get_misc_hotboard(&self, params: GetMiscHotboardParams) -> Result<Value> {
999        let mut path = "/api/v1/misc/hotboard".to_string();
1000
1001        let mut query: Vec<(String, String)> = Vec::new();
1002        query.push(("type".to_string(), params.type_query.clone()));
1003        let query = if query.is_empty() { None } else { Some(query) };
1004
1005        let mut extra_headers = HeaderMap::new();
1006        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1007        let body = None;
1008
1009        self.client
1010            .request_json(
1011                Method::GET,
1012                &path,
1013                headers,
1014                query,
1015                body,
1016            )
1017            .await
1018    }
1019/// 查询手机号码归属地信息
1020    #[instrument(skip(self, params))]
1021    pub async fn get_misc_phoneinfo(&self, params: GetMiscPhoneinfoParams) -> Result<Value> {
1022        let mut path = "/api/v1/misc/phoneinfo".to_string();
1023
1024        let mut query: Vec<(String, String)> = Vec::new();
1025        query.push(("phone".to_string(), params.phone_query.clone()));
1026        let query = if query.is_empty() { None } else { Some(query) };
1027
1028        let mut extra_headers = HeaderMap::new();
1029        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1030        let body = None;
1031
1032        self.client
1033            .request_json(
1034                Method::GET,
1035                &path,
1036                headers,
1037                query,
1038                body,
1039            )
1040            .await
1041    }
1042/// 生成高度可定制的随机数
1043    #[instrument(skip(self, params))]
1044    pub async fn get_misc_randomnumber(&self, params: GetMiscRandomnumberParams) -> Result<Value> {
1045        let mut path = "/api/v1/misc/randomnumber".to_string();
1046
1047        let mut query: Vec<(String, String)> = Vec::new();
1048        if let Some(value) = &params.min_query {
1049            query.push(("min".to_string(), value.clone()));
1050        }
1051        if let Some(value) = &params.max_query {
1052            query.push(("max".to_string(), value.clone()));
1053        }
1054        if let Some(value) = &params.count_query {
1055            query.push(("count".to_string(), value.clone()));
1056        }
1057        if let Some(value) = &params.allow_repeat_query {
1058            query.push(("allow_repeat".to_string(), value.clone()));
1059        }
1060        if let Some(value) = &params.allow_decimal_query {
1061            query.push(("allow_decimal".to_string(), value.clone()));
1062        }
1063        if let Some(value) = &params.decimal_places_query {
1064            query.push(("decimal_places".to_string(), value.clone()));
1065        }
1066        let query = if query.is_empty() { None } else { Some(query) };
1067
1068        let mut extra_headers = HeaderMap::new();
1069        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1070        let body = None;
1071
1072        self.client
1073            .request_json(
1074                Method::GET,
1075                &path,
1076                headers,
1077                query,
1078                body,
1079            )
1080            .await
1081    }
1082/// 转换时间戳 (旧版,推荐使用/convert/unixtime)
1083    #[instrument(skip(self, params))]
1084    pub async fn get_misc_timestamp(&self, params: GetMiscTimestampParams) -> Result<Value> {
1085        let mut path = "/api/v1/misc/timestamp".to_string();
1086
1087        let mut query: Vec<(String, String)> = Vec::new();
1088        query.push(("ts".to_string(), params.ts_query.clone()));
1089        let query = if query.is_empty() { None } else { Some(query) };
1090
1091        let mut extra_headers = HeaderMap::new();
1092        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1093        let body = None;
1094
1095        self.client
1096            .request_json(
1097                Method::GET,
1098                &path,
1099                headers,
1100                query,
1101                body,
1102            )
1103            .await
1104    }
1105/// 获取支持的快递公司列表
1106    #[instrument(skip(self))]
1107    pub async fn get_misc_tracking_carriers(&self) -> Result<Value> {
1108        let mut path = "/api/v1/misc/tracking/carriers".to_string();
1109
1110        let mut query: Vec<(String, String)> = Vec::new();
1111        let query = if query.is_empty() { None } else { Some(query) };
1112
1113        let mut extra_headers = HeaderMap::new();
1114        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1115        let body = None;
1116
1117        self.client
1118            .request_json(
1119                Method::GET,
1120                &path,
1121                headers,
1122                query,
1123                body,
1124            )
1125            .await
1126    }
1127/// 识别快递公司
1128    #[instrument(skip(self, params))]
1129    pub async fn get_misc_tracking_detect(&self, params: GetMiscTrackingDetectParams) -> Result<Value> {
1130        let mut path = "/api/v1/misc/tracking/detect".to_string();
1131
1132        let mut query: Vec<(String, String)> = Vec::new();
1133        query.push(("tracking_number".to_string(), params.tracking_number_query.clone()));
1134        let query = if query.is_empty() { None } else { Some(query) };
1135
1136        let mut extra_headers = HeaderMap::new();
1137        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1138        let body = None;
1139
1140        self.client
1141            .request_json(
1142                Method::GET,
1143                &path,
1144                headers,
1145                query,
1146                body,
1147            )
1148            .await
1149    }
1150/// 查询快递物流信息
1151    #[instrument(skip(self, params))]
1152    pub async fn get_misc_tracking_query(&self, params: GetMiscTrackingQueryParams) -> Result<Value> {
1153        let mut path = "/api/v1/misc/tracking/query".to_string();
1154
1155        let mut query: Vec<(String, String)> = Vec::new();
1156        query.push(("tracking_number".to_string(), params.tracking_number_query.clone()));
1157        if let Some(value) = &params.carrier_code_query {
1158            query.push(("carrier_code".to_string(), value.clone()));
1159        }
1160        let query = if query.is_empty() { None } else { Some(query) };
1161
1162        let mut extra_headers = HeaderMap::new();
1163        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1164        let body = None;
1165
1166        self.client
1167            .request_json(
1168                Method::GET,
1169                &path,
1170                headers,
1171                query,
1172                body,
1173            )
1174            .await
1175    }
1176/// 查询实时天气信息
1177    #[instrument(skip(self, params))]
1178    pub async fn get_misc_weather(&self, params: GetMiscWeatherParams) -> Result<Value> {
1179        let mut path = "/api/v1/misc/weather".to_string();
1180
1181        let mut query: Vec<(String, String)> = Vec::new();
1182        if let Some(value) = &params.city_query {
1183            query.push(("city".to_string(), value.clone()));
1184        }
1185        if let Some(value) = &params.adcode_query {
1186            query.push(("adcode".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_worldtime(&self, params: GetMiscWorldtimeParams) -> Result<Value> {
1207        let mut path = "/api/v1/misc/worldtime".to_string();
1208
1209        let mut query: Vec<(String, String)> = Vec::new();
1210        query.push(("city".to_string(), params.city_query.clone()));
1211        let query = if query.is_empty() { None } else { Some(query) };
1212
1213        let mut extra_headers = HeaderMap::new();
1214        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1215        let body = None;
1216
1217        self.client
1218            .request_json(
1219                Method::GET,
1220                &path,
1221                headers,
1222                query,
1223                body,
1224            )
1225            .await
1226    }
1227}
1228
1229#[derive(Debug, Clone)]
1230pub struct GetHistoryProgrammerParams {
1231    pub month_query: String,
1232    pub day_query: String,
1233}
1234
1235impl GetHistoryProgrammerParams {
1236    pub fn new(month_query: impl Into<String>, day_query: impl Into<String>) -> Self {
1237        Self {
1238            month_query: month_query.into(),
1239            day_query: day_query.into(),
1240        }
1241    }
1242}
1243
1244
1245#[derive(Debug, Clone)]
1246pub struct GetMiscHotboardParams {
1247    pub type_query: String,
1248}
1249
1250impl GetMiscHotboardParams {
1251    pub fn new(type_query: impl Into<String>) -> Self {
1252        Self {
1253            type_query: type_query.into(),
1254        }
1255    }
1256}
1257
1258#[derive(Debug, Clone)]
1259pub struct GetMiscPhoneinfoParams {
1260    pub phone_query: String,
1261}
1262
1263impl GetMiscPhoneinfoParams {
1264    pub fn new(phone_query: impl Into<String>) -> Self {
1265        Self {
1266            phone_query: phone_query.into(),
1267        }
1268    }
1269}
1270
1271#[derive(Debug, Clone)]
1272pub struct GetMiscRandomnumberParams {
1273    pub min_query: Option<String>,
1274    pub max_query: Option<String>,
1275    pub count_query: Option<String>,
1276    pub allow_repeat_query: Option<String>,
1277    pub allow_decimal_query: Option<String>,
1278    pub decimal_places_query: Option<String>,
1279}
1280
1281impl GetMiscRandomnumberParams {
1282    pub fn new() -> Self {
1283        Self {
1284            min_query: None,
1285            max_query: None,
1286            count_query: None,
1287            allow_repeat_query: None,
1288            allow_decimal_query: None,
1289            decimal_places_query: None,
1290        }
1291    }
1292    pub fn min_query(mut self, value: impl Into<String>) -> Self {
1293        self.min_query = Some(value.into());
1294        self
1295    }
1296    pub fn max_query(mut self, value: impl Into<String>) -> Self {
1297        self.max_query = Some(value.into());
1298        self
1299    }
1300    pub fn count_query(mut self, value: impl Into<String>) -> Self {
1301        self.count_query = Some(value.into());
1302        self
1303    }
1304    pub fn allow_repeat_query(mut self, value: impl Into<String>) -> Self {
1305        self.allow_repeat_query = Some(value.into());
1306        self
1307    }
1308    pub fn allow_decimal_query(mut self, value: impl Into<String>) -> Self {
1309        self.allow_decimal_query = Some(value.into());
1310        self
1311    }
1312    pub fn decimal_places_query(mut self, value: impl Into<String>) -> Self {
1313        self.decimal_places_query = Some(value.into());
1314        self
1315    }
1316}
1317
1318#[derive(Debug, Clone)]
1319pub struct GetMiscTimestampParams {
1320    pub ts_query: String,
1321}
1322
1323impl GetMiscTimestampParams {
1324    pub fn new(ts_query: impl Into<String>) -> Self {
1325        Self {
1326            ts_query: ts_query.into(),
1327        }
1328    }
1329}
1330
1331
1332#[derive(Debug, Clone)]
1333pub struct GetMiscTrackingDetectParams {
1334    pub tracking_number_query: String,
1335}
1336
1337impl GetMiscTrackingDetectParams {
1338    pub fn new(tracking_number_query: impl Into<String>) -> Self {
1339        Self {
1340            tracking_number_query: tracking_number_query.into(),
1341        }
1342    }
1343}
1344
1345#[derive(Debug, Clone)]
1346pub struct GetMiscTrackingQueryParams {
1347    pub tracking_number_query: String,
1348    pub carrier_code_query: Option<String>,
1349}
1350
1351impl GetMiscTrackingQueryParams {
1352    pub fn new(tracking_number_query: impl Into<String>) -> Self {
1353        Self {
1354            tracking_number_query: tracking_number_query.into(),
1355            carrier_code_query: None,
1356        }
1357    }
1358    pub fn carrier_code_query(mut self, value: impl Into<String>) -> Self {
1359        self.carrier_code_query = Some(value.into());
1360        self
1361    }
1362}
1363
1364#[derive(Debug, Clone)]
1365pub struct GetMiscWeatherParams {
1366    pub city_query: Option<String>,
1367    pub adcode_query: Option<String>,
1368}
1369
1370impl GetMiscWeatherParams {
1371    pub fn new() -> Self {
1372        Self {
1373            city_query: None,
1374            adcode_query: None,
1375        }
1376    }
1377    pub fn city_query(mut self, value: impl Into<String>) -> Self {
1378        self.city_query = Some(value.into());
1379        self
1380    }
1381    pub fn adcode_query(mut self, value: impl Into<String>) -> Self {
1382        self.adcode_query = Some(value.into());
1383        self
1384    }
1385}
1386
1387#[derive(Debug, Clone)]
1388pub struct GetMiscWorldtimeParams {
1389    pub city_query: String,
1390}
1391
1392impl GetMiscWorldtimeParams {
1393    pub fn new(city_query: impl Into<String>) -> Self {
1394        Self {
1395            city_query: city_query.into(),
1396        }
1397    }
1398}
1399#[derive(Debug, Clone)]
1400pub struct NetworkService<'a> {
1401    pub(crate) client: &'a Client,
1402}
1403
1404impl<'a> NetworkService<'a> {
1405/// 执行DNS解析查询
1406    #[instrument(skip(self, params))]
1407    pub async fn get_network_dns(&self, params: GetNetworkDnsParams) -> Result<Value> {
1408        let mut path = "/api/v1/network/dns".to_string();
1409
1410        let mut query: Vec<(String, String)> = Vec::new();
1411        query.push(("domain".to_string(), params.domain_query.clone()));
1412        if let Some(value) = &params.type_query {
1413            query.push(("type".to_string(), value.clone()));
1414        }
1415        let query = if query.is_empty() { None } else { Some(query) };
1416
1417        let mut extra_headers = HeaderMap::new();
1418        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1419        let body = None;
1420
1421        self.client
1422            .request_json(
1423                Method::GET,
1424                &path,
1425                headers,
1426                query,
1427                body,
1428            )
1429            .await
1430    }
1431/// 查询域名ICP备案信息
1432    #[instrument(skip(self, params))]
1433    pub async fn get_network_icp(&self, params: GetNetworkIcpParams) -> Result<Value> {
1434        let mut path = "/api/v1/network/icp".to_string();
1435
1436        let mut query: Vec<(String, String)> = Vec::new();
1437        query.push(("domain".to_string(), params.domain_query.clone()));
1438        let query = if query.is_empty() { None } else { Some(query) };
1439
1440        let mut extra_headers = HeaderMap::new();
1441        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1442        let body = None;
1443
1444        self.client
1445            .request_json(
1446                Method::GET,
1447                &path,
1448                headers,
1449                query,
1450                body,
1451            )
1452            .await
1453    }
1454/// 查询指定IP或域名的归属信息
1455    #[instrument(skip(self, params))]
1456    pub async fn get_network_ipinfo(&self, params: GetNetworkIpinfoParams) -> Result<Value> {
1457        let mut path = "/api/v1/network/ipinfo".to_string();
1458
1459        let mut query: Vec<(String, String)> = Vec::new();
1460        query.push(("ip".to_string(), params.ip_query.clone()));
1461        if let Some(value) = &params.source_query {
1462            query.push(("source".to_string(), value.clone()));
1463        }
1464        let query = if query.is_empty() { None } else { Some(query) };
1465
1466        let mut extra_headers = HeaderMap::new();
1467        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1468        let body = None;
1469
1470        self.client
1471            .request_json(
1472                Method::GET,
1473                &path,
1474                headers,
1475                query,
1476                body,
1477            )
1478            .await
1479    }
1480/// 获取你的公网IP及归属信息
1481    #[instrument(skip(self, params))]
1482    pub async fn get_network_myip(&self, params: GetNetworkMyipParams) -> Result<Value> {
1483        let mut path = "/api/v1/network/myip".to_string();
1484
1485        let mut query: Vec<(String, String)> = Vec::new();
1486        if let Some(value) = &params.source_query {
1487            query.push(("source".to_string(), value.clone()));
1488        }
1489        let query = if query.is_empty() { None } else { Some(query) };
1490
1491        let mut extra_headers = HeaderMap::new();
1492        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1493        let body = None;
1494
1495        self.client
1496            .request_json(
1497                Method::GET,
1498                &path,
1499                headers,
1500                query,
1501                body,
1502            )
1503            .await
1504    }
1505/// 从服务器Ping指定主机
1506    #[instrument(skip(self, params))]
1507    pub async fn get_network_ping(&self, params: GetNetworkPingParams) -> Result<Value> {
1508        let mut path = "/api/v1/network/ping".to_string();
1509
1510        let mut query: Vec<(String, String)> = Vec::new();
1511        query.push(("host".to_string(), params.host_query.clone()));
1512        let query = if query.is_empty() { None } else { Some(query) };
1513
1514        let mut extra_headers = HeaderMap::new();
1515        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1516        let body = None;
1517
1518        self.client
1519            .request_json(
1520                Method::GET,
1521                &path,
1522                headers,
1523                query,
1524                body,
1525            )
1526            .await
1527    }
1528/// 从服务器Ping你的客户端IP
1529    #[instrument(skip(self))]
1530    pub async fn get_network_pingmyip(&self) -> Result<Value> {
1531        let mut path = "/api/v1/network/pingmyip".to_string();
1532
1533        let mut query: Vec<(String, String)> = Vec::new();
1534        let query = if query.is_empty() { None } else { Some(query) };
1535
1536        let mut extra_headers = HeaderMap::new();
1537        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1538        let body = None;
1539
1540        self.client
1541            .request_json(
1542                Method::GET,
1543                &path,
1544                headers,
1545                query,
1546                body,
1547            )
1548            .await
1549    }
1550/// 扫描远程主机的指定端口
1551    #[instrument(skip(self, params))]
1552    pub async fn get_network_portscan(&self, params: GetNetworkPortscanParams) -> Result<Value> {
1553        let mut path = "/api/v1/network/portscan".to_string();
1554
1555        let mut query: Vec<(String, String)> = Vec::new();
1556        query.push(("host".to_string(), params.host_query.clone()));
1557        query.push(("port".to_string(), params.port_query.clone()));
1558        if let Some(value) = &params.protocol_query {
1559            query.push(("protocol".to_string(), value.clone()));
1560        }
1561        let query = if query.is_empty() { None } else { Some(query) };
1562
1563        let mut extra_headers = HeaderMap::new();
1564        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1565        let body = None;
1566
1567        self.client
1568            .request_json(
1569                Method::GET,
1570                &path,
1571                headers,
1572                query,
1573                body,
1574            )
1575            .await
1576    }
1577/// 检查URL的可访问性状态
1578    #[instrument(skip(self, params))]
1579    pub async fn get_network_urlstatus(&self, params: GetNetworkUrlstatusParams) -> Result<Value> {
1580        let mut path = "/api/v1/network/urlstatus".to_string();
1581
1582        let mut query: Vec<(String, String)> = Vec::new();
1583        query.push(("url".to_string(), params.url_query.clone()));
1584        let query = if query.is_empty() { None } else { Some(query) };
1585
1586        let mut extra_headers = HeaderMap::new();
1587        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1588        let body = None;
1589
1590        self.client
1591            .request_json(
1592                Method::GET,
1593                &path,
1594                headers,
1595                query,
1596                body,
1597            )
1598            .await
1599    }
1600/// 查询域名的WHOIS注册信息
1601    #[instrument(skip(self, params))]
1602    pub async fn get_network_whois(&self, params: GetNetworkWhoisParams) -> Result<Value> {
1603        let mut path = "/api/v1/network/whois".to_string();
1604
1605        let mut query: Vec<(String, String)> = Vec::new();
1606        query.push(("domain".to_string(), params.domain_query.clone()));
1607        if let Some(value) = &params.format_query {
1608            query.push(("format".to_string(), value.clone()));
1609        }
1610        let query = if query.is_empty() { None } else { Some(query) };
1611
1612        let mut extra_headers = HeaderMap::new();
1613        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1614        let body = None;
1615
1616        self.client
1617            .request_json(
1618                Method::GET,
1619                &path,
1620                headers,
1621                query,
1622                body,
1623            )
1624            .await
1625    }
1626/// 检查域名在微信中的访问状态
1627    #[instrument(skip(self, params))]
1628    pub async fn get_network_wxdomain(&self, params: GetNetworkWxdomainParams) -> Result<Value> {
1629        let mut path = "/api/v1/network/wxdomain".to_string();
1630
1631        let mut query: Vec<(String, String)> = Vec::new();
1632        query.push(("domain".to_string(), params.domain_query.clone()));
1633        let query = if query.is_empty() { None } else { Some(query) };
1634
1635        let mut extra_headers = HeaderMap::new();
1636        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1637        let body = None;
1638
1639        self.client
1640            .request_json(
1641                Method::GET,
1642                &path,
1643                headers,
1644                query,
1645                body,
1646            )
1647            .await
1648    }
1649}
1650
1651#[derive(Debug, Clone)]
1652pub struct GetNetworkDnsParams {
1653    pub domain_query: String,
1654    pub type_query: Option<String>,
1655}
1656
1657impl GetNetworkDnsParams {
1658    pub fn new(domain_query: impl Into<String>) -> Self {
1659        Self {
1660            domain_query: domain_query.into(),
1661            type_query: None,
1662        }
1663    }
1664    pub fn type_query(mut self, value: impl Into<String>) -> Self {
1665        self.type_query = Some(value.into());
1666        self
1667    }
1668}
1669
1670#[derive(Debug, Clone)]
1671pub struct GetNetworkIcpParams {
1672    pub domain_query: String,
1673}
1674
1675impl GetNetworkIcpParams {
1676    pub fn new(domain_query: impl Into<String>) -> Self {
1677        Self {
1678            domain_query: domain_query.into(),
1679        }
1680    }
1681}
1682
1683#[derive(Debug, Clone)]
1684pub struct GetNetworkIpinfoParams {
1685    pub ip_query: String,
1686    pub source_query: Option<String>,
1687}
1688
1689impl GetNetworkIpinfoParams {
1690    pub fn new(ip_query: impl Into<String>) -> Self {
1691        Self {
1692            ip_query: ip_query.into(),
1693            source_query: None,
1694        }
1695    }
1696    pub fn source_query(mut self, value: impl Into<String>) -> Self {
1697        self.source_query = Some(value.into());
1698        self
1699    }
1700}
1701
1702#[derive(Debug, Clone)]
1703pub struct GetNetworkMyipParams {
1704    pub source_query: Option<String>,
1705}
1706
1707impl GetNetworkMyipParams {
1708    pub fn new() -> Self {
1709        Self {
1710            source_query: None,
1711        }
1712    }
1713    pub fn source_query(mut self, value: impl Into<String>) -> Self {
1714        self.source_query = Some(value.into());
1715        self
1716    }
1717}
1718
1719#[derive(Debug, Clone)]
1720pub struct GetNetworkPingParams {
1721    pub host_query: String,
1722}
1723
1724impl GetNetworkPingParams {
1725    pub fn new(host_query: impl Into<String>) -> Self {
1726        Self {
1727            host_query: host_query.into(),
1728        }
1729    }
1730}
1731
1732
1733#[derive(Debug, Clone)]
1734pub struct GetNetworkPortscanParams {
1735    pub host_query: String,
1736    pub port_query: String,
1737    pub protocol_query: Option<String>,
1738}
1739
1740impl GetNetworkPortscanParams {
1741    pub fn new(host_query: impl Into<String>, port_query: impl Into<String>) -> Self {
1742        Self {
1743            host_query: host_query.into(),
1744            port_query: port_query.into(),
1745            protocol_query: None,
1746        }
1747    }
1748    pub fn protocol_query(mut self, value: impl Into<String>) -> Self {
1749        self.protocol_query = Some(value.into());
1750        self
1751    }
1752}
1753
1754#[derive(Debug, Clone)]
1755pub struct GetNetworkUrlstatusParams {
1756    pub url_query: String,
1757}
1758
1759impl GetNetworkUrlstatusParams {
1760    pub fn new(url_query: impl Into<String>) -> Self {
1761        Self {
1762            url_query: url_query.into(),
1763        }
1764    }
1765}
1766
1767#[derive(Debug, Clone)]
1768pub struct GetNetworkWhoisParams {
1769    pub domain_query: String,
1770    pub format_query: Option<String>,
1771}
1772
1773impl GetNetworkWhoisParams {
1774    pub fn new(domain_query: impl Into<String>) -> Self {
1775        Self {
1776            domain_query: domain_query.into(),
1777            format_query: None,
1778        }
1779    }
1780    pub fn format_query(mut self, value: impl Into<String>) -> Self {
1781        self.format_query = Some(value.into());
1782        self
1783    }
1784}
1785
1786#[derive(Debug, Clone)]
1787pub struct GetNetworkWxdomainParams {
1788    pub domain_query: String,
1789}
1790
1791impl GetNetworkWxdomainParams {
1792    pub fn new(domain_query: impl Into<String>) -> Self {
1793        Self {
1794            domain_query: domain_query.into(),
1795        }
1796    }
1797}
1798#[derive(Debug, Clone)]
1799pub struct PoemService<'a> {
1800    pub(crate) client: &'a Client,
1801}
1802
1803impl<'a> PoemService<'a> {
1804/// 随机获取一句诗词或名言
1805    #[instrument(skip(self))]
1806    pub async fn get_saying(&self) -> Result<Value> {
1807        let mut path = "/api/v1/saying".to_string();
1808
1809        let mut query: Vec<(String, String)> = Vec::new();
1810        let query = if query.is_empty() { None } else { Some(query) };
1811
1812        let mut extra_headers = HeaderMap::new();
1813        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1814        let body = None;
1815
1816        self.client
1817            .request_json(
1818                Method::GET,
1819                &path,
1820                headers,
1821                query,
1822                body,
1823            )
1824            .await
1825    }
1826}
1827
1828#[derive(Debug, Clone)]
1829pub struct RandomService<'a> {
1830    pub(crate) client: &'a Client,
1831}
1832
1833impl<'a> RandomService<'a> {
1834/// 获取答案之书的神秘答案 (GET)
1835    #[instrument(skip(self, params))]
1836    pub async fn get_answerbook_ask(&self, params: GetAnswerbookAskParams) -> Result<Value> {
1837        let mut path = "/api/v1/answerbook/ask".to_string();
1838
1839        let mut query: Vec<(String, String)> = Vec::new();
1840        query.push(("question".to_string(), params.question_query.clone()));
1841        let query = if query.is_empty() { None } else { Some(query) };
1842
1843        let mut extra_headers = HeaderMap::new();
1844        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1845        let body = None;
1846
1847        self.client
1848            .request_json(
1849                Method::GET,
1850                &path,
1851                headers,
1852                query,
1853                body,
1854            )
1855            .await
1856    }
1857/// 随机二次元、风景、动漫图片壁纸
1858    #[instrument(skip(self, params))]
1859    pub async fn get_random_image(&self, params: GetRandomImageParams) -> Result<Value> {
1860        let mut path = "/api/v1/random/image".to_string();
1861
1862        let mut query: Vec<(String, String)> = Vec::new();
1863        if let Some(value) = &params.category_query {
1864            query.push(("category".to_string(), value.clone()));
1865        }
1866        if let Some(value) = &params.type_query {
1867            query.push(("type".to_string(), value.clone()));
1868        }
1869        let query = if query.is_empty() { None } else { Some(query) };
1870
1871        let mut extra_headers = HeaderMap::new();
1872        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1873        let body = None;
1874
1875        self.client
1876            .request_json(
1877                Method::GET,
1878                &path,
1879                headers,
1880                query,
1881                body,
1882            )
1883            .await
1884    }
1885/// 生成高度可定制的随机字符串
1886    #[instrument(skip(self, params))]
1887    pub async fn get_random_string(&self, params: GetRandomStringParams) -> Result<Value> {
1888        let mut path = "/api/v1/random/string".to_string();
1889
1890        let mut query: Vec<(String, String)> = Vec::new();
1891        if let Some(value) = &params.length_query {
1892            query.push(("length".to_string(), value.clone()));
1893        }
1894        if let Some(value) = &params.type_query {
1895            query.push(("type".to_string(), value.clone()));
1896        }
1897        let query = if query.is_empty() { None } else { Some(query) };
1898
1899        let mut extra_headers = HeaderMap::new();
1900        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1901        let body = None;
1902
1903        self.client
1904            .request_json(
1905                Method::GET,
1906                &path,
1907                headers,
1908                query,
1909                body,
1910            )
1911            .await
1912    }
1913/// 获取答案之书的神秘答案 (POST)
1914    #[instrument(skip(self, params))]
1915    pub async fn post_answerbook_ask(&self, params: PostAnswerbookAskParams) -> Result<Value> {
1916        let mut path = "/api/v1/answerbook/ask".to_string();
1917
1918        let mut query: Vec<(String, String)> = Vec::new();
1919        let query = if query.is_empty() { None } else { Some(query) };
1920
1921        let mut extra_headers = HeaderMap::new();
1922        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
1923        let body = params.body.clone();
1924
1925        self.client
1926            .request_json(
1927                Method::POST,
1928                &path,
1929                headers,
1930                query,
1931                body,
1932            )
1933            .await
1934    }
1935}
1936
1937#[derive(Debug, Clone)]
1938pub struct GetAnswerbookAskParams {
1939    pub question_query: String,
1940}
1941
1942impl GetAnswerbookAskParams {
1943    pub fn new(question_query: impl Into<String>) -> Self {
1944        Self {
1945            question_query: question_query.into(),
1946        }
1947    }
1948}
1949
1950#[derive(Debug, Clone)]
1951pub struct GetRandomImageParams {
1952    pub category_query: Option<String>,
1953    pub type_query: Option<String>,
1954}
1955
1956impl GetRandomImageParams {
1957    pub fn new() -> Self {
1958        Self {
1959            category_query: None,
1960            type_query: None,
1961        }
1962    }
1963    pub fn category_query(mut self, value: impl Into<String>) -> Self {
1964        self.category_query = Some(value.into());
1965        self
1966    }
1967    pub fn type_query(mut self, value: impl Into<String>) -> Self {
1968        self.type_query = Some(value.into());
1969        self
1970    }
1971}
1972
1973#[derive(Debug, Clone)]
1974pub struct GetRandomStringParams {
1975    pub length_query: Option<String>,
1976    pub type_query: Option<String>,
1977}
1978
1979impl GetRandomStringParams {
1980    pub fn new() -> Self {
1981        Self {
1982            length_query: None,
1983            type_query: None,
1984        }
1985    }
1986    pub fn length_query(mut self, value: impl Into<String>) -> Self {
1987        self.length_query = Some(value.into());
1988        self
1989    }
1990    pub fn type_query(mut self, value: impl Into<String>) -> Self {
1991        self.type_query = Some(value.into());
1992        self
1993    }
1994}
1995
1996#[derive(Debug, Clone)]
1997pub struct PostAnswerbookAskParams {
1998    pub body: Option<Value>,
1999}
2000
2001impl PostAnswerbookAskParams {
2002    pub fn new() -> Self {
2003        Self {
2004            body: None,
2005        }
2006    }
2007    pub fn body(mut self, value: Value) -> Self {
2008        self.body = Some(value);
2009        self
2010    }
2011}
2012#[derive(Debug, Clone)]
2013pub struct SocialService<'a> {
2014    pub(crate) client: &'a Client,
2015}
2016
2017impl<'a> SocialService<'a> {
2018/// 获取GitHub仓库信息
2019    #[instrument(skip(self, params))]
2020    pub async fn get_github_repo(&self, params: GetGithubRepoParams) -> Result<Value> {
2021        let mut path = "/api/v1/github/repo".to_string();
2022
2023        let mut query: Vec<(String, String)> = Vec::new();
2024        query.push(("repo".to_string(), params.repo_query.clone()));
2025        let query = if query.is_empty() { None } else { Some(query) };
2026
2027        let mut extra_headers = HeaderMap::new();
2028        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2029        let body = None;
2030
2031        self.client
2032            .request_json(
2033                Method::GET,
2034                &path,
2035                headers,
2036                query,
2037                body,
2038            )
2039            .await
2040    }
2041/// 获取Bilibili用户投稿列表
2042    #[instrument(skip(self, params))]
2043    pub async fn get_social_bilibili_archives(&self, params: GetSocialBilibiliArchivesParams) -> Result<Value> {
2044        let mut path = "/api/v1/social/bilibili/archives".to_string();
2045
2046        let mut query: Vec<(String, String)> = Vec::new();
2047        query.push(("mid".to_string(), params.mid_query.clone()));
2048        if let Some(value) = &params.keywords_query {
2049            query.push(("keywords".to_string(), value.clone()));
2050        }
2051        if let Some(value) = &params.orderby_query {
2052            query.push(("orderby".to_string(), value.clone()));
2053        }
2054        if let Some(value) = &params.ps_query {
2055            query.push(("ps".to_string(), value.clone()));
2056        }
2057        if let Some(value) = &params.pn_query {
2058            query.push(("pn".to_string(), value.clone()));
2059        }
2060        let query = if query.is_empty() { None } else { Some(query) };
2061
2062        let mut extra_headers = HeaderMap::new();
2063        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2064        let body = None;
2065
2066        self.client
2067            .request_json(
2068                Method::GET,
2069                &path,
2070                headers,
2071                query,
2072                body,
2073            )
2074            .await
2075    }
2076/// 获取Bilibili直播间信息
2077    #[instrument(skip(self, params))]
2078    pub async fn get_social_bilibili_liveroom(&self, params: GetSocialBilibiliLiveroomParams) -> Result<Value> {
2079        let mut path = "/api/v1/social/bilibili/liveroom".to_string();
2080
2081        let mut query: Vec<(String, String)> = Vec::new();
2082        if let Some(value) = &params.mid_query {
2083            query.push(("mid".to_string(), value.clone()));
2084        }
2085        if let Some(value) = &params.room_id_query {
2086            query.push(("room_id".to_string(), value.clone()));
2087        }
2088        let query = if query.is_empty() { None } else { Some(query) };
2089
2090        let mut extra_headers = HeaderMap::new();
2091        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2092        let body = None;
2093
2094        self.client
2095            .request_json(
2096                Method::GET,
2097                &path,
2098                headers,
2099                query,
2100                body,
2101            )
2102            .await
2103    }
2104/// 获取Bilibili视频评论
2105    #[instrument(skip(self, params))]
2106    pub async fn get_social_bilibili_replies(&self, params: GetSocialBilibiliRepliesParams) -> Result<Value> {
2107        let mut path = "/api/v1/social/bilibili/replies".to_string();
2108
2109        let mut query: Vec<(String, String)> = Vec::new();
2110        query.push(("oid".to_string(), params.oid_query.clone()));
2111        if let Some(value) = &params.sort_query {
2112            query.push(("sort".to_string(), value.clone()));
2113        }
2114        if let Some(value) = &params.ps_query {
2115            query.push(("ps".to_string(), value.clone()));
2116        }
2117        if let Some(value) = &params.pn_query {
2118            query.push(("pn".to_string(), value.clone()));
2119        }
2120        let query = if query.is_empty() { None } else { Some(query) };
2121
2122        let mut extra_headers = HeaderMap::new();
2123        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2124        let body = None;
2125
2126        self.client
2127            .request_json(
2128                Method::GET,
2129                &path,
2130                headers,
2131                query,
2132                body,
2133            )
2134            .await
2135    }
2136/// 查询Bilibili用户信息
2137    #[instrument(skip(self, params))]
2138    pub async fn get_social_bilibili_userinfo(&self, params: GetSocialBilibiliUserinfoParams) -> Result<Value> {
2139        let mut path = "/api/v1/social/bilibili/userinfo".to_string();
2140
2141        let mut query: Vec<(String, String)> = Vec::new();
2142        query.push(("uid".to_string(), params.uid_query.clone()));
2143        let query = if query.is_empty() { None } else { Some(query) };
2144
2145        let mut extra_headers = HeaderMap::new();
2146        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2147        let body = None;
2148
2149        self.client
2150            .request_json(
2151                Method::GET,
2152                &path,
2153                headers,
2154                query,
2155                body,
2156            )
2157            .await
2158    }
2159/// 获取Bilibili视频详细信息
2160    #[instrument(skip(self, params))]
2161    pub async fn get_social_bilibili_videoinfo(&self, params: GetSocialBilibiliVideoinfoParams) -> Result<Value> {
2162        let mut path = "/api/v1/social/bilibili/videoinfo".to_string();
2163
2164        let mut query: Vec<(String, String)> = Vec::new();
2165        if let Some(value) = &params.aid_query {
2166            query.push(("aid".to_string(), value.clone()));
2167        }
2168        if let Some(value) = &params.bvid_query {
2169            query.push(("bvid".to_string(), value.clone()));
2170        }
2171        let query = if query.is_empty() { None } else { Some(query) };
2172
2173        let mut extra_headers = HeaderMap::new();
2174        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2175        let body = None;
2176
2177        self.client
2178            .request_json(
2179                Method::GET,
2180                &path,
2181                headers,
2182                query,
2183                body,
2184            )
2185            .await
2186    }
2187/// 获取QQ群名称、头像、简介
2188    #[instrument(skip(self, params))]
2189    pub async fn get_social_qq_groupinfo(&self, params: GetSocialQqGroupinfoParams) -> Result<Value> {
2190        let mut path = "/api/v1/social/qq/groupinfo".to_string();
2191
2192        let mut query: Vec<(String, String)> = Vec::new();
2193        query.push(("group_id".to_string(), params.group_id_query.clone()));
2194        let query = if query.is_empty() { None } else { Some(query) };
2195
2196        let mut extra_headers = HeaderMap::new();
2197        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2198        let body = None;
2199
2200        self.client
2201            .request_json(
2202                Method::GET,
2203                &path,
2204                headers,
2205                query,
2206                body,
2207            )
2208            .await
2209    }
2210/// 独家获取QQ号头像、昵称
2211    #[instrument(skip(self, params))]
2212    pub async fn get_social_qq_userinfo(&self, params: GetSocialQqUserinfoParams) -> Result<Value> {
2213        let mut path = "/api/v1/social/qq/userinfo".to_string();
2214
2215        let mut query: Vec<(String, String)> = Vec::new();
2216        query.push(("qq".to_string(), params.qq_query.clone()));
2217        let query = if query.is_empty() { None } else { Some(query) };
2218
2219        let mut extra_headers = HeaderMap::new();
2220        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2221        let body = None;
2222
2223        self.client
2224            .request_json(
2225                Method::GET,
2226                &path,
2227                headers,
2228                query,
2229                body,
2230            )
2231            .await
2232    }
2233}
2234
2235#[derive(Debug, Clone)]
2236pub struct GetGithubRepoParams {
2237    pub repo_query: String,
2238}
2239
2240impl GetGithubRepoParams {
2241    pub fn new(repo_query: impl Into<String>) -> Self {
2242        Self {
2243            repo_query: repo_query.into(),
2244        }
2245    }
2246}
2247
2248#[derive(Debug, Clone)]
2249pub struct GetSocialBilibiliArchivesParams {
2250    pub mid_query: String,
2251    pub keywords_query: Option<String>,
2252    pub orderby_query: Option<String>,
2253    pub ps_query: Option<String>,
2254    pub pn_query: Option<String>,
2255}
2256
2257impl GetSocialBilibiliArchivesParams {
2258    pub fn new(mid_query: impl Into<String>) -> Self {
2259        Self {
2260            mid_query: mid_query.into(),
2261            keywords_query: None,
2262            orderby_query: None,
2263            ps_query: None,
2264            pn_query: None,
2265        }
2266    }
2267    pub fn keywords_query(mut self, value: impl Into<String>) -> Self {
2268        self.keywords_query = Some(value.into());
2269        self
2270    }
2271    pub fn orderby_query(mut self, value: impl Into<String>) -> Self {
2272        self.orderby_query = Some(value.into());
2273        self
2274    }
2275    pub fn ps_query(mut self, value: impl Into<String>) -> Self {
2276        self.ps_query = Some(value.into());
2277        self
2278    }
2279    pub fn pn_query(mut self, value: impl Into<String>) -> Self {
2280        self.pn_query = Some(value.into());
2281        self
2282    }
2283}
2284
2285#[derive(Debug, Clone)]
2286pub struct GetSocialBilibiliLiveroomParams {
2287    pub mid_query: Option<String>,
2288    pub room_id_query: Option<String>,
2289}
2290
2291impl GetSocialBilibiliLiveroomParams {
2292    pub fn new() -> Self {
2293        Self {
2294            mid_query: None,
2295            room_id_query: None,
2296        }
2297    }
2298    pub fn mid_query(mut self, value: impl Into<String>) -> Self {
2299        self.mid_query = Some(value.into());
2300        self
2301    }
2302    pub fn room_id_query(mut self, value: impl Into<String>) -> Self {
2303        self.room_id_query = Some(value.into());
2304        self
2305    }
2306}
2307
2308#[derive(Debug, Clone)]
2309pub struct GetSocialBilibiliRepliesParams {
2310    pub oid_query: String,
2311    pub sort_query: Option<String>,
2312    pub ps_query: Option<String>,
2313    pub pn_query: Option<String>,
2314}
2315
2316impl GetSocialBilibiliRepliesParams {
2317    pub fn new(oid_query: impl Into<String>) -> Self {
2318        Self {
2319            oid_query: oid_query.into(),
2320            sort_query: None,
2321            ps_query: None,
2322            pn_query: None,
2323        }
2324    }
2325    pub fn sort_query(mut self, value: impl Into<String>) -> Self {
2326        self.sort_query = Some(value.into());
2327        self
2328    }
2329    pub fn ps_query(mut self, value: impl Into<String>) -> Self {
2330        self.ps_query = Some(value.into());
2331        self
2332    }
2333    pub fn pn_query(mut self, value: impl Into<String>) -> Self {
2334        self.pn_query = Some(value.into());
2335        self
2336    }
2337}
2338
2339#[derive(Debug, Clone)]
2340pub struct GetSocialBilibiliUserinfoParams {
2341    pub uid_query: String,
2342}
2343
2344impl GetSocialBilibiliUserinfoParams {
2345    pub fn new(uid_query: impl Into<String>) -> Self {
2346        Self {
2347            uid_query: uid_query.into(),
2348        }
2349    }
2350}
2351
2352#[derive(Debug, Clone)]
2353pub struct GetSocialBilibiliVideoinfoParams {
2354    pub aid_query: Option<String>,
2355    pub bvid_query: Option<String>,
2356}
2357
2358impl GetSocialBilibiliVideoinfoParams {
2359    pub fn new() -> Self {
2360        Self {
2361            aid_query: None,
2362            bvid_query: None,
2363        }
2364    }
2365    pub fn aid_query(mut self, value: impl Into<String>) -> Self {
2366        self.aid_query = Some(value.into());
2367        self
2368    }
2369    pub fn bvid_query(mut self, value: impl Into<String>) -> Self {
2370        self.bvid_query = Some(value.into());
2371        self
2372    }
2373}
2374
2375#[derive(Debug, Clone)]
2376pub struct GetSocialQqGroupinfoParams {
2377    pub group_id_query: String,
2378}
2379
2380impl GetSocialQqGroupinfoParams {
2381    pub fn new(group_id_query: impl Into<String>) -> Self {
2382        Self {
2383            group_id_query: group_id_query.into(),
2384        }
2385    }
2386}
2387
2388#[derive(Debug, Clone)]
2389pub struct GetSocialQqUserinfoParams {
2390    pub qq_query: String,
2391}
2392
2393impl GetSocialQqUserinfoParams {
2394    pub fn new(qq_query: impl Into<String>) -> Self {
2395        Self {
2396            qq_query: qq_query.into(),
2397        }
2398    }
2399}
2400#[derive(Debug, Clone)]
2401pub struct StatusService<'a> {
2402    pub(crate) client: &'a Client,
2403}
2404
2405impl<'a> StatusService<'a> {
2406/// 获取API限流器实时状态
2407    #[instrument(skip(self, params))]
2408    pub async fn get_status_ratelimit(&self, params: GetStatusRatelimitParams) -> Result<Value> {
2409        let mut path = "/api/v1/status/ratelimit".to_string();
2410
2411        let mut query: Vec<(String, String)> = Vec::new();
2412        let query = if query.is_empty() { None } else { Some(query) };
2413
2414        let mut extra_headers = HeaderMap::new();
2415        extra_headers.insert(
2416            "Authorization",
2417            HeaderValue::from_str(&params.authorization_header).map_err(|_| Error::InvalidHeader { name: "Authorization".into() })?,
2418        );
2419        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2420        let body = None;
2421
2422        self.client
2423            .request_json(
2424                Method::GET,
2425                &path,
2426                headers,
2427                query,
2428                body,
2429            )
2430            .await
2431    }
2432/// 获取API端点使用统计
2433    #[instrument(skip(self, params))]
2434    pub async fn get_status_usage(&self, params: GetStatusUsageParams) -> Result<Value> {
2435        let mut path = "/api/v1/status/usage".to_string();
2436
2437        let mut query: Vec<(String, String)> = Vec::new();
2438        if let Some(value) = &params.path_query {
2439            query.push(("path".to_string(), value.clone()));
2440        }
2441        let query = if query.is_empty() { None } else { Some(query) };
2442
2443        let mut extra_headers = HeaderMap::new();
2444        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2445        let body = None;
2446
2447        self.client
2448            .request_json(
2449                Method::GET,
2450                &path,
2451                headers,
2452                query,
2453                body,
2454            )
2455            .await
2456    }
2457}
2458
2459#[derive(Debug, Clone)]
2460pub struct GetStatusRatelimitParams {
2461    pub authorization_header: String,
2462}
2463
2464impl GetStatusRatelimitParams {
2465    pub fn new(authorization_header: impl Into<String>) -> Self {
2466        Self {
2467            authorization_header: authorization_header.into(),
2468        }
2469    }
2470}
2471
2472#[derive(Debug, Clone)]
2473pub struct GetStatusUsageParams {
2474    pub path_query: Option<String>,
2475}
2476
2477impl GetStatusUsageParams {
2478    pub fn new() -> Self {
2479        Self {
2480            path_query: None,
2481        }
2482    }
2483    pub fn path_query(mut self, value: impl Into<String>) -> Self {
2484        self.path_query = Some(value.into());
2485        self
2486    }
2487}
2488#[derive(Debug, Clone)]
2489pub struct TextService<'a> {
2490    pub(crate) client: &'a Client,
2491}
2492
2493impl<'a> TextService<'a> {
2494/// 计算文本的MD5哈希值(GET)
2495    #[instrument(skip(self, params))]
2496    pub async fn get_text_md_5(&self, params: GetTextMd5Params) -> Result<Value> {
2497        let mut path = "/api/v1/text/md5".to_string();
2498
2499        let mut query: Vec<(String, String)> = Vec::new();
2500        query.push(("text".to_string(), params.text_query.clone()));
2501        let query = if query.is_empty() { None } else { Some(query) };
2502
2503        let mut extra_headers = HeaderMap::new();
2504        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2505        let body = None;
2506
2507        self.client
2508            .request_json(
2509                Method::GET,
2510                &path,
2511                headers,
2512                query,
2513                body,
2514            )
2515            .await
2516    }
2517/// 使用AES算法解密文本
2518    #[instrument(skip(self, params))]
2519    pub async fn post_text_aes_decrypt(&self, params: PostTextAesDecryptParams) -> Result<Value> {
2520        let mut path = "/api/v1/text/aes/decrypt".to_string();
2521
2522        let mut query: Vec<(String, String)> = Vec::new();
2523        let query = if query.is_empty() { None } else { Some(query) };
2524
2525        let mut extra_headers = HeaderMap::new();
2526        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2527        let body = params.body.clone();
2528
2529        self.client
2530            .request_json(
2531                Method::POST,
2532                &path,
2533                headers,
2534                query,
2535                body,
2536            )
2537            .await
2538    }
2539/// 使用AES算法加密文本
2540    #[instrument(skip(self, params))]
2541    pub async fn post_text_aes_encrypt(&self, params: PostTextAesEncryptParams) -> Result<Value> {
2542        let mut path = "/api/v1/text/aes/encrypt".to_string();
2543
2544        let mut query: Vec<(String, String)> = Vec::new();
2545        let query = if query.is_empty() { None } else { Some(query) };
2546
2547        let mut extra_headers = HeaderMap::new();
2548        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2549        let body = params.body.clone();
2550
2551        self.client
2552            .request_json(
2553                Method::POST,
2554                &path,
2555                headers,
2556                query,
2557                body,
2558            )
2559            .await
2560    }
2561/// 多维度分析文本内容
2562    #[instrument(skip(self, params))]
2563    pub async fn post_text_analyze(&self, params: PostTextAnalyzeParams) -> Result<Value> {
2564        let mut path = "/api/v1/text/analyze".to_string();
2565
2566        let mut query: Vec<(String, String)> = Vec::new();
2567        let query = if query.is_empty() { None } else { Some(query) };
2568
2569        let mut extra_headers = HeaderMap::new();
2570        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2571        let body = params.body.clone();
2572
2573        self.client
2574            .request_json(
2575                Method::POST,
2576                &path,
2577                headers,
2578                query,
2579                body,
2580            )
2581            .await
2582    }
2583/// 解码Base64编码的文本
2584    #[instrument(skip(self, params))]
2585    pub async fn post_text_base_64_decode(&self, params: PostTextBase64DecodeParams) -> Result<Value> {
2586        let mut path = "/api/v1/text/base64/decode".to_string();
2587
2588        let mut query: Vec<(String, String)> = Vec::new();
2589        let query = if query.is_empty() { None } else { Some(query) };
2590
2591        let mut extra_headers = HeaderMap::new();
2592        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2593        let body = params.body.clone();
2594
2595        self.client
2596            .request_json(
2597                Method::POST,
2598                &path,
2599                headers,
2600                query,
2601                body,
2602            )
2603            .await
2604    }
2605/// 将文本进行Base64编码
2606    #[instrument(skip(self, params))]
2607    pub async fn post_text_base_64_encode(&self, params: PostTextBase64EncodeParams) -> Result<Value> {
2608        let mut path = "/api/v1/text/base64/encode".to_string();
2609
2610        let mut query: Vec<(String, String)> = Vec::new();
2611        let query = if query.is_empty() { None } else { Some(query) };
2612
2613        let mut extra_headers = HeaderMap::new();
2614        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2615        let body = params.body.clone();
2616
2617        self.client
2618            .request_json(
2619                Method::POST,
2620                &path,
2621                headers,
2622                query,
2623                body,
2624            )
2625            .await
2626    }
2627/// 计算文本的MD5哈希值 (POST)
2628    #[instrument(skip(self, params))]
2629    pub async fn post_text_md_5(&self, params: PostTextMd5Params) -> Result<Value> {
2630        let mut path = "/api/v1/text/md5".to_string();
2631
2632        let mut query: Vec<(String, String)> = Vec::new();
2633        let query = if query.is_empty() { None } else { Some(query) };
2634
2635        let mut extra_headers = HeaderMap::new();
2636        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2637        let body = params.body.clone();
2638
2639        self.client
2640            .request_json(
2641                Method::POST,
2642                &path,
2643                headers,
2644                query,
2645                body,
2646            )
2647            .await
2648    }
2649/// 校验MD5哈希值
2650    #[instrument(skip(self, params))]
2651    pub async fn post_text_md_5_verify(&self, params: PostTextMd5VerifyParams) -> Result<Value> {
2652        let mut path = "/api/v1/text/md5/verify".to_string();
2653
2654        let mut query: Vec<(String, String)> = Vec::new();
2655        let query = if query.is_empty() { None } else { Some(query) };
2656
2657        let mut extra_headers = HeaderMap::new();
2658        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2659        let body = params.body.clone();
2660
2661        self.client
2662            .request_json(
2663                Method::POST,
2664                &path,
2665                headers,
2666                query,
2667                body,
2668            )
2669            .await
2670    }
2671}
2672
2673#[derive(Debug, Clone)]
2674pub struct GetTextMd5Params {
2675    pub text_query: String,
2676}
2677
2678impl GetTextMd5Params {
2679    pub fn new(text_query: impl Into<String>) -> Self {
2680        Self {
2681            text_query: text_query.into(),
2682        }
2683    }
2684}
2685
2686#[derive(Debug, Clone)]
2687pub struct PostTextAesDecryptParams {
2688    pub body: Option<Value>,
2689}
2690
2691impl PostTextAesDecryptParams {
2692    pub fn new() -> Self {
2693        Self {
2694            body: None,
2695        }
2696    }
2697    pub fn body(mut self, value: Value) -> Self {
2698        self.body = Some(value);
2699        self
2700    }
2701}
2702
2703#[derive(Debug, Clone)]
2704pub struct PostTextAesEncryptParams {
2705    pub body: Option<Value>,
2706}
2707
2708impl PostTextAesEncryptParams {
2709    pub fn new() -> Self {
2710        Self {
2711            body: None,
2712        }
2713    }
2714    pub fn body(mut self, value: Value) -> Self {
2715        self.body = Some(value);
2716        self
2717    }
2718}
2719
2720#[derive(Debug, Clone)]
2721pub struct PostTextAnalyzeParams {
2722    pub body: Option<Value>,
2723}
2724
2725impl PostTextAnalyzeParams {
2726    pub fn new() -> Self {
2727        Self {
2728            body: None,
2729        }
2730    }
2731    pub fn body(mut self, value: Value) -> Self {
2732        self.body = Some(value);
2733        self
2734    }
2735}
2736
2737#[derive(Debug, Clone)]
2738pub struct PostTextBase64DecodeParams {
2739    pub body: Option<Value>,
2740}
2741
2742impl PostTextBase64DecodeParams {
2743    pub fn new() -> Self {
2744        Self {
2745            body: None,
2746        }
2747    }
2748    pub fn body(mut self, value: Value) -> Self {
2749        self.body = Some(value);
2750        self
2751    }
2752}
2753
2754#[derive(Debug, Clone)]
2755pub struct PostTextBase64EncodeParams {
2756    pub body: Option<Value>,
2757}
2758
2759impl PostTextBase64EncodeParams {
2760    pub fn new() -> Self {
2761        Self {
2762            body: None,
2763        }
2764    }
2765    pub fn body(mut self, value: Value) -> Self {
2766        self.body = Some(value);
2767        self
2768    }
2769}
2770
2771#[derive(Debug, Clone)]
2772pub struct PostTextMd5Params {
2773    pub body: Option<Value>,
2774}
2775
2776impl PostTextMd5Params {
2777    pub fn new() -> Self {
2778        Self {
2779            body: None,
2780        }
2781    }
2782    pub fn body(mut self, value: Value) -> Self {
2783        self.body = Some(value);
2784        self
2785    }
2786}
2787
2788#[derive(Debug, Clone)]
2789pub struct PostTextMd5VerifyParams {
2790    pub body: Option<Value>,
2791}
2792
2793impl PostTextMd5VerifyParams {
2794    pub fn new() -> Self {
2795        Self {
2796            body: None,
2797        }
2798    }
2799    pub fn body(mut self, value: Value) -> Self {
2800        self.body = Some(value);
2801        self
2802    }
2803}
2804#[derive(Debug, Clone)]
2805pub struct TranslateService<'a> {
2806    pub(crate) client: &'a Client,
2807}
2808
2809impl<'a> TranslateService<'a> {
2810/// 获取AI翻译支持的语言和配置
2811    #[instrument(skip(self))]
2812    pub async fn get_ai_translate_languages(&self) -> Result<Value> {
2813        let mut path = "/api/v1/ai/translate/languages".to_string();
2814
2815        let mut query: Vec<(String, String)> = Vec::new();
2816        let query = if query.is_empty() { None } else { Some(query) };
2817
2818        let mut extra_headers = HeaderMap::new();
2819        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2820        let body = None;
2821
2822        self.client
2823            .request_json(
2824                Method::GET,
2825                &path,
2826                headers,
2827                query,
2828                body,
2829            )
2830            .await
2831    }
2832/// AI智能翻译
2833    #[instrument(skip(self, params))]
2834    pub async fn post_ai_translate(&self, params: PostAiTranslateParams) -> Result<Value> {
2835        let mut path = "/api/v1/ai/translate".to_string();
2836
2837        let mut query: Vec<(String, String)> = Vec::new();
2838        query.push(("target_lang".to_string(), params.target_lang_query.clone()));
2839        let query = if query.is_empty() { None } else { Some(query) };
2840
2841        let mut extra_headers = HeaderMap::new();
2842        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2843        let body = params.body.clone();
2844
2845        self.client
2846            .request_json(
2847                Method::POST,
2848                &path,
2849                headers,
2850                query,
2851                body,
2852            )
2853            .await
2854    }
2855/// 流式翻译(中英互译)
2856    #[instrument(skip(self, params))]
2857    pub async fn post_translate_stream(&self, params: PostTranslateStreamParams) -> Result<Value> {
2858        let mut path = "/api/v1/translate/stream".to_string();
2859
2860        let mut query: Vec<(String, String)> = Vec::new();
2861        let query = if query.is_empty() { None } else { Some(query) };
2862
2863        let mut extra_headers = HeaderMap::new();
2864        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2865        let body = params.body.clone();
2866
2867        self.client
2868            .request_json(
2869                Method::POST,
2870                &path,
2871                headers,
2872                query,
2873                body,
2874            )
2875            .await
2876    }
2877/// 多语言文本翻译
2878    #[instrument(skip(self, params))]
2879    pub async fn post_translate_text(&self, params: PostTranslateTextParams) -> Result<Value> {
2880        let mut path = "/api/v1/translate/text".to_string();
2881
2882        let mut query: Vec<(String, String)> = Vec::new();
2883        query.push(("to_lang".to_string(), params.to_lang_query.clone()));
2884        let query = if query.is_empty() { None } else { Some(query) };
2885
2886        let mut extra_headers = HeaderMap::new();
2887        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2888        let body = params.body.clone();
2889
2890        self.client
2891            .request_json(
2892                Method::POST,
2893                &path,
2894                headers,
2895                query,
2896                body,
2897            )
2898            .await
2899    }
2900}
2901
2902
2903#[derive(Debug, Clone)]
2904pub struct PostAiTranslateParams {
2905    pub target_lang_query: String,
2906    pub body: Option<Value>,
2907}
2908
2909impl PostAiTranslateParams {
2910    pub fn new(target_lang_query: impl Into<String>) -> Self {
2911        Self {
2912            target_lang_query: target_lang_query.into(),
2913            body: None,
2914        }
2915    }
2916    pub fn body(mut self, value: Value) -> Self {
2917        self.body = Some(value);
2918        self
2919    }
2920}
2921
2922#[derive(Debug, Clone)]
2923pub struct PostTranslateStreamParams {
2924    pub body: Option<Value>,
2925}
2926
2927impl PostTranslateStreamParams {
2928    pub fn new() -> Self {
2929        Self {
2930            body: None,
2931        }
2932    }
2933    pub fn body(mut self, value: Value) -> Self {
2934        self.body = Some(value);
2935        self
2936    }
2937}
2938
2939#[derive(Debug, Clone)]
2940pub struct PostTranslateTextParams {
2941    pub to_lang_query: String,
2942    pub body: Option<Value>,
2943}
2944
2945impl PostTranslateTextParams {
2946    pub fn new(to_lang_query: impl Into<String>) -> Self {
2947        Self {
2948            to_lang_query: to_lang_query.into(),
2949            body: None,
2950        }
2951    }
2952    pub fn body(mut self, value: Value) -> Self {
2953        self.body = Some(value);
2954        self
2955    }
2956}
2957#[derive(Debug, Clone)]
2958pub struct WebparseService<'a> {
2959    pub(crate) client: &'a Client,
2960}
2961
2962impl<'a> WebparseService<'a> {
2963/// 查询网页转换任务状态和结果
2964    #[instrument(skip(self, params))]
2965    pub async fn get_web_tomarkdown_async_status(&self, params: GetWebTomarkdownAsyncStatusParams) -> Result<Value> {
2966        let mut path = "/api/v1/web/tomarkdown/async/{task_id}".to_string();
2967        {
2968            let encoded = encode(&params.task_id_path).into_owned();
2969            path = path.replace("{task_id}", &encoded);
2970        }
2971
2972        let mut query: Vec<(String, String)> = Vec::new();
2973        let query = if query.is_empty() { None } else { Some(query) };
2974
2975        let mut extra_headers = HeaderMap::new();
2976        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
2977        let body = None;
2978
2979        self.client
2980            .request_json(
2981                Method::GET,
2982                &path,
2983                headers,
2984                query,
2985                body,
2986            )
2987            .await
2988    }
2989/// 提取网页中的所有图片
2990    #[instrument(skip(self, params))]
2991    pub async fn get_webparse_extractimages(&self, params: GetWebparseExtractimagesParams) -> Result<Value> {
2992        let mut path = "/api/v1/webparse/extractimages".to_string();
2993
2994        let mut query: Vec<(String, String)> = Vec::new();
2995        query.push(("url".to_string(), params.url_query.clone()));
2996        let query = if query.is_empty() { None } else { Some(query) };
2997
2998        let mut extra_headers = HeaderMap::new();
2999        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3000        let body = None;
3001
3002        self.client
3003            .request_json(
3004                Method::GET,
3005                &path,
3006                headers,
3007                query,
3008                body,
3009            )
3010            .await
3011    }
3012/// 抓取并解析网页的元数据
3013    #[instrument(skip(self, params))]
3014    pub async fn get_webparse_metadata(&self, params: GetWebparseMetadataParams) -> Result<Value> {
3015        let mut path = "/api/v1/webparse/metadata".to_string();
3016
3017        let mut query: Vec<(String, String)> = Vec::new();
3018        query.push(("url".to_string(), params.url_query.clone()));
3019        let query = if query.is_empty() { None } else { Some(query) };
3020
3021        let mut extra_headers = HeaderMap::new();
3022        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3023        let body = None;
3024
3025        self.client
3026            .request_json(
3027                Method::GET,
3028                &path,
3029                headers,
3030                query,
3031                body,
3032            )
3033            .await
3034    }
3035/// 深度抓取网页转Markdown
3036    #[instrument(skip(self, params))]
3037    pub async fn post_web_tomarkdown_async(&self, params: PostWebTomarkdownAsyncParams) -> Result<Value> {
3038        let mut path = "/api/v1/web/tomarkdown/async".to_string();
3039
3040        let mut query: Vec<(String, String)> = Vec::new();
3041        query.push(("url".to_string(), params.url_query.clone()));
3042        let query = if query.is_empty() { None } else { Some(query) };
3043
3044        let mut extra_headers = HeaderMap::new();
3045        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3046        let body = None;
3047
3048        self.client
3049            .request_json(
3050                Method::POST,
3051                &path,
3052                headers,
3053                query,
3054                body,
3055            )
3056            .await
3057    }
3058}
3059
3060#[derive(Debug, Clone)]
3061pub struct GetWebTomarkdownAsyncStatusParams {
3062    pub task_id_path: String,
3063}
3064
3065impl GetWebTomarkdownAsyncStatusParams {
3066    pub fn new(task_id_path: impl Into<String>) -> Self {
3067        Self {
3068            task_id_path: task_id_path.into(),
3069        }
3070    }
3071}
3072
3073#[derive(Debug, Clone)]
3074pub struct GetWebparseExtractimagesParams {
3075    pub url_query: String,
3076}
3077
3078impl GetWebparseExtractimagesParams {
3079    pub fn new(url_query: impl Into<String>) -> Self {
3080        Self {
3081            url_query: url_query.into(),
3082        }
3083    }
3084}
3085
3086#[derive(Debug, Clone)]
3087pub struct GetWebparseMetadataParams {
3088    pub url_query: String,
3089}
3090
3091impl GetWebparseMetadataParams {
3092    pub fn new(url_query: impl Into<String>) -> Self {
3093        Self {
3094            url_query: url_query.into(),
3095        }
3096    }
3097}
3098
3099#[derive(Debug, Clone)]
3100pub struct PostWebTomarkdownAsyncParams {
3101    pub url_query: String,
3102}
3103
3104impl PostWebTomarkdownAsyncParams {
3105    pub fn new(url_query: impl Into<String>) -> Self {
3106        Self {
3107            url_query: url_query.into(),
3108        }
3109    }
3110}
3111#[derive(Debug, Clone)]
3112pub struct MinGanCiShiBieService<'a> {
3113    pub(crate) client: &'a Client,
3114}
3115
3116impl<'a> MinGanCiShiBieService<'a> {
3117/// 查询参数分析
3118    #[instrument(skip(self, params))]
3119    pub async fn get_sensitive_word_analyze_query(&self, params: GetSensitiveWordAnalyzeQueryParams) -> Result<Value> {
3120        let mut path = "/api/v1/sensitive-word/analyze-query".to_string();
3121
3122        let mut query: Vec<(String, String)> = Vec::new();
3123        query.push(("keyword".to_string(), params.keyword_query.clone()));
3124        let query = if query.is_empty() { None } else { Some(query) };
3125
3126        let mut extra_headers = HeaderMap::new();
3127        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3128        let body = None;
3129
3130        self.client
3131            .request_json(
3132                Method::GET,
3133                &path,
3134                headers,
3135                query,
3136                body,
3137            )
3138            .await
3139    }
3140/// 分析敏感词
3141    #[instrument(skip(self, params))]
3142    pub async fn post_sensitive_word_analyze(&self, params: PostSensitiveWordAnalyzeParams) -> Result<Value> {
3143        let mut path = "/api/v1/sensitive-word/analyze".to_string();
3144
3145        let mut query: Vec<(String, String)> = Vec::new();
3146        let query = if query.is_empty() { None } else { Some(query) };
3147
3148        let mut extra_headers = HeaderMap::new();
3149        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3150        let body = params.body.clone();
3151
3152        self.client
3153            .request_json(
3154                Method::POST,
3155                &path,
3156                headers,
3157                query,
3158                body,
3159            )
3160            .await
3161    }
3162/// 敏感词检测(快速)
3163    #[instrument(skip(self, params))]
3164    pub async fn post_sensitive_word_quick_check(&self, params: PostSensitiveWordQuickCheckParams) -> Result<Value> {
3165        let mut path = "/api/v1/text/profanitycheck".to_string();
3166
3167        let mut query: Vec<(String, String)> = Vec::new();
3168        let query = if query.is_empty() { None } else { Some(query) };
3169
3170        let mut extra_headers = HeaderMap::new();
3171        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3172        let body = params.body.clone();
3173
3174        self.client
3175            .request_json(
3176                Method::POST,
3177                &path,
3178                headers,
3179                query,
3180                body,
3181            )
3182            .await
3183    }
3184}
3185
3186#[derive(Debug, Clone)]
3187pub struct GetSensitiveWordAnalyzeQueryParams {
3188    pub keyword_query: String,
3189}
3190
3191impl GetSensitiveWordAnalyzeQueryParams {
3192    pub fn new(keyword_query: impl Into<String>) -> Self {
3193        Self {
3194            keyword_query: keyword_query.into(),
3195        }
3196    }
3197}
3198
3199#[derive(Debug, Clone)]
3200pub struct PostSensitiveWordAnalyzeParams {
3201    pub body: Option<Value>,
3202}
3203
3204impl PostSensitiveWordAnalyzeParams {
3205    pub fn new() -> Self {
3206        Self {
3207            body: None,
3208        }
3209    }
3210    pub fn body(mut self, value: Value) -> Self {
3211        self.body = Some(value);
3212        self
3213    }
3214}
3215
3216#[derive(Debug, Clone)]
3217pub struct PostSensitiveWordQuickCheckParams {
3218    pub body: Option<Value>,
3219}
3220
3221impl PostSensitiveWordQuickCheckParams {
3222    pub fn new() -> Self {
3223        Self {
3224            body: None,
3225        }
3226    }
3227    pub fn body(mut self, value: Value) -> Self {
3228        self.body = Some(value);
3229        self
3230    }
3231}
3232#[derive(Debug, Clone)]
3233pub struct ZhiNengSouSuoService<'a> {
3234    pub(crate) client: &'a Client,
3235}
3236
3237impl<'a> ZhiNengSouSuoService<'a> {
3238/// 获取搜索引擎信息
3239    #[instrument(skip(self))]
3240    pub async fn get_search_engines(&self) -> Result<Value> {
3241        let mut path = "/api/v1/search/engines".to_string();
3242
3243        let mut query: Vec<(String, String)> = Vec::new();
3244        let query = if query.is_empty() { None } else { Some(query) };
3245
3246        let mut extra_headers = HeaderMap::new();
3247        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3248        let body = None;
3249
3250        self.client
3251            .request_json(
3252                Method::GET,
3253                &path,
3254                headers,
3255                query,
3256                body,
3257            )
3258            .await
3259    }
3260/// 智能搜索
3261    #[instrument(skip(self, params))]
3262    pub async fn post_search_aggregate(&self, params: PostSearchAggregateParams) -> Result<Value> {
3263        let mut path = "/api/v1/search/aggregate".to_string();
3264
3265        let mut query: Vec<(String, String)> = Vec::new();
3266        let query = if query.is_empty() { None } else { Some(query) };
3267
3268        let mut extra_headers = HeaderMap::new();
3269        let headers = if extra_headers.is_empty() { None } else { Some(extra_headers) };
3270        let body = params.body.clone();
3271
3272        self.client
3273            .request_json(
3274                Method::POST,
3275                &path,
3276                headers,
3277                query,
3278                body,
3279            )
3280            .await
3281    }
3282}
3283
3284
3285#[derive(Debug, Clone)]
3286pub struct PostSearchAggregateParams {
3287    pub body: Option<Value>,
3288}
3289
3290impl PostSearchAggregateParams {
3291    pub fn new() -> Self {
3292        Self {
3293            body: None,
3294        }
3295    }
3296    pub fn body(mut self, value: Value) -> Self {
3297        self.body = Some(value);
3298        self
3299    }
3300}