大圣归来 B站正版 下载地址
不写这标题估计没人进来看我骂街。 其实不是想说这事 反正这片子我不看。 应该是通过验证cookie判断是不是已经“承包”,后台有一数据库,异步的。 经过测试,更加确信appkey也有三六九等。 想看?进丸妞群问吧。我对于盗版没有兴趣。
不写这标题估计没人进来看我骂街。 其实不是想说这事 反正这片子我不看。 应该是通过验证cookie判断是不是已经“承包”,后台有一数据库,异步的。 经过测试,更加确信appkey也有三六九等。 想看?进丸妞群问吧。我对于盗版没有兴趣。
只想让人看源码 剩下的什么都不想要? 嫌偷代码狗太多?没人care GPL? 请选用GFUL。 GFUL (Go Fuck Yourself License) Version 1.1 Go Fuck Yourself Public License Version 1.0, November 2015 Copyright (C) 2015 Beining <[email protected]> Everyone is permitted to… Read more »
原作者的gists死了,备份一下以免灭失。 https://kirito.me/python/download-bilibili-historical-danmu.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/usr/bin/env python # -*- coding=utf-8 -*- # 哔哩哔哩历史弹幕 (XML) 下载器 # 使用:downdanmu.py av314 import StringIO import datetime import gzip import json import os import re import urllib2 import zlib # 接受参数 av****** 并创建 xml 保存目录 av_number = sys.argv[1] xml_folder = r'./%s' % av_number if os.path.exists(xml_folder): pass else: os.makedirs(xml_folder) # 处理 bilibili 视频页面 video_page_url = 'http://www.bilibili.tv/video/%s' % av_number video_page_request = urllib2.Request(video_page_url) video_page_gz = urllib2.urlopen(video_page_request).read() # gzip 解压 # 方法来自 [url]http://stackoverflow.com/a/3947241[/url] video_page_buffer = StringIO.StringIO(video_page_gz) video_page_html = gzip.GzipFile(fileobj = video_page_buffer).read() # 获取视频 cid cid_number = re.findall(r'cid=(\d+)', video_page_html)[0] # 获取视频所有历史弹幕 comments_page_url = 'http://comment.bilibili.tv/rolldate,%s' % cid_number comments_page_request = urllib2.Request(comments_page_url) comments_page_zip = urllib2.urlopen(comments_page_request).read() # deflate 解压 # 方法来自 [url]http://stackoverflow.com/a/9583564[/url] comments_page_json = zlib.decompressobj(-zlib.MAX_WBITS).decompress(comments_page_zip) # 解析历史弹幕信息 comments_python_object = json.loads(comments_page_json) for i in range(0, len(comments_python_object)): comment_timestamp = comments_python_object[i]['timestamp'] comment_date = datetime.datetime.fromtimestamp(int(comment_timestamp)).strftime('%Y%m%d') comment_then_url = 'http://comment.bilibili.tv/dmroll,%s,%s' % (comment_timestamp, cid_number) comment_then_request = urllib2.Request(comment_then_url) comment_then_zip = urllib2.urlopen(comment_then_request).read() comment_then_xml = zlib.decompressobj(-zlib.MAX_WBITS).decompress(comment_then_zip) comment_file = open('%s/%s.xml' % (xml_folder, comment_date), 'wb') comment_file.write(comment_then_xml) comment_file.close() else: pass |
主要为了算PMF。 不授权任何转载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import xml.etree.ElementTree as ET import requests ######################################################################## class BilibiliDanmaku: """""" cid = 0 danmaku_list = [] danmaku_url = 'http://comment.bilibili.com/{cid}.xml' danmaku_xml = '' danmaku_xml_tree = {} danmaku_pmf_data = {} headers = { 'accept-encoding': 'gzip, deflate, sdch', 'accept-language': 'en-CA,en;q=0.8,en-US;q=0.6,zh-CN;q=0.4,zh;q=0.2', 'user-agent': '(Python-urllib/2.7, like libcurl/1.0 NSS-Mozilla/2.0)', 'accept': '*/*',} chatserver = '' #self.chatid = 0 mission = 0 maxlimit = 0 source = '' #---------------------------------------------------------------------- def __init__(self): """Constructor""" pass #---------------------------------------------------------------------- def init(self): """great init""" if self.cid <= 0: raise ValueError('invalid cid') self.get() self.parse() pass @classmethod #---------------------------------------------------------------------- def setcid(self, cid): """""" self.cid = cid self.danmaku_url = self.danmaku_url.format(cid = cid) #---------------------------------------------------------------------- def get(self): """""" if not self.cid: raise ValueError('Cid not set') responce = requests.get(self.danmaku_url, headers= self.headers) self.danmaku_xml = responce.content @classmethod #---------------------------------------------------------------------- def load(self, file_this): """""" if type(file_this) == str: self.danmaku_xml = file_this elif type(file_this) == file: f = open(file_this, 'r') self.danmaku_xml = f.read() f.close() #---------------------------------------------------------------------- def parse(self): """""" if not self.danmaku_xml: raise ValueError('No Danmaku Data') tree = ET.ElementTree(ET.fromstring(self.danmaku_xml)) root = tree.getroot() for child_of_root in root: if child_of_root.tag == 'chatserver': self.chatserver = child_of_root.text if child_of_root.tag == 'chatid': self.cid = int(child_of_root.text) if child_of_root.tag == 'mission': self.mission = child_of_root.text if child_of_root.tag == 'maxlimit': self.maxlimit = int(child_of_root.text) if child_of_root.tag == 'source': self.source = child_of_root.text if child_of_root.tag == 'd': info = str(child_of_root.attrib.get('p')).split(',') self.danmaku_xml_tree[info[7]] = {'stime': info[0], 'mode': info[1], 'size': info[2], 'color': info[3], 'timestamp': info[4], 'pool': info[5], 'sender': info[6], 'msg': child_of_root.text } @classmethod #---------------------------------------------------------------------- def get_pmf(self, period): """""" timelist = [(k, v['stime']) for k, v in self.danmaku_xml_tree.iteritems()] timelist.sort(key = lambda tup:tup[1]) if period == 0: return timelist start = 0 #not 0 self.danmaku_pmf_data = {0: [], } for i in timelist: if i[1] <= int(start + period): self.danmaku_pmf_data[start].append(i[0]) elif i[1] > int(start + period): start += period self.danmaku_pmf_data[start] = [] self.danmaku_pmf_data[start].append(i[0]) |
我未专为Fuckbilibili项目开发过任何部分,亦不为其可能造成的任何不良后果负责。 截止声明时,Fuckbilibili网站所援引的的大量源码违反了GPL协议,所谓自行开发的源码违反了MIT协议。 请自行斟酌使用该项目中的任何部分。部分可能的后果会造成直接的人身、财产和/或名誉伤害。 Beining
又及: 关于直接上传到乐视云: 参见 acupload 0.04:巨大更新 更新:我写插件了: https://github.com/cnbeining/acfun-api-replace-server/tree/master/chrome Acfun fix chrome 插件。 Chrome有很多插件,可以直接重定向请求。 我喜欢Switcheroo Redirector 。 加规则: 把 http://cdn.aixifan.com/player/sslhomura/AcNewPlayer151029.swf 重定向到 https://acfun-api.cnbeining.com/static/AcNewPlayer151029.swf ; http://www.acfun.tv/video/getVideo.aspx? 到 https://acfun-api.cnbeining.com/getVideo? 。 服务端在Openshift,前面挂了CF。 懒得配置环境,人多了我也不知道怎样,随便吧。 服务端:https://github.com/cnbeining/acfun-api-replace-server… Read more »
aid和mid自己想办法,要是不会就别用了。 https://gist.github.com/cnbeining/a3b710bacfdc10074695 即使是packer这坨屎也能挖出花来。 代码下面。