使用python编写的爬虫给X站视频增加一个播放量

目录

前言

一、增加播放量的请求分析

1.请求网址:

 2.请求分析:

 3.对cookie分析:

4. 对荷载分析:

二、代码实现

总结拓展


前言

在平时观看X站视频的过程中,一个视频的播放量需要点击播放来增加,而在代码中如何实现播放量的增加呢,本篇文章就带你实现在代码中增加一个播放量。


提示:以下是本篇文章正文内容,下面案例可供参考

一、增加播放量的请求分析

1.请求网址:

video_url = b'aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMXZNNHkxQzdGUS8='

 2.请求分析:

经过多次验证X站中视频播放量增加的请求为h5这个请求,其截图如图:

使用python编写的爬虫给X站视频增加一个播放量_第1张图片

使用python编写的爬虫给X站视频增加一个播放量_第2张图片

 3.对cookie分析:

使用python编写的爬虫给X站视频增加一个播放量_第3张图片

4. 对荷载分析:

使用python编写的爬虫给X站视频增加一个播放量_第4张图片

二、代码实现

代码如下(示例):

python代码:

import os
import re
import time
import json
import datetime

import uuid
import execjs
import shutil
import requests
import subprocess
from loguru import logger
from functools import partial


class generated_parameter():

    def __init__(self, video_url):
        self.video_url = video_url
        self.my_log()

    def my_log(self):
        """
        日志模块
        :return:
        """
        logger.add("logs/{time:YYYY-MM-DD}.log",
                   format="{time:YYYY-MM-DD HH:mm:ss.SSS} |{level:8}| {name} : {module}:{line:4} | - {message} |({file}:{line})",
                   rotation="00:00", compression="zip")
        # 超过七天自动压缩
        logs_dir = "../bilibili/logs"
        for filename in os.listdir(logs_dir):
            filepath = os.path.join(logs_dir, filename)
            if os.path.isfile(filepath):
                creation_time = datetime.datetime.fromtimestamp(os.path.getctime(filepath))
                if (datetime.datetime.now() - creation_time).days > 7:
                    shutil.make_archive(filepath, "zip", logs_dir, filename)
                    os.remove(filepath)

    def get_a(self):
        """
        aid、cid提取
        :return: 包含aid、cid的字典
        """
        url = self.video_url
        headers = {
            "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"
        }
        req = requests.get(url=url, headers=headers)

        data_list = re.findall(r'__INITIAL_STATE__=(.+);\(function', req.text)
        data_dict = json.loads(data_list[0])

        return data_dict

    def gen_uuid(self):
        """
        uuid生成
        """
        uuid_sec = str(uuid.uuid4())
        time_sec = str(int(time.time() * 1000 % 1e5))
        time_sec = time_sec.rjust(5, "0")
        return "{}{}infoc".format(uuid_sec, time_sec)

    def open_js(self, method_names):
        """
        js调用
        :param method_names: 要调用的js方法名
        :return: js调用的结果
        """
        subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
        with open("bili.js", mode="r", encoding="utf-8") as f:
            ex_js = execjs.compile(f.read())
        return ex_js.call(f"{method_names}")

    def get_bt34(self):
        """
        b_nut、buvid3、buvid4三个参数提取
        :return: 包含b_nut、buvid3、buvid4三个的列表
        """
        url = self.video_url
        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"})
        req = session.get(url=url)

        spi_url = 'https://api.bilibili.com/x/frontend/finger/spi'
        spi_rep = session.get(spi_url)

        b_nut = dict(req.cookies)['b_nut']
        buvid3 = dict(req.cookies)['buvid3']
        buvid4 = spi_rep.json()['data']['b_4'].replace('/', '%2F').replace('=', '%3D%3D')

        return [b_nut, buvid3, buvid4]


def post_h5(bvid, buvid4, buvid3, b_nut, b_lsid, my_uuid, buvid_fp, aid, cid, now_time):
    """
    请求h5网址
    """
    url = 'https://api.bilibili.com/x/click-interface/click/web/h5'
    headers = {
        "Referer": f"https://www.bilibili.com/video/{bvid}/",
        "Cookie": f"buvid4={buvid4}; buvid3={buvid3}; b_nut={b_nut}; CURRENT_FNVAL=4048; sid=g6e519i7; b_lsid={b_lsid}; _uuid={my_uuid}; buvid_fp={buvid_fp}",
        "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"
    }
    params = {
        "aid": aid,
        "cid": cid,
        "part": "1",
        "lv": "0",
        "ftime": now_time,
        "stime": now_time,
        "type": "3",
        "sub_type": "0",
        "refer_url": '',
        "spmid": "333.788.0.0",
        "from_spmid": "",
        "csrf": "",
    }
    req = requests.post(url=url, headers=headers, params=params)

    return req


def task(video_url):
    """
    生成参数,调用视频播放量增加的网址
    :return:
    """

    bvid = video_url.rsplit("/")

    if not bvid[-1]:
        bvid = bvid[-2]
    else:
        bvid = bvid[-1]

    gen_par = generated_parameter(video_url)

    data_dict = gen_par.get_a()
    aid = data_dict['aid']
    cid = data_dict['videoData']['cid']
    now_time = int(time.time())

    my_uuid = gen_par.gen_uuid()
    b_lsid = gen_par.open_js("b_lsid")
    buvid_fp = gen_par.open_js("buvid_fp")

    b_nut = gen_par.get_bt34()[0]
    buvid3 = gen_par.get_bt34()[1]
    buvid4 = gen_par.get_bt34()[2]

    post_h5(bvid, buvid4, buvid3, b_nut, b_lsid, my_uuid, buvid_fp, aid, cid, now_time)
    # 运行成功网址写进日志
    logger.info(f"Info 视频网址:{video_url}")


if __name__ == '__main__':
    video_url = ""
    task(video_url)

 js代码:

function b_lsid() {
    function splitDate(e) {
        var t = new Date(e || Date.now())
            , r = t.getDate()
            , n = t.getHours()
            , e = t.getMinutes()
            , t = t.getTime();
        return {
            day: r,
            hour: n,
            minute: e,
            second: Math.floor(t / 1e3),
            millisecond: t
        }
    }

    function hr(e) {
        return Math.ceil(e).toString(16).toUpperCase()
    }

    function s(e, t) {
        var r = "";
        if (e.length < t)
            for (var n = 0; n < t - e.length; n++)
                r += "0";
        return r + e
    }

    function l(e) {
        for (var t = "", r = 0; r < e; r++)
            t += hr(16 * Math.random());
        return s(t, e)
    }

    var e = splitDate()
        , t = hr(e.millisecond)
    return "".concat(l(8), "_").concat(t)

}

function buvid_fp() {
    var e = [
        {
            "key": "userAgent",
            "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
        },
        {
            "key": "webdriver",
            "value": false
        },
        {
            "key": "language",
            "value": "zh-CN"
        },
        {
            "key": "colorDepth",
            "value": 24
        },
        {
            "key": "deviceMemory",
            "value": 8
        },
        {
            "key": "hardwareConcurrency",
            "value": 12
        },
        {
            "key": "screenResolution",
            "value": [
                2048,
                1152
            ]
        },
        {
            "key": "availableScreenResolution",
            "value": [
                2048,
                1112
            ]
        },
        {
            "key": "timezoneOffset",
            "value": -480
        },
        {
            "key": "timezone",
            "value": "Asia/Shanghai"
        },
        {
            "key": "sessionStorage",
            "value": true
        },
        {
            "key": "localStorage",
            "value": true
        },
        {
            "key": "indexedDb",
            "value": true
        },
        {
            "key": "addBehavior",
            "value": false
        },
        {
            "key": "openDatabase",
            "value": true
        },
        {
            "key": "cpuClass",
            "value": "not available"
        },
        {
            "key": "platform",
            "value": "Win32"
        },
        {
            "key": "plugins",
            "value": [
                [
                    "PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "Chrome PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "Chromium PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "Microsoft Edge PDF Viewer",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ],
                [
                    "WebKit built-in PDF",
                    "Portable Document Format",
                    [
                        [
                            "application/pdf",
                            "pdf"
                        ],
                        [
                            "text/pdf",
                            "pdf"
                        ]
                    ]
                ]
            ]
        },
        {
            "key": "canvas",
            "value": [
                "canvas winding:yes",
                "canvas fp:data:image/png;base64,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CCCAQNcJdChAt2W7crPbD/37k1/Vfyw/oetuvRtc+T8nvarvLsvUuEqStW63XxkIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAtxHocIBuUrEQfV1Gaj3ffE/7p2ZaGZ3RJbr9wWWL31NdxpX+7Hve7b84ACCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCDQPQVyEqBnHaJffNobeuiFY7snfZ7v+pJT39Avn8/UlvA8z4+F6RFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoHAFchagx0L0GbE90dO745ItG7Rq+EE6NFKR3gkclZbAu6Fajd1SIQ1K6/DYQYTnmWhxLAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIHHACOQ3QTceVO0fS3LSlpn7jdf31p8elfTwHti8w5obVqvre+PYPjB8x05GzIIPjORQBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBA44ARyHqCbUMYh+u+GLNZnt0494HS74oZ+P3ixzt2SieVcR84NXbFUrokAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggUkkBeAnS7wYxC9B5LN2nlRwdrjMKFhFOEa2lSz79vUf2U4WmunfA8TSgOQwABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACBA18gbwG60WUUoo/60SpV/fuEA588j3c4+oertP7b6RrStj2Pj4KpEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECg+ATyGqDHQvQZkuanRTNj+puav+jotI7loJYCM095UwvStpvuyFkEIQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAs0DeA3S7lCt3tKR1acBX6X8G7NZndkxO41gO8QX+t/8y/dP2dM0Iz/nmIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAkkEOiVAt+vGQvSFkixMTz3CazfqnYmOxjWmu493936wa8KbNH7NcGlUew5VkqxtO5Xn7UnxOQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIdEuBTgvQTTcWols792ltape9uFnvnDK0nai9Wz6wFjdtkfjhf96s/ScPbQfDjrTKc/uVgQACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCQRKBTA3S7fixEv0TS3DafSPmTW7XnM4N5am0IDH58md7/1/Zat8915NyAIwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBA2wKdHqD7y0mrpXv5b7dqzz8Toid7hkMeXq6tF0xq4/HSsp2//QgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAGAl0WoNsa06pGt0r0tz8zmHbusadqsfhx7VaeL3LkTM/ge8ChCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQLcX6NIA3dd35c5ps6W77Ym+/NSIxjUO79ZPbE14kya9EGpnz3NatnfrLwk3jwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAAC2QoURIBui2+3Gj28dqN+c+wOfWZHe3t+Z2tR2Of9b/9l+qclk6VRqda5SNJMR47VqDMQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBDIUKJgA3V93O3ujV2nGtO2a/+ejM7zP4j585rQ3tWBhqntmr/PifrqsHgEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEECkSg4AJ0c2m3Gn3Uj1Zp0b+P1WiVFIhjfpaxTo2a/sN3tf7bE5JcwILzBY6cG/JzcWZFAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEupdAQQbo/iNoM0jvsXSTfvBPO3Xd+o8ckI/s94MX69w/TZWOSHZ77HN+QD50bgoBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBLpSoKAD9LSC9KnfeF2P3XKkDo1UdCVkzq79bqhWX7n8RT11z1kJc1JxnjNkJkIAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRaCxRFgO4vO1aRPk3SHEmj47dTsmWDLrhwsx564diifsiXnPqGfvnrY6VBwdsgOC/qh8riEUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgWASKKkD3UQNB+iWSLFCPjp5vvqeLvlyj+16bXCwPwFvn5ccv069+MVB1Rw8LrNuC8xscOQuK6l5YLAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFCkAkUZoAetk4bpPZe8py98/T0tWDS1YJ+LxeNzpy3WQ7dPlSb5y6TavGAfGAtDAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEDXaDoA/QkYbpflT5N/7+9u3eJOgADOP78ejGhwkUcQiocKmhpOISIajNsaHALagqaGuvmWsOlPyFwDGlqjLoammqKCjujll6QoES4ttAcLHK75+rRj9NNz+/x89z25e52fPkQF9qv4+q9YzG9cvC/OObCUDfaF7txf3YqYnR1pbVoHhF3m2hWX/sjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgX8gsKUC+ka/DZ9MP7v2e+nDnaMxM7sYlx6Ox/TKoYFaLwy9jZvnPsf89YnonfmxHsyjiebWQPfwMAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDYVGDLBvQ//+PfgvrY05GYnNsTJzuj0Xp3OKZ6Y319j3R3fYzbJ77GzokXMXfjSCy3HkTE4yaaR319jmEECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0DeBbRPQ/ya2HtUjTs+34tqdvfEpJuPUq30x3BuP48sj8es71jf7tPr7iFiKl/u/xfMD3+Pym060r+yOZ+cX48nMkljet/eoQQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBiIwLYO6AMR9hACBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKCEgoJc4kyUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIFtAQM8WNp8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESggI6CXOZEkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQyBYQ0LOFzSdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEgICeokzWZIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEsgUE9Gxh8wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECghICAXuJMliRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbAEBPVvYfAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoISCglziTJQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgW0BAzxY2nwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKCAjoJc5kSQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDIFhDQs4XNJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIESAgJ6iTNZkgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSyBQT0bGHzCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCEgIBe4kyWJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFsAQE9W9h8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECghIKCXOJMlCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCBbQEDPFjafAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEoICOglzmRJAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEMgWENCzhc0nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRICAnqJM1mSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLIFBPRsYfMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoISAgF7iTJYkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWwBAT1b2HwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKCEgoJc4kyUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIFtAQM8WNp8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESggI6CXOZEkCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQyBYQ0LOFzSdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBEgICeokzWZIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEsgUE9Gxh8wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECghICAXuJMliRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBbAEBPVvYfAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoISCglziTJQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgW0BAzxY2nwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRKCAjoJc5kSQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDIFhDQs4XNJ0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIESAgJ6iTNZkgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSyBQT0bGHzCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKCEgIBe4kyWJECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFsAQE9W9h8AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECghIKCXOJMlCRAgQIAAl5luwwAAAVhJREFUAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCBbQEDPFjafAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEoICOglzmRJAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEMgWENCzhc0nQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgRICAnqJM1mSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBLIFBPRsYfMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoISAgF7iTJYkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgWwBAT1b2HwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKCEgoJc4kyUJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIFvgJwYnKW33zz8fAAAAAElFTkSuQmCC"
            ]
        },
        {
            "key": "webgl",
            "value": [
                "data:image/png;base64,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",
                "extensions:ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_disjoint_timer_query;EXT_float_blend;EXT_frag_depth;EXT_shader_texture_lod;EXT_texture_compression_bptc;EXT_texture_compression_rgtc;EXT_texture_filter_anisotropic;EXT_sRGB;KHR_parallel_shader_compile;OES_element_index_uint;OES_fbo_render_mipmap;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBGL_multi_draw",
                "webgl aliased line width range:[1, 1]",
                "webgl aliased point size range:[1, 1024]",
                "webgl alpha bits:8",
                "webgl antialiasing:yes",
                "webgl blue bits:8",
                "webgl depth bits:24",
                "webgl green bits:8",
                "webgl max anisotropy:16",
                "webgl max combined texture image units:32",
                "webgl max cube map texture size:16384",
                "webgl max fragment uniform vectors:1024",
                "webgl max render buffer size:16384",
                "webgl max texture image units:16",
                "webgl max texture size:16384",
                "webgl max varying vectors:30",
                "webgl max vertex attribs:16",
                "webgl max vertex texture image units:16",
                "webgl max vertex uniform vectors:4095",
                "webgl max viewport dims:[32767, 32767]",
                "webgl red bits:8",
                "webgl renderer:WebKit WebGL",
                "webgl shading language version:WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)",
                "webgl stencil bits:0",
                "webgl vendor:WebKit",
                "webgl version:WebGL 1.0 (OpenGL ES 2.0 Chromium)",
                "webgl unmasked vendor:Google Inc. (NVIDIA)",
                "webgl unmasked renderer:ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)",
                "webgl vertex shader high float precision:23",
                "webgl vertex shader high float precision rangeMin:127",
                "webgl vertex shader high float precision rangeMax:127",
                "webgl vertex shader medium float precision:23",
                "webgl vertex shader medium float precision rangeMin:127",
                "webgl vertex shader medium float precision rangeMax:127",
                "webgl vertex shader low float precision:23",
                "webgl vertex shader low float precision rangeMin:127",
                "webgl vertex shader low float precision rangeMax:127",
                "webgl fragment shader high float precision:23",
                "webgl fragment shader high float precision rangeMin:127",
                "webgl fragment shader high float precision rangeMax:127",
                "webgl fragment shader medium float precision:23",
                "webgl fragment shader medium float precision rangeMin:127",
                "webgl fragment shader medium float precision rangeMax:127",
                "webgl fragment shader low float precision:23",
                "webgl fragment shader low float precision rangeMin:127",
                "webgl fragment shader low float precision rangeMax:127",
                "webgl vertex shader high int precision:0",
                "webgl vertex shader high int precision rangeMin:31",
                "webgl vertex shader high int precision rangeMax:30",
                "webgl vertex shader medium int precision:0",
                "webgl vertex shader medium int precision rangeMin:31",
                "webgl vertex shader medium int precision rangeMax:30",
                "webgl vertex shader low int precision:0",
                "webgl vertex shader low int precision rangeMin:31",
                "webgl vertex shader low int precision rangeMax:30",
                "webgl fragment shader high int precision:0",
                "webgl fragment shader high int precision rangeMin:31",
                "webgl fragment shader high int precision rangeMax:30",
                "webgl fragment shader medium int precision:0",
                "webgl fragment shader medium int precision rangeMin:31",
                "webgl fragment shader medium int precision rangeMax:30",
                "webgl fragment shader low int precision:0",
                "webgl fragment shader low int precision rangeMin:31",
                "webgl fragment shader low int precision rangeMax:30"
            ]
        },
        {
            "key": "webglVendorAndRenderer",
            "value": "Google Inc. (NVIDIA)~ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 Ti Direct3D11 vs_5_0 ps_5_0, D3D11)"
        },
        {
            "key": "hasLiedLanguages",
            "value": false
        },
        {
            "key": "hasLiedResolution",
            "value": false
        },
        {
            "key": "hasLiedOs",
            "value": false
        },
        {
            "key": "hasLiedBrowser",
            "value": false
        },
        {
            "key": "touchSupport",
            "value": [
                0,
                false,
                false
            ]
        },
        {
            "key": "fonts",
            "value": [
                "Arial",
                "Arial Black",
                "Arial Narrow",
                "Book Antiqua",
                "Bookman Old Style",
                "Calibri",
                "Cambria",
                "Cambria Math",
                "Century",
                "Century Gothic",
                "Century Schoolbook",
                "Comic Sans MS",
                "Consolas",
                "Courier",
                "Courier New",
                "Georgia",
                "Helvetica",
                "Impact",
                "Lucida Bright",
                "Lucida Calligraphy",
                "Lucida Console",
                "Lucida Fax",
                "Lucida Handwriting",
                "Lucida Sans",
                "Lucida Sans Typewriter",
                "Lucida Sans Unicode",
                "Microsoft Sans Serif",
                "Monotype Corsiva",
                "MS Gothic",
                "MS PGothic",
                "MS Reference Sans Serif",
                "MS Sans Serif",
                "MS Serif",
                "Palatino Linotype",
                "Segoe Print",
                "Segoe Script",
                "Segoe UI",
                "Segoe UI Light",
                "Segoe UI Semibold",
                "Segoe UI Symbol",
                "Tahoma",
                "Times",
                "Times New Roman",
                "Trebuchet MS",
                "Verdana",
                "Wingdings",
                "Wingdings 2",
                "Wingdings 3"
            ]
        },
        {
            "key": "audio",
            "value": "124.04347527516074"
        }
    ]

    var t = e.map(function (e) {
        return e.value
    }).join("")

    var g = function (e, t) {
        e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]],
            t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]];
        var r = [0, 0, 0, 0];
        return r[3] += e[3] * t[3],
            r[2] += r[3] >>> 16,
            r[3] &= 65535,
            r[2] += e[2] * t[3],
            r[1] += r[2] >>> 16,
            r[2] &= 65535,
            r[2] += e[3] * t[2],
            r[1] += r[2] >>> 16,
            r[2] &= 65535,
            r[1] += e[1] * t[3],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[1] += e[2] * t[2],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[1] += e[3] * t[1],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[0] += e[0] * t[3] + e[1] * t[2] + e[2] * t[1] + e[3] * t[0],
            r[0] &= 65535,
            [r[0] << 16 | r[1], r[2] << 16 | r[3]]
    }
        , v = function (e, t) {
        return [e[0] ^ t[0], e[1] ^ t[1]]
    }
        , e = {
        preprocessor: null,
        audio: {
            timeout: 1e3,
            excludeIOS11: !0
        },
        fonts: {
            swfContainerId: "fingerprintjs2",
            swfPath: "flash/compiled/FontList.swf",
            userDefinedFonts: [],
            extendedJsFonts: !1
        },
        screen: {
            detectScreenOrientation: !0
        },
        plugins: {
            sortPluginsFor: [/palemoon/i],
            excludeIE: !1
        },
        extraComponents: [],
        excludes: {
            enumerateDevices: !0,
            pixelRatio: !0,
            doNotTrack: !0,
            fontsFlash: !0,
            adBlock: !0
        },
        NOT_AVAILABLE: "not available",
        ERROR: "error",
        EXCLUDED: "excluded"
    }
        , m = function (e, t) {
        if (Array.prototype.forEach && e.forEach === Array.prototype.forEach)
            e.forEach(t);
        else if (e.length === +e.length)
            for (var r = 0, n = e.length; r < n; r++)
                t(e[r], r, e);
        else
            for (var o in e)
                e.hasOwnProperty(o) && t(e[o], o, e)
    }
        , i = function (e) {
        for (var t = !1, r = 0, n = e.plugins.sortPluginsFor.length; r < n; r++) {
            var o = e.plugins.sortPluginsFor[r];
            if (navigator.userAgent.match(o)) {
                t = !0;
                break
            }
        }
        return t
    }
        , a = function () {
        var e = document.createElement("canvas");
        return !(!e.getContext || !e.getContext("2d"))
    }
        , f = function (e) {
        var t = document.createElement("div");
        t.setAttribute("id", e.fonts.swfContainerId),
            document.body.appendChild(t)
    }
        , y = function () {
        var e = document.createElement("canvas")
            , t = null;
        try {
            t = e.getContext("webgl") || e.getContext("experimental-webgl")
        } catch (e) {
        }
        return t = t || null
    }
        , b = function (e) {
        e = e.getExtension("WEBGL_lose_context");
        null != e && e.loseContext()
    }

    function d(e, t) {
        return 32 === (t %= 64) ? [e[1], e[0]] : t < 32 ? [e[0] << t | e[1] >>> 32 - t, e[1] << t | e[0] >>> 32 - t] : [e[1] << (t -= 32) | e[0] >>> 32 - t, e[0] << t | e[1] >>> 32 - t]
    }

    function l(e, t) {
        e = [e[0] >>> 16, 65535 & e[0], e[1] >>> 16, 65535 & e[1]],
            t = [t[0] >>> 16, 65535 & t[0], t[1] >>> 16, 65535 & t[1]];
        var r = [0, 0, 0, 0];
        return r[3] += e[3] + t[3],
            r[2] += r[3] >>> 16,
            r[3] &= 65535,
            r[2] += e[2] + t[2],
            r[1] += r[2] >>> 16,
            r[2] &= 65535,
            r[1] += e[1] + t[1],
            r[0] += r[1] >>> 16,
            r[1] &= 65535,
            r[0] += e[0] + t[0],
            r[0] &= 65535,
            [r[0] << 16 | r[1], r[2] << 16 | r[3]]
    }

    function p(e, t) {
        return 0 === (t %= 64) ? e : t < 32 ? [e[0] << t | e[1] >>> 32 - t, e[1] << t] : [e[1] << t - 32, 0]
    }

    function h(e) {
        return e = v(e, [0, e[0] >>> 1]),
            e = g(e, [4283543511, 3981806797]),
            e = v(e, [0, e[0] >>> 1]),
            e = g(e, [3301882366, 444984403]),
            e = v(e, [0, e[0] >>> 1])
    }

    function s(e, t) {
        for (var r = (e = e || "").length % 16, n = e.length - r, o = [0, t = t || 0], i = [0, t], a = [0, 0], s = [0, 0], u = [2277735313, 289559509], c = [1291169091, 658871167], f = 0; f < n; f += 16)
            a = [255 & e.charCodeAt(f + 4) | (255 & e.charCodeAt(f + 5)) << 8 | (255 & e.charCodeAt(f + 6)) << 16 | (255 & e.charCodeAt(f + 7)) << 24, 255 & e.charCodeAt(f) | (255 & e.charCodeAt(f + 1)) << 8 | (255 & e.charCodeAt(f + 2)) << 16 | (255 & e.charCodeAt(f + 3)) << 24],
                s = [255 & e.charCodeAt(f + 12) | (255 & e.charCodeAt(f + 13)) << 8 | (255 & e.charCodeAt(f + 14)) << 16 | (255 & e.charCodeAt(f + 15)) << 24, 255 & e.charCodeAt(f + 8) | (255 & e.charCodeAt(f + 9)) << 8 | (255 & e.charCodeAt(f + 10)) << 16 | (255 & e.charCodeAt(f + 11)) << 24],
                a = g(a, u),
                a = d(a, 31),
                a = g(a, c),
                o = v(o, a),
                o = d(o, 27),
                o = l(o, i),
                o = l(g(o, [0, 5]), [0, 1390208809]),
                s = g(s, c),
                s = d(s, 33),
                s = g(s, u),
                i = v(i, s),
                i = d(i, 31),
                i = l(i, o),
                i = l(g(i, [0, 5]), [0, 944331445]);
        switch (a = [0, 0],
            s = [0, 0],
            r) {
            case 15:
                s = v(s, p([0, e.charCodeAt(f + 14)], 48));
            case 14:
                s = v(s, p([0, e.charCodeAt(f + 13)], 40));
            case 13:
                s = v(s, p([0, e.charCodeAt(f + 12)], 32));
            case 12:
                s = v(s, p([0, e.charCodeAt(f + 11)], 24));
            case 11:
                s = v(s, p([0, e.charCodeAt(f + 10)], 16));
            case 10:
                s = v(s, p([0, e.charCodeAt(f + 9)], 8));
            case 9:
                s = v(s, [0, e.charCodeAt(f + 8)]),
                    s = g(s, c),
                    s = d(s, 33),
                    s = g(s, u),
                    i = v(i, s);
            case 8:
                a = v(a, p([0, e.charCodeAt(f + 7)], 56));
            case 7:
                a = v(a, p([0, e.charCodeAt(f + 6)], 48));
            case 6:
                a = v(a, p([0, e.charCodeAt(f + 5)], 40));
            case 5:
                a = v(a, p([0, e.charCodeAt(f + 4)], 32));
            case 4:
                a = v(a, p([0, e.charCodeAt(f + 3)], 24));
            case 3:
                a = v(a, p([0, e.charCodeAt(f + 2)], 16));
            case 2:
                a = v(a, p([0, e.charCodeAt(f + 1)], 8));
            case 1:
                a = v(a, [0, e.charCodeAt(f)]),
                    a = g(a, u),
                    a = d(a, 31),
                    a = g(a, c),
                    o = v(o, a)
        }
        return o = v(o, [0, e.length]),
            i = v(i, [0, e.length]),
            o = l(o, i),
            i = l(i, o),
            o = h(o),
            i = h(i),
            o = l(o, i),
            i = l(i, o),
        ("00000000" + (o[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (o[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (i[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (i[1] >>> 0).toString(16)).slice(-8)
    }

    return s(t, 31)
}

总结拓展

1.总结

cookie中的参数uuid使用第三方库生成,b_lsid、buvid_fp使用js生成。在程序运行的过程中运行的运行过网址会保存在日志中,超过七天的日志则自动打包压缩。

2.拓展

本文只增加了视频的播放量,与之相应的还有完播率,完播率的请求为heartbeat请求实现。

要给一个视频增加多个播放量需要使用代理ip实现,同一个ip只能给一个视频增加极少的播放量。

3.源码下载

码云:bilibili: bilibili播放量增加爬虫

你可能感兴趣的:(爬虫,python,开发语言)