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(
96 &self,
97 fid: u64,
98 action: RelationAction,
99 source: Option<RelationSource>
100 ) -> Result<BpiResponse<()>, BpiError> {
101 let csrf = self.csrf()?;
102 let mut form = reqwest::multipart::Form
103 ::new()
104 .text("fid", fid.to_string())
105 .text("act", (action as u8).to_string())
106 .text("csrf", csrf.to_string());
107
108 if let Some(s) = source {
109 form = form.text("re_src", (s as u32).to_string());
110 }
111
112 self
113 .post("https://api.bilibili.com/x/relation/modify")
114 .multipart(form)
115 .send_bpi("操作用户关系").await
116 }
117}
118
119#[cfg(test)]
122mod tests {
123 use super::*;
124 use tracing::info;
125
126 const TEST_FID: u64 = 2;
127
128 #[tokio::test]
129 async fn test_modify_relation_follow() -> Result<(), BpiError> {
130 let bpi = BpiClient::new();
131 let resp = bpi.user_modify_relation(
132 TEST_FID,
133 RelationAction::Follow,
134 Some(RelationSource::Space)
135 ).await?;
136
137 info!("关注用户结果: {:?}", resp);
138
139 Ok(())
140 }
141
142 #[tokio::test]
143 async fn test_modify_relation_unfollow() -> Result<(), BpiError> {
144 let bpi = BpiClient::new();
145
146 let resp = bpi.user_modify_relation(TEST_FID, RelationAction::Unfollow, None).await?;
147
148 info!("取关用户结果: {:?}", resp);
149
150 Ok(())
151 }
152
153 #[tokio::test]
154 async fn test_modify_relation_blacklist() -> Result<(), BpiError> {
155 let bpi = BpiClient::new();
156 let resp = bpi.user_modify_relation(TEST_FID, RelationAction::Blacklist, None).await?;
157
158 info!("拉黑用户结果: {:?}", resp);
159
160 let _ = bpi.user_modify_relation(TEST_FID, RelationAction::Unblacklist, None).await;
161
162 Ok(())
163 }
164}