bpi_rs/user/relation/
action.rs1use crate::{ BilibiliRequest, BpiClient, BpiError, BpiResponse };
5use serde::{ Deserialize, Serialize };
6
7#[derive(Debug, Clone, Deserialize, Serialize)]
13pub struct ModifyRelationResponseData;
14
15#[repr(u8)]
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
22pub enum RelationAction {
23 Follow = 1,
25 Unfollow = 2,
27 Whisper = 3,
29 Unwhisper = 4,
31 Blacklist = 5,
33 Unblacklist = 6,
35 KickFan = 7,
37}
38
39#[repr(u32)]
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
44pub enum RelationSource {
45 MonthlyCharge = 1,
47 Space = 11,
49 Video = 14,
51 Comment = 15,
53 VideoEndPage = 17,
55 H5Recommend = 58,
57 H5FollowingList = 106,
59 H5FanList = 107,
61 Article = 115,
63 Message = 118,
65 Search = 120,
67 VideoPlayerButton = 164,
69 H5CommonFollow = 167,
71 CreativeIncentive = 192,
73 ActivityPage = 222,
75 JointVideo = 229,
77 MessageCenterLike = 235,
79 VideoPlayerDanmaku = 245,
81}
82
83impl BpiClient {
84 pub async fn user_modify_relation(
95 &self,
96 fid: u64,
97 action: RelationAction,
98 source: Option<RelationSource>
99 ) -> Result<BpiResponse<()>, BpiError> {
100 let csrf = self.csrf()?;
101 let mut form = reqwest::multipart::Form
102 ::new()
103 .text("fid", fid.to_string())
104 .text("act", (action as u8).to_string())
105 .text("csrf", csrf.to_string());
106
107 if let Some(s) = source {
108 form = form.text("re_src", (s as u32).to_string());
109 }
110
111 self
112 .post("https://api.bilibili.com/x/relation/modify")
113 .multipart(form)
114 .send_bpi("操作用户关系").await
115 }
116}
117
118#[cfg(test)]
121mod tests {
122 use super::*;
123 use tracing::info;
124
125 const TEST_FID: u64 = 2;
126
127 #[tokio::test]
128 async fn test_modify_relation_follow() -> Result<(), BpiError> {
129 let bpi = BpiClient::new();
130 let resp = bpi.user_modify_relation(
131 TEST_FID,
132 RelationAction::Follow,
133 Some(RelationSource::Space)
134 ).await?;
135
136 info!("关注用户结果: {:?}", resp);
137
138 Ok(())
139 }
140
141 #[tokio::test]
142 async fn test_modify_relation_unfollow() -> Result<(), BpiError> {
143 let bpi = BpiClient::new();
144
145 let resp = bpi.user_modify_relation(TEST_FID, RelationAction::Unfollow, None).await?;
146
147 info!("取关用户结果: {:?}", resp);
148
149 Ok(())
150 }
151
152 #[tokio::test]
153 async fn test_modify_relation_blacklist() -> Result<(), BpiError> {
154 let bpi = BpiClient::new();
155 let resp = bpi.user_modify_relation(TEST_FID, RelationAction::Blacklist, None).await?;
156
157 info!("拉黑用户结果: {:?}", resp);
158
159 let _ = bpi.user_modify_relation(TEST_FID, RelationAction::Unblacklist, None).await;
160
161 Ok(())
162 }
163}