x站播放量_web端_逆向+代理(重构)

import re
import time
import uuid
import json
import random
import requests
import blblbf
import requests

class BiliBili(object):
    def __init__(self, aid, cid, proxies):
        self.aid, self.cid = aid, cid
        self.session = requests.Session()
        self.headers = blblbf.headers
        self.session.headers.update(self.headers)
        #self.b_nut, self.buvid3 = self.get_b_nut_buvid3()
        #self.session.cookies.set('b_nut', self.b_nut)
        #self.session.cookies.set('buvid3', self.buvid3)
        self.session.cookies.set('b_lsid', self.get_b_lsid())
        self.session.cookies.set('_uuid', self.get_uuid())
        self.session.cookies.set('CURRENT_FNVAL', "4048")
        self.session.cookies.set('buvid4', self.get_buvid4())
        self.session.cookies.set('sid', self.get_sid())
        self.session.proxies = proxies

    @staticmethod
    def get_video_id_info(exec_url):
        session = requests.Session()
        header = blblbf.headers
        session.headers.update(header)
        
        res = session.get(exec_url)
        res_text = res.text
        str_data = re.search(r'__INITIAL_STATE__=(.+?);\(func',
                            res_text, flags=re.S).groups()[0]
        data_dict = json.loads(str_data)

        aid = data_dict['aid']
        cid = data_dict['videoData']['cid']
        bvid= data_dict['videoData']['bvid']
        view_count = data_dict['videoData']['stat']['viewseo']
        duration = data_dict['videoData']['duration']

        print(f"视频{bvid}平台播放量为:{view_count}")
        return aid, bvid, cid, duration, int(view_count)

    def get_b_lsid(self):
        n = ''
        for i in range(8):
            n += hex(random.randint(1, 16))[2:].upper()
        t = str(hex(int(time.time()) * 1000))[2:].upper()
        n = n + '_' + t
        return n

    def get_uuid(self):
        u = str(uuid.uuid4()).upper()
        u = u + str(int(time.time() * 1000 % 1e5)).rjust(5, '0') + 'infoc'
        return u

    def get_sid(self):
        url = 'https://api.bilibili.com/x/player/v2'
        p = {'aid': self.aid, 'cid': self.cid}
        sid = requests.get(url, params=p, headers=self.headers).cookies.get_dict()["sid"]
        return sid

    def get_buvid4(self):
        url = 'https://api.bilibili.com/x/frontend/finger/spi'
        session = requests.Session()
        session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"})
        res = session.get(url).json()
        buvid4 = res['data']['b_4']
        return buvid4

    def get_b_nut_buvid3(self):
        session = requests.Session()
        session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"})
        session.get(url)
        b_nut = session.cookies.get_dict()['b_nut']
        buvid3 = session.cookies.get_dict()['buvid3']
        return b_nut, buvid3

    def request_h5(self):
        url = 'https://api.bilibili.com/x/click-interface/click/web/h5'
        data = {
            'aid': self.aid,
            'cid': self.cid,
            'part': 1,
            'lv': 0,
            'ftime': str(int(time.time()) - random.randint(100, 500)),
            'stime': str(int(time.time())),
            'type': 3,
            'sub_type': 0,
            'refer_url': '',
            'spmid': '333.788.0.0',
            'from_spmid': '',
            'csrf': '',
        }

        #print(self.session.get("http://httpbin.org/cookies").text)
        res = self.session.post(url, data=data)
        res.close()

def get_tunnel_proxies(url_get_ip):
    req = requests.get(url=url_get_ip).json()
    proxy_ip = req['data'][0]['ip']
    proxy_port = req['data'][0]['port']
    proxy = str(proxy_ip)+':' + str(proxy_port)
    print('调用ip  '+str(proxy))
    proxies = {"http": f'http://{proxy}', "https": f'http://{proxy}'}
    return proxies


def run(url,c,url_get_ip):
    print('视频链接为:'+url)
    aid, bvid, cid, duration, view_count = BiliBili.get_video_id_info(url)
    for i in range(c):
        proxies = get_tunnel_proxies(url_get_ip)
        bili = BiliBili(aid, cid, proxies=proxies)
        bili.request_h5()
        bili.session.close()
        view_count += 1
        print("当前理论播放量为", view_count)
        BiliBili.get_video_id_info(url)
        time.sleep(3*random.random()+3)

if __name__ == '__main__':
    url = 'https://www.bilibili.com/video/BVXXXXXXXXX/'
    c =1
    url_get_ip = '代理api'
    run(url,c,url_get_ip)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值