littlecodersh / danmu

Python 弹幕包 A live danmu package for python
Other
721 stars 149 forks source link

Panda失效 #16

Open qiudaomao opened 7 years ago

qiudaomao commented 7 years ago

http://m.panda.tv/66666 这个API似乎不再可用了 http://www.panda.tv/ajax_chatroom?roomid=%s&_=%s'%(roomId, str(int(time.time())))

subtank commented 7 years ago

顶一个

songtianyi commented 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

songtianyi commented 7 years ago

@fuzhuo @subtank chatroom --> chatinfo

subtank commented 7 years ago

@songtianyi ???

subtank commented 7 years ago

后一条看不懂,修改哪里

qiudaomao commented 7 years ago

@songtianyi thanks, 看起来可以 http 'http://www.panda.tv/ajax_chatinfo?roomid=66666&_=1500220999'

subtank commented 7 years ago

@songtianyi 搞定,万分感谢。 @fuzhuo 你去修改一下Python\Lib\site-packages\danmu\目录下的32行代码就好了

songtianyi commented 7 years ago

@subtank 你们能连上服务器不,我这边还是没反应

subtank commented 7 years ago

@songtianyi 可以了,你要修改我说的那个文件对应位置

songtianyi commented 7 years ago

@subtank 改了啊,是我提出的方法啊

subtank commented 7 years ago

那就不知道了

qiudaomao commented 7 years ago

@subtank 提个PR吧

songtianyi commented 7 years ago

@subtank @fuzhuo 你们了解他发的内容不,我不是很懂python 第一个包

4 byte 消息类型

2 byte 数据大小,不包括消息类型

数据

4 byte 心跳包

不知道为什么第一个认证包 要带上心跳包

qiudaomao commented 7 years ago

@songtianyi 我是做了个objc的实现,第一个心跳包是单独发的不是带上的吧? 难道不是先发个房间认证包,包含rid appid ts sign authType之类的 再发第一个心跳包 接下来进入异步读取弹幕消息的循环 然后开始定时发心跳包

songtianyi commented 7 years ago

@fuzhuo 作者的第一个心跳包是和认证包一起的。 你的能work不?

qiudaomao commented 7 years ago

@songtianyi 可以work,我是分开发的,tvOS上正常弹幕。但没试过不知道第一个心跳包有没有时间限制,也许在超时前发就好了

songtianyi commented 7 years ago

@fuzhuo 你是按照我刚才说的 协议方式发的不? 数据大小 2个字节,一般都是用4个字节的,所以我有点怀疑。

qiudaomao commented 7 years ago

@songtianyi 发送时数据大小不是两个字节而是一个字节吧,也许熊猫觉得进入房间的字符串长度是比较固定的不会超过256一个字节足以。这个python里第一个心跳确实一起发了,我分开发也没问题 data = (b'\x00\x06\x00\x02\x00' + pack('B', len(data)) + data.encode('utf8') + b'\x00\x06\x00\x00')

songtianyi commented 7 years ago

@fuzhuo 两个字节啊,

\x00\x06\x00\x02\x00

最后的\x00 其实是长度的前半部分,作者的实现是有问题的。 你是直接用的他的代码还是自己开发的?

qiudaomao commented 7 years ago

@songtianyi 嗯,多谢,你这样理解应该更合理,多出一字节有点怪怪的,可能在实际使用过程中长度没遇到过超过256,于是那个字节固定是0x00,所以作者的实现暂时使用不会出问题。我的是自己开发的oc版,但协议跟作者的实现用的一样的

songtianyi commented 7 years ago

@fuzhuo 看来我还是得自己抓包看下才行

qiudaomao commented 7 years ago

@songtianyi 除非遇到验证包的长度值一个字节容纳不了才能验证你的想法,估计很难验证了

songtianyi commented 7 years ago

目前来看,panda的弹幕协议设计的比较混乱,收到的包不带长度,固定以ack开头,中间有一段不固定长度的内容,之后是json弹幕。 buffer要留的足够大即可。

songtianyi commented 7 years ago

不过我跑一段时间 会出现EOF

subtank commented 7 years ago

@fuzhuo 又挂了求帮忙。

rwifeng commented 7 years ago

又挂了