Skip to main content

bpi_rs/article/
action.rs

1// 专栏点赞&投币&收藏
2//
3// [查看 API 文档](https://github.com/Yuelioi/bilibili-API-collect/tree/cfc5fddcc8a94b74d91970bb5b4eaeb349addc47/docs/article/action.md)
4
5use crate::BilibiliRequest;
6use crate::article::ArticleClient;
7use crate::article::params::{ArticleCoinParams, ArticleFavoriteParams, ArticleLikeParams};
8use crate::response::BpiResult;
9
10const LIKE_ENDPOINT: &str = "https://api.bilibili.com/x/article/like";
11const COIN_ENDPOINT: &str = "https://api.bilibili.com/x/web-interface/coin/add";
12const FAVORITE_ADD_ENDPOINT: &str = "https://api.bilibili.com/x/article/favorites/add";
13const FAVORITE_DEL_ENDPOINT: &str = "https://api.bilibili.com/x/article/favorites/del";
14
15/// 投币响应数据
16
17#[derive(Debug, Clone, serde::Deserialize)]
18pub struct CoinResponseData {
19    /// 是否点赞成功 true:成功 false:失败 已赞过则附加点赞失败
20    pub like: bool,
21}
22
23impl<'a> ArticleClient<'a> {
24    /// Likes or unlikes an article and returns the canonical payload result.
25    pub async fn like(&self, params: ArticleLikeParams) -> BpiResult<Option<serde_json::Value>> {
26        let csrf = self.client.csrf()?;
27
28        self.client
29            .post(LIKE_ENDPOINT)
30            .form(&params.form_pairs(&csrf))
31            .send_bpi_optional_payload("article.like")
32            .await
33    }
34
35    /// Gives coins to an article and returns the canonical payload result.
36    pub async fn coin(&self, params: ArticleCoinParams) -> BpiResult<CoinResponseData> {
37        let csrf = self.client.csrf()?;
38
39        self.client
40            .post(COIN_ENDPOINT)
41            .form(&params.form_pairs(&csrf))
42            .send_bpi_payload("article.coin")
43            .await
44    }
45
46    /// Favorites an article and returns the canonical payload result.
47    pub async fn favorite(
48        &self,
49        params: ArticleFavoriteParams,
50    ) -> BpiResult<Option<serde_json::Value>> {
51        let csrf = self.client.csrf()?;
52
53        self.client
54            .post(FAVORITE_ADD_ENDPOINT)
55            .form(&params.form_pairs(&csrf))
56            .send_bpi_optional_payload("article.favorite")
57            .await
58    }
59
60    /// Removes an article from favorites and returns the canonical payload result.
61    pub async fn unfavorite(
62        &self,
63        params: ArticleFavoriteParams,
64    ) -> BpiResult<Option<serde_json::Value>> {
65        let csrf = self.client.csrf()?;
66
67        self.client
68            .post(FAVORITE_DEL_ENDPOINT)
69            .form(&params.form_pairs(&csrf))
70            .send_bpi_optional_payload("article.unfavorite")
71            .await
72    }
73}
74
75#[cfg(test)]
76mod tests {}