Open qiudaomao opened 7 years ago
顶一个
import time, sys
from danmu import DanMuClient
def pp(msg):
print(msg.encode(sys.stdin.encoding, 'ignore').
decode(sys.stdin.encoding))
#dmc = DanMuClient('https://www.douyu.com/32892')
#dmc = DanMuClient('https://live.bilibili.com/324')
dmc = DanMuClient('https://www.panda.tv/66666')
if not dmc.isValid(): print('Url not valid')
@dmc.danmu
def danmu_fn(msg):
pp('[%s] %s' % (msg['NickName'], msg['Content']))
@dmc.gift
def gift_fn(msg):
pp('[%s] sent a gift!' % msg['NickName'])
@dmc.other
def other_fn(msg):
pp('Other message received')
dmc.start(blockThread=True)
+1
@fuzhuo @subtank chatroom --> chatinfo
@songtianyi ???
后一条看不懂,修改哪里
@songtianyi thanks, 看起来可以 http 'http://www.panda.tv/ajax_chatinfo?roomid=66666&_=1500220999'
@songtianyi 搞定,万分感谢。 @fuzhuo 你去修改一下Python\Lib\site-packages\danmu\目录下的32行代码就好了
@subtank 你们能连上服务器不,我这边还是没反应
@songtianyi 可以了,你要修改我说的那个文件对应位置
@subtank 改了啊,是我提出的方法啊
那就不知道了
@subtank 提个PR吧
@subtank @fuzhuo 你们了解他发的内容不,我不是很懂python 第一个包
4 byte 消息类型
2 byte 数据大小,不包括消息类型
数据
4 byte 心跳包
不知道为什么第一个认证包 要带上心跳包
@songtianyi 我是做了个objc的实现,第一个心跳包是单独发的不是带上的吧? 难道不是先发个房间认证包,包含rid appid ts sign authType之类的 再发第一个心跳包 接下来进入异步读取弹幕消息的循环 然后开始定时发心跳包
@fuzhuo 作者的第一个心跳包是和认证包一起的。 你的能work不?
@songtianyi 可以work,我是分开发的,tvOS上正常弹幕。但没试过不知道第一个心跳包有没有时间限制,也许在超时前发就好了
@fuzhuo 你是按照我刚才说的 协议方式发的不? 数据大小 2个字节,一般都是用4个字节的,所以我有点怀疑。
@songtianyi 发送时数据大小不是两个字节而是一个字节吧,也许熊猫觉得进入房间的字符串长度是比较固定的不会超过256一个字节足以。这个python里第一个心跳确实一起发了,我分开发也没问题 data = (b'\x00\x06\x00\x02\x00' + pack('B', len(data)) + data.encode('utf8') + b'\x00\x06\x00\x00')
@fuzhuo 两个字节啊,
\x00\x06\x00\x02\x00
最后的\x00 其实是长度的前半部分,作者的实现是有问题的。 你是直接用的他的代码还是自己开发的?
@songtianyi 嗯,多谢,你这样理解应该更合理,多出一字节有点怪怪的,可能在实际使用过程中长度没遇到过超过256,于是那个字节固定是0x00,所以作者的实现暂时使用不会出问题。我的是自己开发的oc版,但协议跟作者的实现用的一样的
@fuzhuo 看来我还是得自己抓包看下才行
@songtianyi 除非遇到验证包的长度值一个字节容纳不了才能验证你的想法,估计很难验证了
目前来看,panda的弹幕协议设计的比较混乱,收到的包不带长度,固定以ack开头,中间有一段不固定长度的内容,之后是json弹幕。 buffer要留的足够大即可。
不过我跑一段时间 会出现EOF
@fuzhuo 又挂了求帮忙。
又挂了
http://m.panda.tv/66666 这个API似乎不再可用了 http://www.panda.tv/ajax_chatroom?roomid=%s&_=%s'%(roomId, str(int(time.time())))