米米的博客

做了一点微小的工作

获取 cid

B 站的每个视频都有 aid(即 AV 号)和 cid 两个参数,而 B 站新的 bvid(BV 号)可以通过 Base58 编码与 aid 互相转换。aidbvid 通过视频的链接就可以获取,而 cid 有以下两种方法查询:

  • 在已知视频 aid 的情况下,可以通过链接 https://api.bilibili.com/x/web-interface/view?aid=10492 获取 cid(将 10492 替换为你要查询的视频的 aid)。
  • 在已知视频 bvid 的情况下,可以通过链接 https://api.bilibili.com/x/web-interface/view?bvid=BV1Lx411a7NQ 获取 cid(将 BV1Lx411a7NQ 替换为你要查询的视频的 bvid)。

对于有许多分 P 的视频,它们的 aid 相同,每个分 P 则对应一个不同的 cid。而在同一个页面下的番剧、影视等内容,每一分集的 cid 也是唯一的。使用上述 API 返回的是 JSON 格式,并且包含了该视频下所有分 P 的 cid,需要进一步处理。
视频的更多信息则可以通过 https://api.bilibili.com/view?type=jsonp&appkey=8e9fc618fbd41e28&id=10492 获取。

获取弹幕

视频的弹幕文件采用 xml 格式存储,地址与其 cid 有关,为 https://comment.bilibili.com/$cid.xml(将 $cid 替换为视频的 cid)。

弹幕内容的存储方式为:

1
<d p="0,1,25,16777215,1312863760,0,eff85771,42759017">前排占位置</d>

这个元素中的各个参数由逗号分割,其意义分别为:

  • 弹幕出现的时间,以秒为单位
  • 弹幕的模式:1~3 滚动弹幕 4 底端弹幕 5 顶端弹幕 6 逆向弹幕 7 精准定位 8 高级弹幕
  • 字号:12 非常小 16 特小 18 小 25 中 36 大 45 很大 64 特别大
  • 字体的颜色:将 HTML 六位十六进制颜色转为十进制表示,例如 #FFFFFF 会被存储为 16777215,因为
  • Unix 时间戳,以毫秒为单位,基准时间为 1970-1-1 08:00:00
  • 弹幕池:0 普通池 1 字幕池 2 特殊池(注:目前特殊池为高级弹幕专用)
  • 发送者的 ID,用于「屏蔽此弹幕的发送者」功能
  • 弹幕在弹幕数据库中 rowID,用于「历史弹幕」功能

将 Bilibili 弹幕的 xml 文件转为 ass 字幕,可以使用以下脚本:
bilibili ASS 弹幕在线转换
us-danmaku

关于 ass 字幕格式可以参考以下文章:ASS 字幕格式规范

拓展阅读:
Bilibili 视频播放页面接口整理(不定期更新) - 知乎
Bilibili 爬取视频信息进行数据分析

本文更新于 2020 年 12 月 29 日:
增加了关于 BV 号的描述。

如果一段程序的代码运行之后,产生的输出和其自身的源码完全相同,那么这段程序就被称为 Quine,以哲学家 Willard van Orman Quine(1908-2000)而命名。
Quine 在任何图灵完备,且能输出任意字符串的语言中都是可行的。在可计算性理论(computability theory)中,图灵等价指的是:对于两个计算机 A 和 B,如果 A 可以模拟 B,B 可以模拟 A,就称他们是图灵等价的。根据「丘奇 - 图灵」理论,图灵机是表达能力最强大的计算系统,对现实世界中的任何计算机,都可以用图灵机来模拟它。而如果一个编程语言可以完全模拟图灵机,那么它就是图灵完备的。
大部分编程语言都是图灵完备的,在这些语言中,构造 Quine 的思路也是类似的。Quine 中往往需要包含数据和程序两部分。数据是程序的表示(例如将程序中的特殊字符编码,存储在一个字符串中),而程序负责解析数据并将其输出。此外,利用一些语言的语法特性也可以构造出比较简单的 Quine。


Bash

1
z=\' a='z=\\$z a=$z$a$z\; eval echo \$a'; eval echo $a

JavaScript

1
!function $(){console.log('!'+$+'()')}()
1
var s = 'var%20s%20%3D%20%27__%27%3B%20console.log%28unescape%28s%29.replace%28%27__%27%2C%20s%29%29'; console.log(unescape(s).replace('__', s))

Python 3

1
2
r='r=%r\nprint(r%%r)'
print(r%r)
1
2
3
x='y="x="+repr(x)+"\\n"\nprint(y+x)'
y="x="+repr(x)+"\n"
print(y+x)

C

1
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}
1
main(){char s[]="main(){char s[]=%c%s%c;printf(s,34,s,34);return 0;}";printf(s,34,s,34);return 0;}
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
char buff[80];
int main() {
FILE *fp;
fp = fopen(__FILE__, "r");
while (!feof(fp)) {
printf("%s", fgets(buff, 79, fp));
}
fclose(fp);
}

上面这个有些赖皮,直接读取并输出了源代码。有些 Quine 规则会不允许这样做。

阅读全文 »

APK,即 Android 应用程序包(Android application package),是 Android 操作系统中用于分发和安装移动应用及中间件的文件格式。一个 Android 应用程序的代码想要在 Android 设备上运行,必须先进行编译,然后打包成为一个被 Android 系统所能识别的文件,其格式便是 APK。一个 APK 文件内包含被编译的代码文件(.dex 文件,即 Dalvik executables),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)。

APK 文件基于 ZIP 格式进行压缩,它与 JAR 文件的构造方式相似。因而,直接解压 APK 文件可以得到一部分内容,如 classes.dex 等。如果要进行更详尽的分析,就需要用到反编译的工具了。

准备工作

下载 apk 反编译组件

需要下载的程序包括:

一些论坛里会把它们称为「APK 反编译三件套」。

前两个程序可以通过 Homebrew 进行安装:

1
brew install apktool dex2jar

Homebrew 同时也会将 openjdk 作为依赖包装好。

JD-GUI 需要点击上面的官网链接下载,选择 jar 格式的即可。

阅读全文 »

A point walks into A bar. says, "We're closed."
is walking down the street when it sees running towards him. "Help!", shouts, There's a differential operator coming my way, and if it catches me, I'll be reduced to nothing! confidently says "Stand beside me, ! Together, we'll be safe from any differential operators we come across!" Suddenly, the differential operator appears and asks "Who are you?" They respond "We are . Who are you?" It smiles and says "".

阅读全文 »

MySQL 的安装

在 MySQL 官网的下载页上,提供了各种系统和环境的安装方法。你可以选择通过包管理工具的软件源安装,也可以通过源码编译安装。不过编译是非常吃内存的(实测至少需要 4GiB 内存),并且还很耗时(毕竟是 C++ 写的),因此不推荐。具体来说,你可以:

使用包管理工具

yum 为例,首先增加并启用 MySQL 软件源,在 Download MySQL Yum Repository 页面找到适合你的版本,然后下载并启用之:

1
2
3
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm #换成适合你的版本
rpm -ivh mysql80-community-release-el7-1.noarch.rpm
yum-config-manager --enable mysql80-community

这样,就可以直接通过 yum 安装 MySQL 服务器了。

1
yum install mysql-community-server

安装完成后,会在 /usr/sbin//usr/bin/ 目录下出现 MySQL 的可执行文件,而 mysqld.service 会自动加载好。MySQL 的配置文件则是 /etc/my.cnf

如果你在使用 macOS,并配置好了 Homebrew:

1
brew install mysql

其它系统也可以使用相应的包管理工具安装。

使用源码编译安装

再次提醒:源码编译安装方式非常麻烦,如果可以的话请使用包管理工具安装。

1
2
3
4
5
wget https://cdn.mysql.com//archives/mysql-8.0/mysql-boost-8.0.13.tar.gz
tar -xzf mysql-boost-8.0.13.tar.gz
cd mysql-boost-8.0.13
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DDOWNLOAD_BOOST=1 -DWITH_BOOST=boost -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DTRACE=0 -DENABLED_LOCAL_INFILE=1 -DDEFAULT_CHARSET=utf8mb4 -DEXTRA_CHARSETS=all
make && make install

这里的 -DCMAKE_INSTALL_PREFIX-DMYSQL_DATADIR 参数指定了 MySQL 的安装目录和数据文件存储目录。

阅读全文 »
0%