找回密码
  注册[Register]
查看: 278|回复: 8

[python] B站一键删除动态、关注、被回复的消息、被点赞的消息。

[复制链接]
发表于 2022-12-1 10:23 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

注意,因为B站有限制,所以每次只删除两百条,删除过多ip会被封禁几分钟。其次,需要手动获取B站的Cookie。
[Python] 纯文本查看 复制代码
import pprint
import requests
import json
import re
import os

# 最大删除条数
MAX_COUNT = 200
# 保存cookie的路径
COOKIE_FILE_PATH = r"./cookie.txt"

class BWebSite(object):

    def __init__(self):
        if not os.path.exists(COOKIE_FILE_PATH):
            print("未检测到cookie,请手动输入:")
            cookie = input()
            if re.search('DedeUserID=(.+?);', cookie) and re.search('bili_jct=(.+?);', cookie):
                with open(COOKIE_FILE_PATH, 'w', encoding='utf-8') as f:
                    f.write(cookie)
                print("*" * 50)
                print("输入成功".center(50))
                print("*" * 50)
            else:
                print('cookie输入错误')
                exit()
        else:
            with open(COOKIE_FILE_PATH, 'r', encoding='utf-8') as f:
                cookie = f.read()
                if not cookie:
                    print("cookie为空,请重新填入cookie")
                    os.remove(COOKIE_FILE_PATH)
                    exit()
        self.uid = re.search('DedeUserID=(.+?);', cookie)
        self.token = re.search('bili_jct=(.+?);', cookie)
        if not (self.uid and self.token):
            print("cookie错误,请重新填入")
            os.remove(COOKIE_FILE_PATH)
            exit()
        self.uid = self.uid.group(1)
        self.token = self.token.group(1)
        self.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.93 Safari/537.36',
            'sec-ch-ua-platform': '"Windows"',
            'origin': 'https://space.bilibili.com',
            'sec-fetch-site': 'same-site',
            'sec-fetch-mode': 'cors',
            'sec-fetch-dest': 'empty',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cookie': f'{cookie}',
        }

    # 获取动态信息
    @property
    def dynamic(self):
        dynamic_id = 0
        params = (
            ('visitor_uid', f'{self.uid}'),
            ('host_uid', f'{self.uid}'),
            ('offset_dynamic_id', f'{dynamic_id}'),
            ('need_top', '1'),
            ('platform', 'web'),
        )
        list_cards = []
        response = requests.get('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history',
                                headers=self.headers,
                                params=params)
        data = json.loads(response.text)['data']
        while data.get('cards'):
            cards = data['cards']
            dynamic_id = data['next_offset']
            for card in cards:
                list_cards.append(card)
            if len(list_cards) >= MAX_COUNT:
                return list_cards
            params = (
                ('visitor_uid', f'{self.uid}'),
                ('host_uid', f'{self.uid}'),
                ('offset_dynamic_id', f'{dynamic_id}'),
                ('need_top', '1'),
                ('platform', 'web'),
            )
            response = requests.get('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history',
                                    headers=self.headers,
                                    params=params)
            data = json.loads(response.text)['data']
        return list_cards

    # 删除动态信息
    def delete_dynamic(self):
        list_dynamic_id = []
        for dynamic in self.dynamic:
            list_dynamic_id.append(dynamic['desc']['dynamic_id'])
        for dynamic_id in list_dynamic_id:
            data = {
                'dynamic_id': f'{dynamic_id}',
                'csrf_token': f'{self.token}',
                'csrf': f'{self.token}'
            }
            response = requests.post('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic',
                                     headers=self.headers,
                                     data=data)
            code = json.loads(response.text)['code']
            if code == 0:
                print(f"{dynamic_id}删除成功")

    # 获取所有回复
    @property
    def comments(self):
        params = (
            ('platform', 'web'),
            ('build', '0'),
            ('mobi_app', 'web'),
        )
        response = requests.get('https://api.bilibili.com/x/msgfeed/reply', headers=self.headers, params=params)
        ls = []
        data = json.loads(response.text)['data']
        while not data['cursor']['is_end']:
            ls.append(data)
            if len(ls) > MAX_COUNT:
                return ls
            cursor = data['cursor']
            comment_id = cursor['id']
            time = cursor['time']
            params = (
                ('id', f'{comment_id}'),
                ('reply_time', f'{time}'),
                ('platform', 'web'),
                ('build', '0'),
                ('mobi_app', 'web'),
            )
            response = requests.get('https://api.bilibili.com/x/msgfeed/reply', headers=self.headers, params=params)
            data = json.loads(response.text)['data']
        return ls

    # 删除回复
    def delete_comment(self):
        for comment in self.comments:
            for item in comment['items']:
                subject_id = item['item']['subject_id']
                target_id = item['item']['target_id']
                title = item['item']['title']
                data = {
                    'oid': f'{subject_id}',
                    'type': '1',
                    'jsonp': 'jsonp',
                    'rpid': f'{target_id}',
                    'csrf': f'{self.token}'
                }
                response = requests.post('https://api.bilibili.com/x/v2/reply/del', headers=self.headers, data=data)
                # data = json.loads(response.text)
                # print(data)
                code = json.loads(response.text)['code']
                if code == 0:
                    print(f"{title}-----------下面的回复已删除")

    # 获取所有收到赞的回复
    @property
    def likes(self):
        params = (
            ('platform', 'web'),
            ('build', '0'),
            ('mobi_app', 'web'),
        )
        response = requests.get('https://api.bilibili.com/x/msgfeed/like', headers=self.headers, params=params)
        ls = []
        data = json.loads(response.text)['data']
        total = json.loads(response.text)['data']['total']
        while not total['cursor']['is_end']:
            ls.append(data)
            if len(ls) > MAX_COUNT:
                return ls
            cursor = total['cursor']
            comment_id = cursor['id']
            time = cursor['time']
            params = (
                ('id', f'{comment_id}'),
                ('like_time', f'{time}'),
                ('platform', 'web'),
                ('build', '0'),
                ('mobi_app', 'web'),
            )
            response = requests.get('https://api.bilibili.com/x/msgfeed/like', headers=self.headers, params=params)
            data = json.loads(response.text)['data']
            total = json.loads(response.text)['data']['total']
        return ls

    def delete_like(self):
        for like in self.likes:
            for item in like['total']['items']:
                native_uri = item['item']['native_uri']
                item_id = item['item']['item_id']
                title = item['item']['title']
                rpid = item_id
                print(native_uri, title)
                oid = re.search("//video/(\d+)", native_uri)
                if not oid:
                    oid = re.search('//following/detail/(\d+)', native_uri)
                    if not oid:
                        oid = re.search('//album/(\d+)', native_uri)
                if not oid:
                    continue
                oid = oid.group(1)
                print(oid, rpid)
                data = {
                    'oid': f'{oid}',
                    'type': '1',
                    'jsonp': 'jsonp',
                    'rpid': f'{rpid}',
                    'csrf': f'{self.token}'
                }
                response = requests.post('https://api.bilibili.com/x/v2/reply/del', headers=self.headers, data=data)
                # data = json.loads(response.text)
                # print(data)
                code = json.loads(response.text)['code']
                if code == 0:
                    print(f"{title}-----------下面的回复已删除")

    # 获取所有关注
    @property
    def follows(self):
        vmid = f'{self.uid}'
        pn = 1
        list_follows = []
        h = self.headers
        h.update(
            {
                'referer': f'https://space.bilibili.com/{self.uid}/fans/follow?tagid=-10',
            }
        )
        while True:
            params = (
                ('vmid', f'{vmid}'),
                ('pn', f'{pn}'),
                ('ps', '20'),
                ('order', 'desc'),
                ('order_type', 'attention'),
                ('jsonp', 'jsonp'),
                ('callback', '__jp7'),
            )
            response = requests.get('https://api.bilibili.com/x/relation/followings', headers=h,
                                    params=params)
            data = json.loads(response.text[response.text.index('(') + 1:response.text.rindex(')')])['data']
            list_data = data['list']
            total = data['total']
            for item in list_data:
                list_follows.append(item)
            if total > MAX_COUNT and len(list_follows) == MAX_COUNT:
                break
            if len(list_follows) == total:
                break
            pn += 1
        return list_follows

    # 删除所有
    def delete_follows(self):
        follows = self.follows
        for follow in follows:
            mid = follow['mid']
            uname = follow['uname']
            data = {
                'fid': f'{mid}',
                'act': '2',
                're_src': '11',
                'spmid': '333.999.0.0',
                'extend_content': f'{{"entity":"user","entity_id":{mid}}}',
                'jsonp': 'jsonp',
                'csrf': f'{self.token}'
            }
            response = requests.post('https://api.bilibili.com/x/relation/modify', headers=self.headers, data=data)
            code = json.loads(response.text)['code']
            if code == 0:
                print(f'{uname}----------取消关注成功')

web = BWebSite()
# web.delete_comment()
# web.delete_like()
# web.delete_dynamic()
# pprint.pprint(web.follows)
# web.delete_follows()

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2022-12-1 10:27 | 显示全部楼层
谢谢@Thanks!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 10:51 | 显示全部楼层

支持楼主,谢谢分享。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 10:54 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 12:29 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 13:33 | 显示全部楼层
6666666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 13:45 | 显示全部楼层
先收藏了,万一用到呢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 13:45 | 显示全部楼层

感谢楼主的分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-12-1 14:16 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|大牛论坛 |我的广告

GMT+8, 2024-5-7 15:50 , Processed in 0.045546 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表