记录:修复 blivechat 无法获取头像的问题 & 搭建本地服务器

字数统计: 1.3k 阅读时间: 2 mins 访问次数: ... 评论统计: ...

  花了半小时的时间 + 200M 硬盘空间解决了 blivechat 无法显示头像的问题,虽然全程基本靠复制粘贴,但是解决了问题的感觉还是非常愉快的!
  于是开一篇笔记记录一下。以及在这个过程中发现上次写的弹幕样式无法用本地安装包实现,必须要自建服务器并魔改头像生成代码才能使用,这就比较尴尬了……

搭建本地服务器

  首先需要安装 3.6 以上版本的 Python,拉到最下方选择 Windows installer (64-bit),然后安装过程中大概最好是把所有带管理员权限的选项全部勾上?一个是解除路径最大字符限制的,另一个是啥我给忘了【
  然后按照 blivechat 源仓库的 readme 一步一步操作下来即可,需要注意的是除了「编译前端」以外的步骤全部需要在 blivechat 的根目录完成。

修复头像显示

  在服务器搭建完毕后直接双击根目录下的 main.py 文件即可开启 blivechat,是的这个操作可以代替掉在命令行里输入 python3 main.py 的行为,倒不如说后者在我的电脑上根本不好使,是因为这不是给 windows 系统的操作吗【
  成功打开前端页面后即可把所有的东西关闭,让我们开始解决头像的问题。

更改抓取方式

  仔细一看这是 2022 年 9 月的 issue:原有的api被反爬虫拦截
  很忙啊,作者是真的很忙啊……
  解决方法完全参考抄袭一位热心网友在三周前的回复,在本地文件中找到 services/avatar.py 右键用文本编辑器打开,找到以下段落:

1
2
3
4
5
6
7
8
async def _do_get_avatar_url_from_web(user_id):
try:
...
# 中间有很长一段代码但我假定你的代码水平和我差不多
# 所以我们只需要辨识出开头和那一行注释就够了!
...
if data['code'] != 0:
# 这里虽然失败但不会被ban一段时间

  将以上内容修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
async def _do_get_avatar_url_from_web(user_id):
try:
async with utils.request.http_session.get(
'https://api.bilibili.com/x/web-interface/card',
params={
'mid': user_id,
'photo': '1',
'jsonp': 'jsonp'
}
) as r:
if r.status != 200:
logger.warning('Failed to fetch avatar: status=%d %s uid=%d', r.status, r.reason, user_id)
if r.status == 412:
# 被B站ban了
global _last_fetch_banned_time
_last_fetch_banned_time = datetime.datetime.now()
return None
data = await r.json()
except (aiohttp.ClientConnectionError, asyncio.TimeoutError):
return None

if data['code'] != 0:
# 这里虽然失败但不会被ban一段时间

  同样的开头和结尾,直接复制替换即可。

修复头像大小

  那么完成以上步骤后重启服务器弹幕列表就可以显示头像了,但是这个时候的头像糊得像不慎混在口袋里被送进洗衣机的餐巾纸,因为源代码中为了保持网络通畅将头像裁剪为了 48×48,显然这个数字是不符合我的设计需求的。
  那么解决的办法是在刚才动过刀的创口附近找到这样几行代码:

1
2
3
4
# 缩小图片加快传输
if not avatar_url.endswith('noface.gif'):
avatar_url += '@48w_48h'
return avatar_url

  将 48 更改为 128 即可。
  我也不确认这里是不是一定需要 2 的次方数但 128 这个尺寸确实是刚好的【

清理头像缓存

  操作完毕后重启服务器,新头像的获取变得清晰了不少,但已经被洗衣机泡烂了的旧头像却依旧没有复原……
  是因为 48×48 的小头像已经被缓存了,重启服务器也并不会重新抓取,这个时候需要删掉头像数据库重新建立才行。
  数据库的位置是 data/database.db,删掉这个文件重新开启服务器即可。因为这个数据库似乎是从 cookie 里抓取头像的,所以如果删一次没效果的话可能需要重复几次这个步骤。

交稿方式

  折腾完这一堆东西想到今晚又要打龙诗多少有点身心俱疲的意味在里面……
  但是完成这一堆搭建环境的工作之后真正开启服务器又只需要点一下就好了,给甲方直接发配置好的压缩包或许也是一个可行的方案?
  啊但是运行之前还是要先安装 pyhton,感觉以后还是尽量避免这种大号头像的设计吧,呜呜 :4o-5:

追加更新

  好的我试播回来了发现全部改完以后礼物的头像还是被洗衣机泡烂的小图!!!并且我找不到改的地方!!!因为礼物头像是从礼物 API 里请求过来的,这个请求似乎默认就是小号图片……
  唯一能正常显示头像的礼物只有舰长。
  呃啊啊啊啊啊怎么会这样,好想撞墙啊……


  1. 1. 搭建本地服务器
  2. 2. 修复头像显示
    1. 2.1. 更改抓取方式
    2. 2.2. 修复头像大小
    3. 2.3. 清理头像缓存
  3. 3. 交稿方式
  4. 4. 追加更新