刚打开b站准备学习,看到了动态上面一个小红点。忍不住点开进去,然后说 “看完这个就学习”。最后花了几个小时才停下来。
于是痛定思痛,取消所有up主的关注,这样就不会推送消息了。但是一个个点击取消关注太慢了,还要进up主页,点取消关注,再点关注才行。老子要一次性全部取消。
1.首先要进入动态,获取所有关注up主的uid。
找到了请求接口
然后写出get请求即可。(先不考虑cookies,之后会提到)
headers = { 'authority': 'api.vc.bilibili.com', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"', 'accept': 'application/json, text/plain, */*', 'sec-ch-ua-mobile': '?0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36', 'sec-ch-ua-platform': '"Windows"', 'origin': 'https://t.bilibili.com', 'sec-fetch-site': 'same-site', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://t.bilibili.com/', 'accept-language': 'zh-CN,zh;q=0.9', 'cookie': 'l=v; buvid3=814C060E-FE71-4DE9-9494-9AAB071A6CC353938infoc; rpdid=|(YuJY)mlRR0J\'ulmJJRmu~); LIVE_BUVID=AUTO7815939508172212; blackside_state=1; SESSDATA=d48f5588%2C1640098202%2Ca1ba8%2A61; bili_jct=b191c28d22553db5cddcf3d5e346dfce; DedeUserID=474351218; DedeUserID__ckMd5=3ae2bdd8036b1b59; sid=k7amn9j5; _uuid=D7D402F4-66ED-53F3-70D7-F966BB23AD2564644infoc; CURRENT_BLACKGAP=1; buvid_fp_plain=814C060E-FE71-4DE9-9494-9AAB071A6CC353938infoc; fingerprint3=ed6d0e5c32432f716869d80460572228; fingerprint=0ef2e232bef7ea64c80047daafe07ed1; fingerprint_s=98e441f41046c995e01d5a0afe498aca; CURRENT_QUALITY=80; video_page_version=v_old_home; buvid_fp=814C060E-FE71-4DE9-9494-9AAB071A6CC353938infoc; i-wanna-go-back=1; b_ut=6; CURRENT_FNVAL=2000; bp_video_offset_474351218=601020118333556205; innersign=0; b_lsid=BF10782FE_17D8F9EB610; bp_t_offset_474351218=601079023816686630; PVID=1', } #获取关注所有up信息,尤其是uid。 def get_uplist(): resp = session.get('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist', headers=headers) print(resp.text) list=jsonpath(resp.json(),"$..[uid,uname]") print(list) return list
2.然后找到取消关注的post请求,根据up主uid构造data参数,直接提交就能取消关注了。
找到请求接口
根据uid构造data (yourcsrf是用于用户校验的,之后讲,没有的话会校验失败)
data = { 'fid': '353230307', 'act': '2', 're_src': '11', 'spmid': '333.999.0.0', 'extend_content': '{"entity":"user","entity_id":353230307}', 'jsonp': 'jsonp', 'csrf': yourcsrf } def modify(uid): data['fid']=uid data['extend_content']='{"entity":"user","entity_id":'+uid+'}' resp=session.post('https://api.bilibili.com/x/relation/modify', headers=headers, data=data) print(resp.text)
提交后,返回成功!
刷新后确实取消关注了
这样就不需要手动点击取消关注了!
3.连起来操作,直接取消所有关注!!!
import requests from jsonpath import jsonpath headers = { 'authority': 'api.vc.bilibili.com', 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"', 'accept': 'application/json, text/plain, */*', 'sec-ch-ua-mobile': '?0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36', 'sec-ch-ua-platform': '"Windows"', 'origin': 'https://t.bilibili.com', 'sec-fetch-site': 'same-site', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://t.bilibili.com/', 'accept-language': 'zh-CN,zh;q=0.9', 'cookie': yourcookie, } #获取关注所有up信息,尤其是uid。 def get_uplist(): resp = session.get('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist', headers=headers) list=jsonpath(resp.json(),"$..[uid,uname]") print(list) return list data = { 'fid': '353230307', 'act': '2', 're_src': '11', 'spmid': '333.999.0.0', 'extend_content': '{"entity":"user","entity_id":353230307}', 'jsonp': 'jsonp', 'csrf': yourcsrf } def modify(uid,uname): data['fid']=uid data['extend_content']='{"entity":"user","entity_id":'+str(uid)+'}' session.post('https://api.bilibili.com/x/relation/modify', headers=headers, data=data) print(uname,"已经被取消关注") if __name__ == '__main__': session=requests.session() while True: list=get_uplist() if list: for i in range(0,len(list),2): modify(list[i],list[i+1]) else: break
再进来已经空空如也了
基本上我到这就行了,但是还有两个问题没有讲清楚。cookies的获取要用session模拟登录。
然后还有data里面的字段校验字段 csrf,发现它的值和cookies里面的一个值字段一模一样,就是 bili_jct
这样问题就简单了,只需要模拟登录,然后获取cookies,提出bili_jct做为data里面的csrf
之后更新。一次性写完太累了。