增加视频点击人数

Tweet | 查看源代码 | 评论

事前唠个叨

终于,这玩意来了。

这次为了长久考虑,不公布全部源码了,不过对b站和ida来说并没有什么卵用。

b站隔一段时间会换key,有能力的自己搞吧。

核心源码如下

# --------------- Click Service -----------------
class Click:
    def __init__(self, aid, cid, mid, lv, pid = '1'):
        self.host = 'http://api.bilibili.com/x'
        self.params = {
            'aid': aid,
            'cid': cid,
            'did': self.generateSSID(),
            'ftime': int(time.time()),
            'lv': lv,
            'mid': mid,
            'part': pid,
            'stime': self.getServerTime()['data']['now']
        }
        self.doPost()

    def getServerTime(self):
        return requests.get(self.host + '/server/now').json()

    def generateSSID(self):
        return md5Hash(str(int(time.time() * 1000) + random.random()))

    def doPost(self):
        self.params['ts'] = int(time.time())
        requests.post(self.host + '/stat/web', data = getSign(self.params, salt))

# -----------------------------------------------


# ---------------- Messenger Part ----------------

class Messenger:
    def __init__(self, mid, cid, duration, aid):
        self.server = 'chat.bilibili.com'
        self.contentID = int(cid)
        self.userID = int(mid[0])
        self.duration = random.randint(duration // 2, duration)
        self.playTime = 0
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        time.sleep(random.randint(1, 30))
        Click(aid, self.contentID, self.userID, mid[1])
        self.connectHandler()

    def reConnect(self, timer):
        self.closeHandler()
        time.sleep(timer)
        self.connectHandler()

    def connectHandler(self):
        handshake = '0101000c%08x%08x' % (self.contentID, self.userID)
        try:
            self.socket.connect((self.server, 88))
            self.socket.send(binascii.a2b_hex(handshake))
        except:
            self.reConnect(5)
            return
        self.sendPackets()

    def closeHandler(self):
        self.socket.close()

    def updateTimer(self):
        self.playTime = time.time() - self.fakeStartTime

    def sendPackets(self):
        self.fakeStartTime = time.time() + random.randint(1, 60)
        self.ticks = 0
        while 1:
            if time.time() > self.fakeStartTime:
                self.updateTimer()
            if self.playTime > self.duration:
                self.closeHandler()
                return
            if self.ticks % 6 == 0:
                try:
                    self.socket.send(binascii.a2b_hex('01020004'))
                except:
                    self.reConnect(2)
                    return
            thisHeartBeat = '01040008%08x' % (self.playTime * 1000)
            try:
                self.socket.send(binascii.a2b_hex(thisHeartBeat))
            except:
                self.reConnect(2)
                return
            self.ticks += 1
            time.sleep(5)

# -----------------------------------------------

用法

这里可以拿到程序,记得要pip install requestspip install futures(需要python2)

~ $ python live_viewer.py -c 12450 -t 500

-h 帮助  
-c av号(放肆!)  
-t 增加的人数  
-d 自定义最大持续时间(秒)

说明一下:这玩意的默认持续时间为视频时间,也就是模拟一个人看完整个视频。假设3分钟的视频,在启动后过3分钟就会掉了。但是分p视频没有办法获取分p的时长,因此分p视频可能会有不可预料的问题,推荐自行指定时间,各位谨慎行事。