Code Monkey home page Code Monkey logo

yjmonitor's Introduction

YjMonitor

b站 上船风暴监控
作者自用,更新不频繁,bug 基本没有,但是更新慢,衍生自 https://github.com/yjqiang/bili2.0

monitor 部分(很多子监控)

  1. ctrl.toml 最后那里定义了发送目标房间,结果都会发到指定房间里面;start end 控制监控范围。
  2. 由于python性能问题,推荐一台机器监控 4000 左右房间,需要几台机器协同一起监控,之后考虑 golang(flag)。

ctrl 部分

  1. tcp_client.py 是 tcp 接收端,自定义心跳,同时把原数据前面加一个 header 作为数据发送(就像 bilibili 弹幕那样)。
  2. req_check.py 负责监控 websocket 服务器的状态,需要管理员权限。 observers_count 是在线总计用户数量; observers_count 分别统计每个 key 的用户数量( key 是取了 md5 开头 5 位, 不是原 key ); posters_count 统计所有推送者的状态,数字是该推送者最后一次推送的 unix 时间,若 unix 时间距离当前时间过久,那么说明该推送者可能掉线了; curr_db 展示了数据库内 key 的存储,日期为创建 unix 时间-到期 unix 时间,这里的 key 同样是 md5 ,如果到期日期为 0 ,那么这个 key 是永久有效。每运行一次该脚本,都会自动清空过期用户,之后才返回数据。
  3. req_create_key.py 负责让 server 服务器产生新的 key ,需要超管权限。max_users 表示该 key 的最大同时使用人数, available_days 表示有效的天数,如果为0,那么表示永久有效。
  4. req_post_raffle.py 负责向 server 服务器推送 raffle (仅作为示例),需要管理员权限。
  5. global_var.py 里面的 URL 是 server 服务器的地址以及端口,控制以上的请求目标。
  6. key 文件夹里面的 create_key.py 是单独运行的产生公钥私钥,密钥用于验证身份等。其中 super_admin_privkey.pem 是超管, admin_admin_privkey.pem 是普通管理员。不同 websocket 控制内容有不同的身份控制,状态检查和推送抽奖需要普通管理员,而产生 key 需要超管身份。

server部分(转发子监控发送的抽奖信息)

  1. run.py 负责运行。
  2. db 负责存储与验证链接 key 。key 在服务器端产生,保存特殊 hash 用于验证客户端的 tcp 连接请求。
  3. key 文件夹里面只存贮公钥以验证身份等。其中 super_admin_pubkey.pem 是超管, admin_pubkey.pem 是普通管理员。

key

  1. client、server、monitor部分(就是👆那几个部分)都需要 key (这里的 key 指 rsa 的 key),key 存在各自的key文件里面,运行需要两对 key,分别是 super_admin_privkey.pem 与 super_admin_pubkey.pem 、 admin_privkey.pem 与 admin_pubkey.pem 。monitor 即子监控部分需要 admin_privkey.pem 用来推送,ctrl 部分需要 super_admin_privkey.pem 和 admin_privkey.pem 用来控制等,server 需要 super_admin_pubkey.pem 和 admin_pubkey.pem 来验证等。

yjmonitor's People

Contributors

yjqiang avatar yunowo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

yjmonitor's Issues

疑似短时间发送弹幕数量过多被封禁(同时ws server实现的必要性)

部分log记录
2019-02-20 16:48:09 弹幕厸覀.囵忄圌+團尝试
2019-02-20 16:48:34 弹幕厸?覀?.?囵?忄圌+團尝试
2019-02-20 16:48:58 弹幕厸覀.囵忄?圌?+?團?尝试
2019-02-20 16:49:23 弹幕厸?覀?.?囵?忄?圌?+?團?尝试
2019-02-20 16:49:48 弹幕厸??????覀.囵忄圌+團尝试
2019-02-20 16:50:12 弹幕厸覀??????.囵忄圌+團尝试

附图
tim 20190220180323
tim 20190220180309

argon2安装和 key 生成疑问

生成钥匙那里不太懂
安装argon2 版本太高
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

B站策略更改

悲 破站似乎限制了一个IP下最大弹幕连接数量
各种监控通通GG
目前没看到有解决方案

关于分布式服务的问题

image
想问一下我这个使用方式是否正确
所有的机子都在一个内网里
{(@8G)XZIQJ ZK9R95~BM

image
JWM}M{05T D4Y~R31@S{LMO
image
这个server的结果很奇怪......

关于分发的房间列表的疑问

今天通过对比,发现有些房间还是没有监控到。
看到是get了lc4t的列表,不清楚lc4t是怎么一个获取房间排列的方法,是否仅查看开播房间?
因为我查看了一些有舰长的房间id并没有出现在lc4t的列表中。
想看看lc4t的房间id能不能再改进一下这样子,因为只有6000个不到的房间id

问题

1.设置范围1-5000,会出现连接不上,是不是因为大量访问被封IP?这样通过拨号可以解决?貌似不可以。。
2.只是发送结果到目标房间是吗?不会参与抽奖。
3.该监控是否只检测两种礼物(测试几秒钟就看到两种输出结果)。
4.测试了一下默认设置,是随机监控500个房间吗?
5.live-tools(或者bili2.0)有获取弹幕结果来进行参与吗?没有的话只能自己另外想办法写一个参与?(苦手)

弹幕发送频繁提示

[2018-11-09 21:18:30] 95号弹幕监控进入房间(3624449)
[2018-11-09 21:18:30] 93号弹幕监控进入房间(10658142)
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
[2018-11-09 21:18:51] 1号弹幕监控心跳
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
当前时间为 21:18:55
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
[2018-11-09 21:19:21] 1号弹幕监控心跳
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
当前时间为 21:19:25
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
[2018-11-09 21:19:33] 弹幕发送频繁提示
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.109434097
{'code': 0, 'msg': 'msg repeat', 'data': []} 242.10943409
7
{'code': 0, 'msg': 'fire', 'data': []} 242.10943409~7

问一下签名的问题

创建key以后 链接上了 tcp_client测试也链接了
但是收不到推送(没有0号数据库的推送)
测试一下 发现签名错误 想问一下这个签名 是用ctrl里面的create_key创建的两个文件吗

屏蔽与长度的绕过策略

长度限制了某些弹幕不能过长,于是我们采用了高进制。
高进制导致屏蔽关键词触发频率提高。
于是打算混合两办法,加入新的指示符号,然后高进制发送失败就使用原文发送,再失败……你妹

影响命中率因素与已有的一些措施

  1. 分发lc4t服务器20分钟间隔的刷新率,可能导致房间没有及时获取到

  2. 房间的选取是开播房间(按照热度排序)+ 未开播的房间(按照关注度排序),可能具体的阈值控制要调整

登录失败

user.toml里新添加的用户似乎无法登录,要用bili2.0先登录创建缓存,再把user.toml的内容复制过去才行
Snipaste_2019-04-04_15-57-48

重复发送中奖信息

消息重复

2 : 牜.固孓囧+圜
2 : 饣.牜亼廴饣+圛
2 : 卩.固孓囧+圚
2 : 卪.牜亼廴饣+圙

2 : 卩.囥扌灬囜皕囪~圚
1 : 厽.囥扌灬囜皕囪~圖
2 : 卪.囹亽囩~圙
1 : 孓.囹亽囩~圕

内容非法提示

default
是否因为发送速度过快,连着发两次弹幕中间sleep1秒或许可以解决。

另外,好像看过一次一个房间同时两个舰长出现的时候只发送了一条弹幕,那样是否只识别到这个房间只有一个舰长?

延时进入房间

不要所有tcp客户端一起发送连接请求,很容易出现失去连接。

我之前用我没写完的那个c#版本(一直没时间写)测试,一次性全部连接上b站弹幕服务器,最多挂3000个连接,cpu占用也很大。如果启动一个tcp连接之后延时一段时间再启动下一个tcp连接,可以挂至少6000个连接,而且很稳定(不敢再高了,怕b站把我ip封了),cpu占用也很平缓

本来想自己改然后发pr的,但是不会改。。。

下面那个代码的意思是
interval代表多少时间之后启动下一个tcp连接,计算方式是把所有tcp客户端连接平均分配到30秒完成,而不是一起连接到服务器

Snipaste_2019-05-11_00-08-31

server 负载均衡

平时 server 服务器压力大么,也许可以考虑让 monitor 同时推送到多个 server,然后由tcp负载均衡(nginx或者别的)连接到多个不同的 server

近两天被封直播弹幕多了

近期有许多帐号都被封禁直播区的弹幕,提示:“发送失败,您的账号可能存在风险,暂时无法发送消息,请确保账号资料属实并绑定真实手机号码”
即使是真人帐号使用也还是会被封禁,小号几乎都阵亡了

自建使用疑问

单开monitor模式
raffle_minitor_roomid用的是不在直播的空房间,弹幕发出,但是舰长未领取。

使用步骤

大佬可以具体说一下这个个配置步骤吗。我懂一点程序,但是python不是太懂,先配置哪个在配置哪个可以说下吗!

监控房间选取

监控逻辑还是有点漏洞的,例如设定的获取排名1-500热度房间,且重新获取的时间为半个小时,如果刚好有个房间在这16分刚开播(热度为零),然后到45分之前开通了100个舰长,舰长时间只有二十分钟,这样就会检测不到这期间的100个舰长抽奖。
先把问题提出来,之后看有没有想法或者办法能弥补这个漏洞

搭建方面一些问题

1.同时使用多个子监控的配置文件是
START = 0
END = 4000
START = 0
END = 4000
还是
START = 0
END = 4000
START = 4001
END = 8000
2.分布式服务是只需要填好IP运行server部分还是运行https://github.com/yjqiang/bili_utils/blob/master/fetch_roomids/refresh_rooms_hub/run_distributed.py
还是都要运行?
配置方面又要怎么写
3.暴力轮询部分运行之后无输出该怎么解决?
4.这个要怎么填?tcp://ip:端口?端口默认是啥,配置文件里没找到
yjmonitor_tcp_addr = ''

运行server 报错

Traceback (most recent call last):
File "D:\YjMonitor\server\run.py", line 8, in
from db.key_handler import key_handler, KeyCheckVerificationError, KeyCheckMaxError
File "D:\YjMonitor\server\db\key_handler.py", line 8, in
from . import sql
File "D:\YjMonitor\server\db\sql.py", line 13, in
class Key:
File "D:\YjMonitor\server\db\sql.py", line 17, in Key
key_max_users = attr.ib(convert=int)
TypeError: attrib() got an unexpected keyword argument 'convert'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.