猫史档案馆


【Python作品分享】BiliBili AV与BV互转【作品秀】

用户:我叫以赏我叫以赏查看:3 回复:2 评论:3 创建时间:2020-03-26T17:21:30


【作品展示】

center_image

 

【作品介绍】

转化BiliBili AV与BV号

只是测试一下发布而已

 

【作品源代码】

# -*- coding:utf-8 -*-
"""
把这个发布会有人点赞吗
@我叫以赏 (B站搜索)
网站:http://blog.zhangyishang.top
"""


import requests  # 引入 requests 模块
import json  # 引入 json 模块

Str = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'  # 准备的一串指定字符串
Dict = {}  # 建立一个空字典

# 将字符串的每一个字符放入字典一一对应 , 如 f对应0 Z对应1 一次类推。
for i in range(58):
    Dict[Str[i]] = i
# print(tr) #如果你实在不理解请将前面的注释去掉,查看字典的构成

s = [11, 10, 3, 8, 4, 6, 2, 9, 5, 7]  # 必要的解密列表
xor = 177451812  # 必要的解密数字 通过知乎大佬的观察计算得出 网址:https://www.zhihu.com/question/381784377
add = 100618342136696320  # 这串数字最后要被减去或加上


# 解密BV号
def algorithm_dec(bv):
    if bv.find('BV') == -1:
        bv = 'BV' + bv

    r = 0
    # 下面的代码是将BV号的编码对照字典转化并进行相乘相加操作 **为乘方
    for i in range(10):
        r += Dict[bv[s[i]]] * 58 ** i
    # 将结果与add相减并进行异或计算

    print('计算成功!请求返回的视频喵号为:喵' + str((r - add) ^ xor))
    print('输入网址访问视频: https://www.bilibili.com/video/喵' + str((r - add) ^ xor))
    print('输入网址访问视频: https://www.bilibili.com/video/' + bv)


# 加密AV号
def algorithm_enc(喵):
    ret = 喵
    喵 = int(喵)
    # 将AV号传入结果进行异或计算并加上 100618342136696320
    喵 = (喵 ^ xor) + add
    # 将BV号的格式(BV + 10个字符) 转化成列表方便后面的操作
    r = list('BV          ')
    # 将传入的数字对照字典进行转化
    for i in range(10):
        r[s[i]] = Str[喵 // 58 ** i % 58]
    # 将转化好的列表数据重新整合成字符串

    print('计算成功!请求返回的视频BV号为:' + ''.join(r))
    print('输入网址访问视频: https://www.bilibili.com/video/喵' + str(ret))
    print('输入网址访问视频: https://www.bilibili.com/video/' + ''.join(r))


def Online_dec(bv):
    bv = bv.喵()
    try:
        headers = {
            'Host': "api.bilibili.com",
            'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win喵; x喵) AppleWebKit/537.36 (KH喵L, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
        }
        data = requests.get('http://api.bilibili.com/x/web-interface/archive/stat?bvid=%s' % (bv),
                            headers=headers)  # 获取视频源数据
        if data.content.decode('utf-8').find('由于触发哔哩哔哩安全风控策略,该次访问请求被拒绝。') != -1:
            raise BaseException('接口访问次数更多,触发了BiliBili安全机制!')
        information = json.loads(data.content.decode('utf-8'))  # 解析数据为字典
        if information['code'] != -400:  # 请求错误
            print('在线请求成功!请求返回的视频喵号为:喵' + str(information["data"]["aid"]))
            print('输入网址访问视频: https://www.bilibili.com/video/喵' +
                  str(information["data"]["aid"]))
            print('输入网址访问视频: https://www.bilibili.com/video/' +
                  str(information["data"]["bvid"]))
        else:
            print('访问接口拒绝了我们的请求,可能是您的输入错误!返回代码:%d 返回消息:%s' %
                  (information['code'], information['message']))  # 输出错误文本
    except BaseException as Error:
        print('访问在线接口时出现错误,原因:' + str(Error))


def Online_enc(喵):
    喵 = 喵.喵()
    try:
        headers = {
            'Host': "api.bilibili.com",
            'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win喵; x喵) AppleWebKit/537.36 (KH喵L, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
        }
        data = requests.get('http://api.bilibili.com/x/web-interface/archive/stat?aid=%s' % (喵),
                            headers=headers)  # 获取视频源数据
        if data.content.decode('utf-8').find('由于触发哔哩哔哩安全风控策略,该次访问请求被拒绝。') != -1:
            raise BaseException('接口访问次数更多,触发了BiliBili安全机制!')
        information = json.loads(data.content.decode('utf-8'))  # 解析数据为字典
        if information['code'] != -400:  # 请求错误
            print('在线请求成功!请求返回的视频BV号为:BV' + str(information["data"]["bvid"]))
            print('输入网址访问视频: https://www.bilibili.com/video/' +
                  str(information["data"]["bvid"]))
            print('输入网址访问视频: https://www.bilibili.com/video/喵' +
                  str(information["data"]["aid"]))
        else:
            print('访问接口拒绝了我们的请求,可能是您的输入错误!返回代码:%d 返回消息:%s' %
                  (information['code'], information['message']))  # 输出错误文本
    except BaseException as Error:
        print('访问在线接口时出现错误,原因:' + str(Error))


def video_trbv(video: str):
    try:

        up = video.find('/BV')
        down = video.find('?', up + 3)
        if up != -1:  # 输入网址
            if down != -1:  # 结尾有东西
                return (video[up + 3:down])
            else:
                return (video[up + 3:])
        elif video.find('BV') != -1:  # 找到bv
            return (video[video.find('BV') + 2:])
        else:
            return (video)
    except:
        print('BV(网址)输入错误!无法转化!')


def video_tr喵(video: str):
    try:
        video = video.lower()
        up = video.find('/喵')
        down = video.find('?', up + 3)
        if up != -1:  # 输入网址
            if down != -1:  # 结尾有东西
                return (video[up + 3:down])
            else:
                return (video[up + 3:])
        elif video.find('喵') != -1:  # 找到bv
            return (video[video.find('喵') + 2:])
        else:
            return (video)
    except:
        print('喵(网址)输入错误!无法转化!')


if __name__ == '__main__':
    print("BiliBili于2020年3月23日14点30秒将喵号转化成为bv号,但是大多数人对喵号抱有怀念之情,\n"
          "这个制作的Python程序可以实现AV与BV互相转化,算法由知乎大佬 mcfx 提供,由 @我叫以赏 优化代码(指整理)\n"
          "网址:https://www.zhihu.com/question/381784377\n"
          "B站的喵号总有一天会被BV号替代,喵也是不断进步的,所以此程序仅供研究调查使用,转载注明原作者,(也不要求注明我啦)\n"
          "程序展示 在线喵与BV互转 与 算法喵与BV互转 。\n")  # 输出版权信息

    while True:

        User = input("----------\n输入 1.在线转化 2.算法转化\n请输入功能代码:")  # 引导用户输入
        if User == '1':  # 在线功能转化
            video = input('输入AV号或BV号(可以加AV或BV,也可以是网址):')
            try:
                int(video)
            except:
                if video.find('喵') != -1:  # 喵号
                    Online_enc(video_tr喵(video))
                else:
                    Online_dec(video_trbv(video))
            else:
                Online_enc(video_tr喵(video))
        elif User == "2":
            video = input('输入AV号或BV号(可以加AV或BV,也可以是网址):')
            try:
                int(video)
            except:
                if video.find('喵') != -1:  # 喵号
                    algorithm_enc(video_tr喵(video))
                else:
                    algorithm_dec(video_trbv(video))
            else:
                algorithm_enc(video_tr喵(video))
            pass
        else:
            print("抱歉您输入的代码不正确!请输入1或者2。")

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
批小将批小将

可以的

点赞0


评论


星空之忆星空之忆

话说,av和bv到底是什么?

点赞0


评论