精华内容
下载资源
问答
  • 2021-12-13 22:36:02

    当前可用项目

    看大佬的汇总种类比较齐全,有其他开发需求直接fork修改就行

    各种直播平台的直播流&弹幕流解析
    https://github.com/wbt5/real-url

    自行思路参考

    1.简单难度:模拟http客户端,解析html节点
    模仿实现难度比较低,但可见需要的运行资源成本比较高,虎牙修改网页时需要进行适配

    Python Selenium简单爬取虎牙直播弹幕(仅学习)
    https://blog.csdn.net/weixin_47190827/article/details/113351024

    2.困难难度:转写虎牙官方实现方法,直接解析ws流
    本来是打算自己换成Java尝试实现的(补:发现有其他类似项目:huya-danmu),不过看完解析发现着实麻烦…因为实际需求功能比较小,选择尝试换成python修改源码自用了,另外按文章参考理解一下逆向思路也是不错的

    项目地址:
    https://github.com/759434091/danmu-crawler

    搭配食用的博客文章:
    抓取虎牙直播弹幕流(WireShark&前端源码)

    博客里面有些图片失效了,这里手动补充一下,剩下的按博客思路理解就好:
    1.寻找WebSocket地址部分
    在这里插入图片描述
    2.分析源码部分,找到具体执行解析弹幕ws流的函数
    在这里插入图片描述

    更多相关内容
  • DY-DanMu:斗鱼弹幕抓取

    2021-05-31 00:34:25
    斗鱼弹幕抓取 具体思路 根据斗鱼开发文档 进行websocket端抓取 消息长度:4 字节小端整数,表示整条消息(包括自身)长度(字节数)。 消息长度出现两遍,二者相同。 消息类型:2 字节小端整数,表示消息类型。取值...
  • B站弹幕抓取2021.zip

    2021-09-28 00:00:26
    抓取B站弹幕数据。 弹幕dmid,唯一 可用于操作参数 视频内弹幕出现时间,毫秒 弹幕类型,1 2 3:普通弹幕 4:底部弹幕 5:顶部弹幕 6:逆向弹幕 7:高级弹幕 8:代码弹幕 9:BAS弹幕(仅限于特殊弹幕专包) 弹幕字号...
  • 斗鱼弹幕抓取及实时弹幕数据可视化,分为履带(弹幕抓取),服务器(弹幕统计数据服务器),web(统计数据可视化前端)三部分。 正在开发中…… 运行 安装依赖 # dybarrage-crawler pip install -r requirements.txt...
  • B_zhan直播间弹幕抓取

    2022-05-25 21:44:15
    B_zhan直播间弹幕。。。。。

    前两天研究了一下B_zhan的直播间,其实B_zhan的用户体量很少。我最近几个月一直在搞B站,几乎B_zhan能pa的都被我试过。其中还包括包括私信,大批量的私信。不过再三声明哈,我本人是为了学习,为了技术而去研究,并非用于商业用途。

    这里我把B站直播间弹幕的代码发出来,就当作做个记录吧,万一以后用到就不用我重新去写了。

    import pymysql
    import requests,time
    
    db = pymysql.connect("host", "root", "password", "table", charset='utf8mb4')
    
    cur = db.cursor()
    
    def work_1(room_id,f):
        url = "aHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vQXBwUm9vbS9tc2c/cm9vbV9pZD0="+str(room_id)
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
            # 'Cookie': 'buvid3=DA5846C7-646E-0904-0458-012E677A9B3A55357infoc; innersign=1'
            # 'cookie': '_uuid=B6610A168-E31D-5FE2-F6AA-6CBF474BD8F548855infoc; buvid3=2E3F120D-4845-237F-10E5-E098A837497F62582infoc; b_nut=1652889062; buvid4=20BD8A06-CE2E-4E53-7154-8708F50D709962582-022051823-9aP+lNBWQG3ZSvnKpWr+YXGoWltZK/meRYpL5S9DSBIfa9D7j0ATkg%3D%3D; B_SESSDATA=987711b4%2C1660665085%2C8fe23%2A59; bili_b_jct=2986eebd355f09bf706a9d8d59004920; B_DedeUserID=12717125; B_DedeUserID__ckMd5=ac85c1bd5132323c; B_sid=8znagbm4; buvid_fp_plain=undefined; CURRENT_BLACKGAP=0; blackside_state=0; rpdid=|(kmJY~k)|lR0J\'uYlkmYJm~J; fingerprint=2a02d0bcfbad3f8893500097c177b3e6; buvid_fp=f4d3163daaf209e5621bbe64b1e7330e; SESSDATA=9b054a26%2C1668516676%2Cfa1f8%2A51; bili_jct=c3a19d545ba134d1205c520b9819c39b; DedeUserID=23854230; DedeUserID__ckMd5=45af4dc91dbbc312; sid=6he4s3h6; bp_video_offset_489388000=635614817268269000; i-wanna-go-back=-1; b_ut=5; innersign=1; CURRENT_FNVAL=4048; bp_video_offset_23854230=662173756825796600; b_timer=%7B%22ffp%22%3A%7B%22333.866.fp.risk_2E3F120D%22%3A%22180D7DD8CB1%22%2C%220.0.fp.risk_2E3F120D%22%3A%22180D82148E1%22%2C%22333.130.fp.risk_2E3F120D%22%3A%22180DC5DEA98%22%2C%22333.999.fp.risk_2E3F120D%22%3A%22180DD67FD7C%22%2C%22888.2421.fp.risk_2E3F120D%22%3A%22180D8383D38%22%2C%22777.5.0.0.fp.risk_2E3F120D%22%3A%22180D8383D89%22%2C%22333.788.fp.risk_2E3F120D%22%3A%22180E1E6BDB1%22%2C%22333.937.fp.risk_2E3F120D%22%3A%22180E2135465%22%2C%22333.858.fp.risk_2E3F120D%22%3A%22180DC610F9B%22%2C%22333.1007.fp.risk_2E3F120D%22%3A%22180DCEDD446%22%7D%7D; PVID=4; b_lsid=EF104B5F9_180E5612158',
    
        }
        Session = requests.session()
        while True:
            proxies = IP()
            try:
                resp = Session.get(url=url,headers=headers,proxies=proxies)
                content = resp.json()
            except:
                content["code"] == 0
    
            if content["code"] == 0:
                for i in content["data"]["room"]:
                    text = i["text"]  #弹幕内容
                    timeline = i["timeline"]    #弹幕发送时间
                    nickname = i["nickname"]    # 弹幕发送者昵称
                    user_id = i["uid"]          #弹幕发送者uid
                    if len(i["medal"]) == 0:    # 弹幕发送者等级
                        medal = 0
                    else:
                        medal = i["medal"][0]
                    rnd = i["rnd"]
                    # f.write(nickname+"\t"+str(medal)+"\t"+str(timeline)+"\t"+text+"\n")
                    # print(nickname+"\t"+str(medal)+"\t"+str(timeline)+"\t"+text)
                    sql = f'INSERT INTO B_danmu (room_id,user_id,`name`,timeline,text,medal) VALUES (' \
                        f' "{room_id}","{user_id}","{nickname}","{timeline}","{text}","{medal}" )'
                    get_myql(sql, state="INSERT")
            time.sleep(5)
    
    def get_myql(sql,state):
        if state == "select":
            cur.execute(sql)
            list = cur.fetchall()
            return list
        elif state == "INSERT":
    
            try:
                cur.execute(sql)
                db.commit()
                print(sql)
                print("插入成功!!!")
            except pymysql.err.IntegrityError:
                pass
                # print("重复")
    
    
    def IP():
        # 代理服务器
        proxyHost = "************"
        proxyPort = "9020"
        # 代理隧道验证信息
        proxyUser = "********"
        proxyPass = "********"
    
        proxyMeta = "************************" % {
            "host": proxyHost,
            "port": proxyPort,
            "user": proxyUser,
            "pass": proxyPass,
        }
    
        proxies = {
            "http": proxyMeta,
            "https": proxyMeta,
        }
        return proxies
    
    if __name__ == '__main__':
        t = str(int(time.time()))
        room_id = ""  #直播间的房间号
        with open('直播间弹幕',"a",encoding="utf-8") as f:
            work_1(room_id,f)

    上面其实就用到了一个链接:

    这里的URL转码了一下,base64了一下。

    aHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vQXBwUm9vbS9tc2c/cm9vbV9pZD0=   +   room_id。

    这是人家平台本身的接口,我们拿来借用学习。

    起初我以为下图这里的是直播间ID

    直到后面我怎么看接口怎么觉得接口没问题,那为啥拿下来的数据每次都一样,后面我就重新F12中找了找,找到了正确的ID,抓取下来的数据就正常了。

    正确的ID是在下图这里。

    另外,我把接口返回数据再说下,有个同学他不太懂,我等下写完要把文章分享过去让他看一下,尽量写的详细点,让他能看明白。

    这里面我们主要是拿room中的数据,里面有我们想要的信息。

    其实这里已经很简单了,text嘛,弹幕内容;nickname,昵称;还有timeline是用户发布时间;这里如果要看用户等级,在medal中的第一个元素中。 

    为什么不用admin中的数据,感觉样式和room一模一样,但是多刷新两下你会发现admin中的数据像是类似于榜单这样的,所以造成刷新了两三次得到的数据一模一样。

    另外额外说一个坑,就是B_zhan可能用户体量比较小,然后看直播的人也不多,发弹幕的少,刷新的时候,尤其是遇到观看人数少的那种,发现room中的数据一模一样,其实这不是接口原因,而是单纯的没人发弹幕。。。。。。。。所以我设置了5秒抓取一次,这个可以根据实际情况来定。既然发弹幕的人少,每次返回的数据中可能会有和上次重叠的,那怎么办?我是存在数据库中,以用户ID和时间两个字段为主键,因为它肯定不存在一个人同一时间发不了两个弹幕的情况,所以这样就完美的避开了这个坑。

    OK,就这样吧,其实这个B_zhan项目还是很简单的,主要是给某位同学看下,要是我自己去写,我估计就直接贴个代码上去,其他的我就不管了。写完了,洗澡睡觉休息。

    展开全文
  • 某东实时弹幕抓取

    2020-12-27 23:05:34
    对于已经拿到sign只想看弹幕的部分直接跳到4。 用的抓包工具是HttpCanary,随便进入一间直播间,可以看到弹幕走的是websocket,携带的url参数token来自于下面post返回的结果,经过分析只有st,sign,sv三个参数会变,...

    这次案例用的版本是9.2的,9.2以后的版本有frida检测。

    1.抓包,查找sign

    对于已经拿到sign只想看弹幕的部分直接跳到4。

    用的抓包工具是HttpCanary,随便进入一间直播间,可以看到弹幕走的是websocket,携带的url参数token来自于下面post返回的结果,经过分析只有st,sign,sv三个参数会变,其余都不变。

    image.png

    image.png

    image.png

    image.png

    image.png

     

    既然分析完了,那就从sign开始入手。当时我找这个sign找了一会没找出来,由于sign会跟其它参数拼接成url,所以我就搜其它参数wifiBssid,搜出来很明显就在第一个。

    image.png

    image.png

    这里hook这个getReportString方法,把它的调用堆栈打印出来,然后去查看。

    image.png

    这里我就直接贴出来了,省得大家浪费时间去找,眼尖的可以看到里面有signature,不就跟我们要的sign很像吗,这里把b方法三个参数hook打印一下,

    image.png

    进到signature这个方法,可以看到这只是接口,那就搜索这个类,看它在哪里被实现。

    image.png

    image.png

    被getSignFromJni方法实现了,再深入看一下,可以看到加密过程在so里面。

    image.png

    image.png

    这里就直接hook这个函数打印参数,多调用几次,然后跟抓到的数据做对比,看哪些参数不变。经过我的测试,这些参数不用修改,可以直接拿过来用,而且都是string类型的,也不用做什么类型转换。返回值的st,sign,sv都是组成url需要的参数,而且这里的参数v3是post的body的值。

    image.png

     

    2.使用rpc进行调用

    这里就直接使用rpc进行调用就可以了,根据它的参数照搬就可以了。

    import frida
    import json
    
    rpc_sign = """
    rpc.exports = {
        getsign: function(function_id, body_string, uuid){
          var sig = "";
          Java.perform(
            function(){
                //拿到context上下文
                var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
                var context = currentApplication.getApplicationContext();
                var BitmapkitUtils = Java.use('com.jingdong.common.utils.BitmapkitUtils');
    
                sig = BitmapkitUtils.getSignFromJni(context, function_id, body_string, uuid, 'android', '9.2.0');
            } 
          )
           return sig;
        }
    };
    
    """
    
    def get_sign(function_id, body_string, u):
        process = frida.get_remote_device().attach('com.jingdong.app.mall')
        script = process.create_script(rpc_sign)
        script.load()
        sign = script.exports.getsign(function_id, body_string, u)
        return sign
    
    body_data = {"appId":"jd.mall","content":"tbV8seY199tCdw6GllmkWyCNNENuGsgwLByA7svt5HbPXvlI9wQhHMk3dT7f0ldfpq6M0MCiUD+A\nVrY390Yct0FSub03INUml9n1bS9rZSF3XT0q1kQdehKPO4CccMiEA6NQXYiqYn9wLsDDYEIjmkVA\nEbXI88CwO0K7uhwemdhQMZrcIFj6jMmyiDNDxSA1OjFw88hR0oSCF0m8ll9o9iU2MVSHDipF5ZDn\nFR4E+82mwfRYIxamafB+nWG8GuHcKhiQOWGbChTcG3TxcGT053wfcc6uuMD7+L4PcsNRQjM9syFc\nXR6FBu/sCV/kH/3rT8w/m3zV1c9JpW9lq/7WVzCVvAIj7RNt2zzYFisymCE="}
    body_string = json.dumps(body_data, ensure_ascii=False).replace(" ", "")
    function_id = 'liveauth'
    u = '-a08d16f38776'
    sign = get_sign(function_id, body_string, u)
    print(sign)

    结果:

    st=1608288325570&sign=bf449b04f88afea4c08e18006127cace&sv=121

    3.构造请求拿到认证

    上面只是拿到了sign,还得拼接url进行请求,这里就不展示了,要的参数基本都有了,其它不变的参数照搬就行,我就直接post请求拿结果了。

    {'code': 0, 'msg': '鉴权成功', 'data': {'liveUrl': 'wss://live-ws4.jd.com', 'token': 'amQubWFsbF_muLjlrqJfOTMxMTE0MzY4NDNfMTYwODI3OTE4NzA5NGxTNkViVw=='}}

    4.建立WebSocket

    保存刚才请求websocket,打开可以看到它请求的参数。

    {
      "app": "com.jingdong.app.mall",
      "host": "live-ws4.jd.com",
      "remoteIp": "106.39.169.212",
      "remotePort": 443,
      "sessionId": "c77ac6e9-019d-4ac9-8611-92f24eb29851",
      "time": "2020-12-19 23:48:18",
      "url": "wss://live-ws4.jd.com/?token\u003damQubWFsbF_muLjlrqJfMjg5NDU0ODc3NDZfMTYwODI3Mjg5ODE0NFdSb0xibw\u003d\u003d"
    }

    怎么建立WebSocket连接呢?

    这里就需要用到python的aiowebsocket库。

    详细的说明和使用方法请看:https://zhuanlan.zhihu.com/p/82089648

    代码如下:

    import asyncio
    import logging
    from datetime import datetime
    from aiowebsocket.converses import AioWebSocket
    import LiveBarrage
    import json
    
    async def startup(uri):
        async with AioWebSocket(uri) as aws:
            converse = aws.manipulator
            # 客户端给服务端发送消息
            a = {
                "aid": "dongdong",
                "body": {"ext":
                            {"appid":"jd.mall",
                            "entrace":"6",
                            "ver":"1.1"},
                        "groupid":"3092724", # 这个是房间号
                        "nickName":"神秘观众",
                        "type":"join_live_broadcast"},
                "from":{"app":"jd.live",
                        "clientType":"android",
                        "dvc":"-a08d16f38776",
                        "pin":""},
                "id":"df09a645-8e9b-4aad-b699-d44753ca8738",
                "type":"chat_group_message",
                "ver":"9.3.2"
            }
            # 把json转换为字符串
            body_string = json.dumps(a, ensure_ascii=False).replace(" ", "")
            # print(body_string)
            await converse.send(body_string)
            while True:
                mes = await converse.receive()
                # 设置编码
                mes = mes.decode('utf8')
                # nickName是用户名,判断nickName可以过滤非弹幕消息
                if 'nickName' in mes:
                    print('{time}-Client receive: {rec}'
                        .format(time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), rec=mes))
    
    if __name__ == '__main__':
        token = LiveBarrage.token()  # 这里返回的是post请求后拿到的token
        #remote = 'wss://api.bbxapp.vip/v1/ifcontract/realTime'
        print(token)
        try:
            asyncio.get_event_loop().run_until_complete(startup(token))
        except KeyboardInterrupt as exc:
            logging.info('Quit.')

    运行结果如下:

    image.png

    image.png

    可以看到是实时抓取的,到这里就结束了。

    5.其它接口

    这个app的接口参数都是一样的,不同的接口由functionId这个参数决定的。

    image.png

    这里我就把其它的接口名发出来,就省得大家去找了。然后post的参数hook查看一下照搬就可以了。

    搜索search

    商品评价列表getCommentListWithCard

    问答getQuestionList

    直播带货商品liveCartDetail

    弹幕liveauth

    展开全文
  • Bilibili 弹幕抓取系列到这里就结束了,这个过程中虽然绕了很多弯路浪费了大把时间,不过我还是学到了不少知识: WebSocket FiddlerScript 编写 WireShark 基本使用 抓包分析能力(二进制敏感度?) 另外感觉计网光...


    转载自

    https://ihomura.cn/2018/05/17/Bilibili%E7%9B%B4%E6%92%AD%E5%BC%B9%E5%B9%95%E6%8A%93%E5%8F%96-3-%E5%BC%B9%E5%B9%95%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/z

    前言

    有了前两篇的铺垫,其实到这里再去分析基本就没有什么难点了,无非是苦力活罢了。

    所以这篇文章主要是总结如何更好的分(偷)析(懒)。

    抓包分析

    弹幕消息

    这里挑选了一个比较典型的包,它包括了弹幕内容并且有多条弹幕。

    可以很明显看出,它是由两条弹幕构成的:

    其中选中的文本部分显然是一个JSON,前面的非 ASCII 码没猜错应该就是头部了,我们看一下第一条弹幕的头部。

    1
    
    00 00 01 0F 00 10 00 00 00 00 00 05 00 00 00 00
    

    首先头部的长度是 16,也就是 0x10,所以大胆猜测其中的 00 10 字段就是头部长度,结合后面第二条弹幕头部的相同字段的值,基本确定就是头部长度。

    那么可以猜测前面 00 00 01 0F 也就是 0x10F (别忘了 TCP 是大端序),应该是这条弹幕帧(头部+JSON文本数据)的长度。

    观察到偏移 0X10F 处开始正好是第二条弹幕的内容,而且第二条弹幕头部中这个字段的值是 0x125,两者相加是 0x234 即整个包的长度,所以确定猜测是正确的。

    此外还有一个非零值是 0x5,暂时猜测不出来它的意思,先放放。

    也就是说目前头部分析出来的结果是:

    1
    2
    
    | 00 00 01 0F | 00 10 | 00 00 00 00 00 05 00 00 00 00
    | 帧长度 | 头部长度 | 未知 | 
    

    然后我们再把注意力放到后面的 JSON 数据上,这里切换到 Fiddler 的 JSON 视图:

    由于头部部分不是 UTF-8 编码干扰了解码,所以 Fiddler 只解析出来了第一条弹幕的文本部分,不过已经足够了。

    其中有一个很重要的字段是 cmd,显然是 command 的缩写,它的值是 DANMU_MSG,所以显然是“弹幕消息”的意思。实际上通过抓包还可以看到有 WISH_BOTTLE, SEND_GIFT 等值,因此可以确定 cmd 用来指明弹幕的种类。

    同时可以看到 info 中直接就包含了弹幕的内容(“看不懂”)、弹幕发送者的 id (“266649406”)、弹幕发送者的昵称(“简短回忆”)和头衔(“靖菌”)等等内容。

    到这里弹幕的内容我们就可以抓取到了,但是还有一些细节性的东西。

    人气值

    持续抓包一段时间后,我们可以看到有非常多这样长度固定并且一来一回的包。

    分别查看内容如下:

    可以看到上行包长度固定是 16,下行包固定长度是 20,它们头部字段的含义跟之前的分析吻合,同时在下行的包中可以发现其中四字节的字段 0x73E8 就是人气值。

    另外刚才弹幕包中头部为 0x5 的字段这里变成了 0x2 和 0x3,因此猜测应该是消息种类。

    这里头部最后一个字段出现了一个 0x1,暂时不知道什么意思,先放着。

    握手

    现在我们回过头来分析最开始的握手包。

    首先是请求包。

    可以看到跟之前的分析都是吻合的,而且这里消息种类是 0x7 代表客户端请求连接,同时后面的文本信息包含了用户 id(这里我是游客,所以是0)、房间 id、客户端类型和客户端版本等信息。

    然后是返回的包。

    这个包很简单,只要头部,并且其中消息种类 0x8 表示服务器接受连接。

    总结

    可以看出,抓取弹幕的核心是要正确解析头部中的消息种类,目前出现过的种类有:

    • 0x2 客户端请求人气值
    • 0x3 服务端返回人气值
    • 0x5 弹幕消息、礼物等等
    • 0x7 客户端请求连接
    • 0x8 服务端允许连接

    以及头部的结构:

    1
    
    | 帧长度(4) | 头部长度(2) | 未知1(2) | 消息种类(4) | 未知(4) |
    

    虽然还有很多未知的字段,不过按照目前掌握的内容已经足以正常抓取弹幕了。

    站在巨人的肩膀上

    decorator.js

    抓包总是有限制的,当然我们也可以选择分析前端的代码,不过我当时看到 .min 就放弃了:

    不过 Chrome 格式化之后搜索 DANMU_MSG 后还是有点收获的:

    可以看到之前 cmd 的其它取值。

    但是分析这个文件是真的难受,我看了 30min 就放弃了,不知道有没有好的分析办法。

    Bilibili HTML5 Live

    后来我偶然发现了这个脚本:Bilibili HTML5 Live

    它包含了之前我抓包分析的内容,还有一些我没有分析到的内容,总之看这份代码基本上就可以偷懒了(逃

    比如之前提到的消息种类判定代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    function onMessage(evt) {
        var data = evt.data;
        var dataView = new DataView(data, 0);
        var packetLen = dataView.getUint32(packetOffset);
        if (dataView.byteLength >= packetLen) {
            var headerLen = dataView.getInt16(headerOffset);
            var ver = dataView.getInt16(verOffset);
            var op = dataView.getUint32(opOffset);
            var seq = dataView.getUint32(seqOffset);
            switch (op) {
                case 8:
                    this.heartBeat();
                    heartbeatInterval = setInterval(this.heartBeat.bind(this), 30 * 1000);
                    break;
                case 3:
                    if (this._listener) this._listener('online', dataView.getInt32(16));
                    break;
                case 5:
                    var packetView = dataView;
                    var msg = data;
                    var msgBody;
                    for (var offset = 0; offset < msg.byteLength; offset += packetLen) {
                        packetLen = packetView.getUint32(offset);
                        headerLen = packetView.getInt16(offset + headerOffset);
                        msgBody = textDecoder.decode(msg.slice(offset + headerLen, offset + packetLen));
                        if (!msgBody) {
                            textDecoder = getDecoder(false);
                            msgBody = textDecoder.decode(msg.slice(offset + headerLen, offset + packetLen));
                        }
                        if (this._listener) this._listener('msg', msgBody);
                    }
                    break;
            }
        }
    }
    

    此外可以看到之前的“未知1”字段是版本号,“未知2”字段可能是序列编号?这里存疑,不过不影响抓取弹幕。

    小结

    Bilibili 弹幕抓取系列到这里就结束了,这个过程中虽然绕了很多弯路浪费了大把时间,不过我还是学到了不少知识:

    • WebSocket
    • FiddlerScript 编写
    • WireShark 基本使用
    • 抓包分析能力(二进制敏感度?)

    另外感觉计网光过了一遍课本真的不够,用起来总是觉得力不从心,等什么时候闲下来就去做计网实验吧(挖坑)。


    展开全文
  • Python爬虫腾讯视频弹幕(目前可用)
  • Unity实时获取Bilibili直播间弹幕及用户进入数据 只需要提供房间号即可
  • asyncore斗鱼弹幕抓取

    2020-01-09 00:20:32
    斗鱼弹幕抓取 斗鱼api网上开放的。 数据发送和接收流程: 先发送长度,在发送数据,接收数据就是先接收长度,后接收数据。
  • 淘宝直播 [弹幕旺旺采集]
  • B站某视频弹幕抓取

    2021-04-23 12:18:51
    爬虫这东西很实用,意义不下于你学会做PPT和Excel。...抓取链接:忘了,B站随便点开的一个视频;主要思路:1. 这个是做到现在我觉得挺好玩的一个抓取,不是做的爬虫,就直接在chrome查找到xml文件,点击打开位New Ta...
  • Bilibili直播弹幕抓取(2):Fiddler与WireShark转载自:https://ihomura.cn/2018/05/15/Bilibili%E7%9B%B4%E6%92%AD%E5%BC%B9%E5%B9%95%E6%8A%93%E5%8F%96-2-Fiddler%E4%B8%8EWireShark/前言上次提到了 Bilibili 的弹...
  • dy弹幕获取-易语言

    2021-06-13 23:48:55
    调用了E2EE支持库
  • python爬取虎牙弹幕礼物数据查看官方文档找到弹幕传输的方式生成websocket对应的参数第一步:第二步:调通websocket建立链接获取数据和保持心跳附上完整代码注: 查看官方文档 官方文档链接:...
  • 这篇文章主要介绍了Python爬虫爬取Bilibili弹幕过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来思考一个问题,B站一个视频的弹幕最多会有多少? ...
  • 目前互联网直播弹幕主要是两种技术实现。 1websocket消息通信,js拿到消息再处理到dom中,逆向验证流程,和服务端建立连接后即可,逆向难度较低,消息分明文和加密两种情况,前端无秘密,加密也能找到解密的js...
  • 哔哩哔哩直播间弹幕实时获取
  • 背景因为想拿到一些知乎弹幕的数据 以及做一个直播播报机器人,所以最近在研究知乎直播的弹幕分析抓取比较简单,不多说了...都是正常的操作但是 拿到的数据却很奇怪为了演示方便,我们以 rest 接口示范,本质上和 ...
  • 易语言-虎牙抓取弹幕

    2021-06-25 23:47:11
    虎牙抓取弹幕源码
  • 实时获取斗鱼弹幕,包括弹幕类型,用户信息,用户等级等
  • barrage 各直播平台弹幕协议和开放平台API
  • 抓取斗鱼直播弹幕

    千次阅读 2018-03-05 15:33:53
    原文地址:http://blog.csdn.net/bfboys/article/details/52853041前几...→抓取数据的基本思路就是: 抓包 → 分析请求信息 → 模拟发送请求 → 获得数据知乎回答地址:如何获取斗鱼直播间的弹幕信息? - Brucezz ...
  • 弹幕评论是网络直播平台与用户交互的主要方式之一,借助弹幕行为的分析可以更有效地实现对网络直播平台的用户理解.通过采集和利用3大热门直播平台(斗鱼、熊猫与战旗)的弹幕相关数据,本文以假设验证的方式从用户...
  • Bilibili直播弹幕抓取(1):WebSocket

    千次阅读 2018-07-16 14:09:51
    Bilibili直播弹幕抓取(1):WebSocket转载自https://ihomura.cn/2018/05/14/Bilibili%E7%9B%B4%E6%92%AD%E5%BC%B9%E5%B9%95%E6%8A%93%E5%8F%96-1-WebSocket/前言最近有一个学长去分析了B站直播弹幕WebSocket协议,我...
  • 最主要的是我一边看电视剧一边看弹幕弹幕也是增加快乐的一种方式啊。 这里说到弹幕,那么小编作为爬虫工作者,对这个就比较感兴趣了,今天我们就学习下python 爬取腾讯视频评论的实现步骤,帮助大家更好的理解和...
  • 本篇文章给大家讲解一下如何用python3写出爬取B站视频弹幕的功能,有兴趣的读者们参考学习下吧。
  • 可以实现nc窗口与telnet窗口互相通信即可) 三、斗鱼弹幕抓取文档及源码 3.1 Socket编程-asyncore模块基础模板的使用 3.2 斗鱼弹幕抓取实战 一、原理概述及结果展示 1.1 计算机网络基础知识 Socket:在计算机通信...
  • 利用Python实现抓取芒果TV弹幕,废话不多说。 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: requests模块; pandas模块 以及一些Python自带的模块。 环境搭建 安装Python并添加到环境变量,pip安装...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,814
精华内容 725
关键字:

弹幕抓取