钉钉录播抓取视频

news2024/11/25 14:37:18

爬取钉钉视频

免责声明

此脚本仅供学习参考,切勿违法使用下载他人资源进行售卖,本人不但任何责任!

仓库地址:

  • GItee 源码仓库

执行顺序

  • poxyM3u8开启代理
  • getM3u8url用于获取m3u8文件
  • userAgent随机请求头
  • downVideo|downVideoThreadTqdm单线程下载和多线程下载,二选一即可

启动顺序:poxyM3u8开启代理 -> getM3u8url获取文件->downVideo遍历文件进行下载

像这样别人给的钉钉链接我想要它的视频, 但是又没有下载按钮,我该怎么办呢?
请添加图片描述
我想到了用爬虫爬取

方案一

检查了一下网络请求发现它是采用m3u8文件格式保存的,所以找m3u8的文件。

找到了

请添加图片描述

  • 对它写代码进行保存:

    with open("4f8122f4-f8fb-43d5-b8c8-7c1c9a4a70f7_normal.m3u8", "r", encoding="utf-8") as f:
         centen = f.read()
    print(centen)
    pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/[\d]+\.ts\?auth_key=[\d\w-]+)'
    matches = re.findall(pattern, centen)
    print(matches)
    #
    urls = []
    for match in matches:
        url = "https://dtliving-bj.dingtalk.com/live_hp/" + match
        urls.append(url)
    #
    print(len(urls))
    # for i in urls:
    #     print(i)
    
    for item in tqdm(urls,disable="下载"):
        response = requests.get(item)
        with open("E:/a.mp4", "ab", ) as f:
            f.write(response.content)
    

    下载是下载下来了, 可是我有很多很多集,我自己下载是不是太麻烦了,也累。所以我就分析了一下这个地址

    发现:

    m3u8:
    	https://dtliving-sz.dingtalk.com/live_hp/8618428f-dc2e-419e-bc6b-b93a6ee6b28c_normal.m3u8?auth_key=1730544823-fb9347e4a68a456b8b265afa36700f15-0-f24f0b45c72dd6547dadf77466f68ce4
    
    url:
    	https://n.dingtalk.com/dingding/live-room/index.html?roomId=ZxaInSr3io8j9iZf&liveUuid=8618428f-dc2e-419e-bc6b-b93a6ee6b28c
    
    8618428f-dc2e-419e-bc6b-b93a6ee6b28c_normal.m3u8,其中8618428f-dc2e-419e-bc6b-b93a6ee6b28c是Uuid
    
    

    既然:8618428f-dc2e-419e-bc6b-b93a6ee6b28c是房间号的话那我把好多集的房间号爬下来然后拼接到dtliving-sz.dingtalk.com/live_hp/房间号_normal.m3u8这样不就行了?

    然后拼接好我就发了一个请求发现并不能下载下来

    请添加图片描述

    		原因是`auth_key`的原因, 然后我尝试寻找`auth_key`
    

请添加图片描述

emmm, 找了许久,打扰了。还是能力不够, 所以打算换一个方式。

方案二

我发现浏览器是可以获取到auth_key的那我不如我去拿浏览器的响应值。

相当于做了一件中间人的方式把我想要的东西抓取出来。

我使用了mitmproxy当我的代理

pip install mitmproxy

然后写一段代码来捕捉我想要抓取的url的响应

from mitmproxy import ctx,http
# http://mitm.it/ 证书
# mitmdump.exe -s .\test5.py
# mitmweb
import re
import requests

def request(flow):
    # 获取请求对象
    request = flow.request
    # 实例化输出类
    math = re.match("^(.*?)_normal.m3u8", request.url)
    if math:
        info = ctx.log.info
        # 打印请求的url
        info("请求地址: " + request.url + "\n")
        string = request.url
        start_index = string.find("auth_key=") + len("auth_key=")
        end_index = len(string)
        result = string[start_index:end_index]
        print(result)

        info("请求体: " + request.text + "\n")
        # # 打印请求方法
        info("请求方法: " + request.method)

def response(flow):
    m3u8math = re.match("^(.*?)_normal.m3u8", flow.request.url)
    if m3u8math:
        print("===============这是m3u8格式的文件响应============================")
        centen = flow.response.get_text()
        with open("./m3u8s/{0}.m3u8".format(title), "w") as f:
            f.write(centen)
        print("===============结束============================")

代码写好了,然后打开本机代理改成mitmproxy的代理然后安装证书,之后就可以愉快的抓请求了

1、代码启动

请添加图片描述

2、代理设置:

请添加图片描述

3、证书安装:

  • 设置好系统代理后,浏览器输入http://mitm.it/, 然后选择对应系统的证书安装就行。

请添加图片描述

4、抓取

  • 当我使用浏览器打开https://n.dingtalk.com/dingding/live-room/index.html?roomId=AAToXdFAVGArvaQx&liveUuid=9aac3549-698f-46b9-9bb0-f2f44d4faaca的时候它就会帮我把特定m3u8的请求响应做文件保存
from mitmproxy import ctx,http
# http://mitm.it/ 证书
# mitmdump.exe -s .\xiaoyuan.py
# mitmweb
import re
import requests
def response(flow):

    titlesearch = re.search(r"roomId=(.*?)&liveUuid=(.*)", flow.request.url)
    if titlesearch:
        global roomIdAndUid
        roomIdAndUid = titlesearch
        centent = flow.response.get_content().decode('utf-8')
        titleRe = re.search(r'<meta property="og:title" content="(.*?)">',centent)
        global title
        title = titleRe.group(1)
        print(title)
    else:
        m3u8math = re.match(r"^(.*)/(.*?)_normal.m3u8", flow.request.url)
        if m3u8math:
            print("===============这是m3u8格式的文件响应============================")
            print("房间号:", roomIdAndUid.group(2), "========", roomIdAndUid.group(1))
            centen = flow.response.get_text()
            try:
                with open("./杰哥数学m3u8/{0}.m3u8".format(title), "w") as f:
                    f.write(centen)
            except OSError:
                with open("./log.txt".format(title), "a") as f:
                    f.write("标题: {0}, roomId:{1}, UuId: {2}, url:https://n.dingtalk.com/dingding/live-room/index.html?roomId={3}&liveUuid={4}\n".
                                                                            format(title,
                                                                                roomIdAndUid.group(1),
                                                                                 roomIdAndUid.group(2),
                                                                                 roomIdAndUid.group(1),
                                                                                 roomIdAndUid.group(2),
                                                                                 ))
            print("===============结束============================")

请添加图片描述

可是我有很多个链接

请添加图片描述

所以我打算使用webdriver帮我做批量的链接请求, 而且这个必须要登录才能播放而webdriver会打断我的登录状态,为了保存我的登录状态所以我直接调试本机的chrome。

1、关闭chrome浏览器

2、终端输入

chrome.exe --remote-debugging-port=9222

3、确认是登录状态后,执行代码

import time
from selenium import webdriver
from selenium import webdriver

options = webdriver.ChromeOptions()
options.set_headless()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome("chromedriver-win64/chromedriver-win64/chromedriver.exe",chrome_options=options)
driver.get('https://n.dingtalk.com/dingding/live-room/index.html?roomId=AAToXdFAVGArvaQx&liveUuid=9aac3549-698f-46b9-9bb0-f2f44d4faaca')

这段代码一执行马上就把这个m3u8文件下载下来了

请添加图片描述

接下来执行多个url把他们m3u8都下载下来,我只需要把它们都打开然后进行代理检测到就会帮我们下载m3u8文件

import time

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.set_headless()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome("chromedriver-win64/chromedriver-win64/chromedriver.exe",chrome_options=options)
driver.implicitly_wait(10)

def newTable(urls, i):
    if len(urls) > i:
        window_handles = driver.window_handles
        # 切换到新标签页
        print(window_handles)
        new_tab = window_handles[-1]
        driver.switch_to.window(new_tab)
        driver.get(urls[i])
        login_btn = WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located((By.ID, "live-room")))
        if login_btn:
            time.sleep(5)
            i += 1
            print(i)
            newTable(urls, i)

with open("钉钉1.txt", "r", encoding="utf-8") as f:
    urls = f.readlines()
    driver.get(urls[0])
    time.sleep(5)
    newTable(urls, 1)

然后再对m3u8文件进行遍历下载

import re
import requests
import os
import tqdm
requests.packages.urllib3.disable_warnings()

with open("m3u8/af941a57-92ad-487f-a2a1-a4682f07afc4_normal.m3u8", "r", encoding="utf-8") as file:
    content = file.read()

# fileName = os.path.basename(file_path).split(".")[0]
# print(f"文件 {os.path.basename(file_path)} 的内容为:{content}")
pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/[\d]+\.ts\?auth_key=[\d\w-]+)'
matches = re.findall(pattern, content)

m3u8Url = ["https://dtliving-sz.dingtalk.com/live_hp/", "https://dtliving-sh.dingtalk.com/live_hp/"]

def getStatusUrl():
    for status in m3u8Url:
        url = status + matches[0]
        responseStatus = requests.get(url, verify=False)
        print(status, responseStatus.status_code)
        if responseStatus.status_code == 200:
            return status
def getMp4Url():
    urls = []
    status = getStatusUrl()
    for match in matches:
        url = status+match
        urls.append(url)
    return urls


def run():
    urls = getMp4Url()
    for item in tqdm.tqdm(urls):
        response = requests.get(item, verify=False)
        if response.status_code == 200:
            # with open("/disk/data/杰哥数学/{0}.mp4".format("习题课1"), "ab", ) as f:
            with open(r"E:\杰哥数学\{0}.mp4".format("习题课1"), "ab", ) as f:
                f.write(response.content)

run()

这样就可以下载文件了

总结

流程分析

由于解密困难,所以采用mitmproxy进行代理实现直接抓取视频需要请求的m3u8格式的文件,然后进行保存

  • 启动代理
  • 模拟浏览器访问视频地址
  • 下载所有m3u8的文件
  • 对m3u8文件进行清洗
  • 拼装ts片段视频的地址
  • 保存视频

完整代码

1、启动代理

poxyM3u8.py

from mitmproxy import ctx,http
# http://mitm.it/ 证书
# mitmdump.exe -s .\xiaoyuan.py
# mitmweb
import re
import requests

def setM3u8Status():
    """1 表示下载好了 """
    with open("m3u8Status.txt", "w") as f:
        f.write("0")


def response(flow):
    titlesearch = re.search(r"roomId=(.*?)&liveUuid=(.*)", flow.request.url)
    if titlesearch:
        global roomIdAndUid
        roomIdAndUid = titlesearch
        centent = flow.response.get_content().decode('utf-8')
        titleRe = re.search(r'<meta property="og:title" content="(.*?)">',centent)
        global title
        title = titleRe.group(1)
        print(title)
    else:
        m3u8math = re.match(r"^(.*)/(.*?)_normal.m3u8", flow.request.url)
        if m3u8math:
            print("===============这是m3u8格式的文件响应============================")
            print("房间号:", roomIdAndUid.group(2), "========", roomIdAndUid.group(1))
            centen = flow.response.get_text()
            try:
                with open(r"./m3u8/{0}.m3u8".format(title.replace("/", "-")).replace("\t", " "), "w") as f:
                    f.write(centen)
                setM3u8Status()
            except OSError as e:
                print("==================================错误====================================")
                print(e)
                print("==================================错误====================================")
                with open("./log.txt".format(title), "a") as f:
                    f.write("标题: {0}, roomId:{1}, UuId: {2}, url:https://n.dingtalk.com/dingding/live-room/index.html?roomId={3}&liveUuid={4}\n".
                                                                            format(title,
                                                                                roomIdAndUid.group(1),
                                                                                 roomIdAndUid.group(2),
                                                                                 roomIdAndUid.group(1),
                                                                                 roomIdAndUid.group(2),
                                                                                 ))
            print("===============结束============================")

2、模拟浏览器进行请求

getM3u8.py

import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.set_headless()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome("../chromedriver-win64/chromedriver-win64/chromedriver.exe", chrome_options=options)
driver.implicitly_wait(10)

def newTable(urls, i):
    if len(urls) > i:
        window_handles = driver.window_handles
        # 切换到新标签页
        print(window_handles)
        new_tab = window_handles[-1]
        driver.switch_to.window(new_tab)
        setM3u8Status()
        driver.get(urls[i])
        while getM3u8FileStatus():
            time.sleep(5)
        i += 1
        print(i)
        newTable(urls, i)
        # login_btn = WebDriverWait(driver, 10, 0.5).until(EC.visibility_of_element_located((By.ID, "live-room")))
        # if login_btn:
        #     time.sleep(5)
        #     i += 1
        #     print(i)
        #     newTable(urls, i)



def getM3u8FileStatus():
    with open("m3u8Status.txt", "r", encoding="utf-8") as f:
        status = f.read()
    time.sleep(2)
    return "1" == status

def setM3u8Status():
    """0 表示新的请求等待 """
    with open("m3u8Status.txt", "w") as f:
        f.write("1")
    time.sleep(2)

with open("钉钉1.txt", "r", encoding="utf-8") as f:
    urls = f.readlines()
    driver.get(urls[0])
    while getM3u8FileStatus():
        time.sleep(5)
    newTable(urls, 1)

3、最后下载文件

我发现m3u8里面的ts请求不止一个域名

有两个,用错了域名会报404状态码
m3u8Url = ["https://dtliving-sz.dingtalk.com/live_hp/", "https://dtliving-sh.dingtalk.com/live_hp/"]

userAgent 随机请求头

import random
import string

browsers = ["Chrome", "Firefox", "Safari", "Edge", "Opera"]
operating_systems = ["Windows NT", "Macintosh", "Linux", "iPhone", "iPad", "Android"]
versions = [str(i) for i in range(80, 130)]

def generate_random_string(length):
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

def generate_user_agents(num):
    user_agents = []
    for _ in range(num):
        browser = random.choice(browsers)
        os = random.choice(operating_systems)
        version = random.choice(versions)
        if os == "Windows NT":
            ua = f"Mozilla/5.0 ({os}; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) {browser}/{version} Safari/537.36"
        elif os == "Macintosh":
            ua = f"Mozilla/5.0 ({os}; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) {browser}/{version} Safari/537.36"
        elif os == "Linux":
            ua = f"Mozilla/5.0 ({os}; x86_64) AppleWebKit/537.36 (KHTML, like Gecko) {browser}/{version} Safari/537.36"
        elif os == "iPhone":
            ua = f"Mozilla/5.0 (iPhone; CPU iPhone OS {generate_random_string(2)}_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/{version} Mobile/15E148 Safari/604.1"
        elif os == "iPad":
            ua = f"Mozilla/5.0 (iPad; CPU OS {generate_random_string(2)}_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/{version} Mobile/15E148 Safari/604.1"
        elif os == "Android":
            ua = f"Mozilla/5.0 (Linux; Android {generate_random_string(2)}; {generate_random_string(10)}) AppleWebKit/537.36 (KHTML, like Gecko) {browser}/{version} Mobile Safari/537.36"
        user_agents.append(ua)
    return user_agents

# print(random.choice(generate_user_agents(100)))

downVideo.py

import os
import time
import requests
import re
from tqdm import tqdm
requests.packages.urllib3.disable_warnings()
import glob



folder_path = 'm3u8'
# 获取文件列表并添加进度条
file_paths = list(tqdm(glob.glob(folder_path + '/**/*', recursive=True), desc="获取文件列表进度"))

m3u8Url = ["https://dtliving-sz.dingtalk.com/live_hp/", "https://dtliving-sh.dingtalk.com/live_hp/"]

def getStatusUrl():
    for status in m3u8Url:
        url = status + matches[0]
        responseStatus = requests.get(url, verify=False)
        print(status, responseStatus.status_code)
        if responseStatus.status_code == 200:
            return status

def getMp4Url():
    urls = []
    status = getStatusUrl()
    for match in matches:
        url = status+match
        urls.append(url)
    return urls

for file_path in file_paths:
    if os.path.isfile(file_path):
        with open(file_path, 'r', encoding="utf-8") as file:
            content = file.read()
            fileName = os.path.basename(file_path).split(".")[0]
            # print(f"文件 {os.path.basename(file_path)} 的内容为:{content}")
            pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/[\d]+\.ts\?auth_key=[\d\w-]+)'
            matches = re.findall(pattern, content)
            urls = getMp4Url()
            # 处理每个文件中的链接列表并添加进度条
            for item in tqdm(urls, desc=f"处理 {fileName} 文件内链接进度"):
                response = requests.get(item, verify=False)
                time.sleep(2)
                # with open("/disk/data/杰哥数学/{0}.mp4".format(fileName), "ab", ) as f:
                with open(r"E:\杰哥数学\{0}.mp4".format(fileName), "ab", ) as f:
                    f.write(response.content)


也可以是多线程这样下载更快

import os
import time
import requests
import re
from tqdm import tqdm
import glob
import concurrent.futures

requests.packages.urllib3.disable_warnings()

folder_path = 'm3u8'
# 获取文件列表并添加进度条
file_paths = list(tqdm(glob.glob(folder_path + '/**/*', recursive=True), desc="获取文件列表进度"))

m3u8Url = ["https://dtliving-sz.dingtalk.com/live_hp/", "https://dtliving-sh.dingtalk.com/live_hp/"]


def getStatusUrl(matches):
    for status in m3u8Url:
        url = status + matches[0]
        responseStatus = requests.get(url, verify=False)
        print(status, responseStatus.status_code)
        if responseStatus.status_code == 200:
            return status


def getMp4Url(matches):
    urls = []
    status = getStatusUrl(matches)
    for match in matches:
        url = str(status) + str(match)
        urls.append(url)
    return urls


def process_file(file_path):
    if os.path.isfile(file_path):
        with open(file_path, 'r', encoding="utf-8") as file:
            content = file.read()
            fileName = os.path.basename(file_path).split(".")[0]
            pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\/[\d]+\.ts\?auth_key=[\d\w-]+)'
            matches = re.findall(pattern, content)
            urls = getMp4Url(matches)
            # 处理每个文件中的链接列表并添加进度条
            for item in tqdm(urls, desc=f"处理 {fileName} 文件内链接进度"):
                response = requests.get(item, verify=False)
                time.sleep(2)
                # with open(r"E:\杰哥数学\{0}.mp4".format(fileName), "ab", ) as f:
                with open("/disk/data/杰哥数学/{0}.mp4".format(fileName), "ab", ) as f:
                    f.write(response.content)


# 创建线程池
with concurrent.futures.ThreadPoolExecutor() as executor:
    # 提交每个文件的处理任务到线程池
    futures = [executor.submit(process_file, file_path) for file_path in file_paths]

    # 等待所有任务完成
    for future in concurrent.futures.as_completed(futures):
        try:
            future.result()
        except Exception as e:
            print(f"处理文件时出现错误: {e}")

效果

请添加图片描述

注意事项

  • 不要忘记开系统代理
  • chrome浏览器需要全部关闭才可以chrome.exe --remote-debugging-port=9222这个命令,不然selenium会没反应
  • 不要忘记安装证书
    • 要是下载请求失败的话,请注意访问的频率、更换请求头和IP

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

荣耀MagicOS 9.0发布会及开发者大会丨一图读懂应用服务及商业合作分论坛

更多优质流量变现服务&#xff0c;可点击荣耀广告变现服务查看&#xff1b; 荣耀远航计划——应用市场【耀闪行动】全新上线&#xff0c;更多激励及资源扶持可点击荣耀应用市场耀闪行动查看。

Zookeeper实战 集群环境部署

1、概述 今天我们来学习一下Zookeeper集群相关的内容&#xff0c;本文主要的内容有集群环境的搭建&#xff0c;集群常见的问题和对应的解决方案。 2、集群环境搭建 2.1、准备工作 首先我们准备好安装包&#xff0c;创建好集群部署的路径。将解压后的安装文件复制三分。这里…

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中&#xff0c;水轮机组油压自动化控制系统&#xff0c;不仅直接关系到水轮发电机组的安全稳定运行&#xff0c;还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统&#xff0c;适用于水轮发电机组调速器油压及主阀&#xff08;蝶…

【功能安全】 独立于环境的安全要素SEooC

目录 01 SEooC定义 02 SEooC开发步骤 03 SEooC开发示例 04 SEooC问答 01 SEooC定义 缩写: SEooC:Safety Element out of Context独立于环境的安全要素 SEooC出处:GB/T34590.10—2022,第9章节 SEooC与相关项什么关系? SEooC可以是系统、系统组合、子系统、软件组件、…

【Unity】游戏UI中添加粒子特效导致穿层问题的解决

这里介绍一下简易的ui系统中&#xff0c;添加粒子特效导致的穿层问题 首先是在ui界面中添加粒子特效预制体&#xff0c;这个时候&#xff0c;控制这个粒子显示层级的有两个方面 上图中&#xff0c;如果你的Sorting Layer ID的值&#xff08;Layer排序&#xff09;是大于当前C…

安康旅游指南:基于SpringBoot的网站开发实践

第一章 绪论 1.1 研究现状 时代的发展&#xff0c;我们迎来了数字化信息时代&#xff0c;它正在渐渐的改变着人们的工作、学习以及娱乐方式。计算机网络&#xff0c;Internet扮演着越来越重要的角色&#xff0c;人们已经离不开网络了&#xff0c;大量的图片、文字、视频冲击着我…

可视化大屏的C位放啥(04):园区鸟瞰图,方寸之间显示海量数据

在可视化大屏的 C 位放置园区鸟瞰图&#xff0c;可谓独具匠心。 鸟瞰图以宏观视角呈现整个园区风貌&#xff0c;让人一眼便对园区布局有清晰认知。同时&#xff0c;通过巧妙的设计&#xff0c;可在这方寸之间展示海量数据。 如园区内各企业的生产数据、能耗情况、人员流动等信…

【学习笔记】强化学习

李宏毅深度强化学习 笔记 课程主页&#xff1a;NTU-MLDS18 视频&#xff1a;youtube B站 参考资料&#xff1a; 作业代码参考 纯numpy实现非Deep的RL算法 OpenAI tutorial 文章目录 李宏毅深度强化学习 笔记1. Introduction2. Policy Gradient2.1 Origin Policy Gradient2.2…

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…

【问题解决】Flink在linux上运行成功但是无法访问webUI界面

一&#xff0c;问题 在搭建Flink的时候&#xff0c;已经在linux服务器上运行了./start-cluster.sh&#xff0c; 而且日志显示已经成功了。 服务器上也没有开启防火墙 正常来说应该能通过ip:8081来访问(8081是Flink WebUI的默认端口)&#xff0c;但是访问的时候&#xff0c;显示…

Redis未授权访问及配合SSRF总结

Redis是一个开源的内存数据库&#xff0c;它用于存储数据&#xff0c;并提供高性能、可扩展性和丰富的数据结构支持。 Redis复现文章较全 Redisssrf漏洞利用探测内网 RedisInsight/RedisDesktopManager可视化连接工具 漏洞原理 &#xff08;1&#xff09;redis绑定在 0.0.…

C++类与对象四

C类与对象&#xff08;四&#xff09; 上期我们介绍了构造函数和析构函数&#xff0c;这期我们来介绍拷贝函数和运算符重载 拷贝函数 在现实生活中&#xff0c;可能存在另一个你。 那在C中&#xff0c;我们是否能创建一个与已知对象一样的新对象呢&#xff1f; 拷贝构造函数…

六.python面向对象

学过C或者Java的同学一定了解过面向对象的相关内容&#xff0c;编程语言一般分为两种设计方式&#xff1a;面向对象、面向过程&#xff0c;早期的编程语言多是面向过程的&#xff0c;由多个过程组合在一起&#xff0c;而Python在设计的时候就是一种面向对象的语言&#xff0c;因…

[学习笔记]线段树(全)

线段树是一种可以处理区间问题的优秀数据结构. 线段树是一颗二叉树, 其中的每一个节点都代表了某个区间的信息. 普通线段树 这里默认您已经会了以下操作: 建树(以单点修改的形式)单点修改/查询区间查询 如果不会的话请见OI Wiki 着重讲解区间修改中 tag 的用法 对于区间修…

InternVL-1.1: Enhance Chinese and OCR Capabilities

Blog:https://internvl.github.io/blog/2024-01-24-InternVL-1.1/ 指南:https://internvl.readthedocs.io/en/latest/internvl1.1/introduction.html InternVL-Chat-V1-1 结构类似于 LLaVA,包括一个 ViT、一个 MLP 投影器和一个 LLM。如上图所示,我们通过一个简单的 MLP …

ubuntu服务器离线安装pytorch(cpu版本)

一、查看服务器是否有nvidia显卡&#xff08;无输出则没有nvidia显卡&#xff0c;则不需要安装nvidia驱动、cuda、cudnn&#xff09; lspci | grep -i nvidia 二、本地下载对应版本的torch&#xff08;对应python版本和linux系统&#xff09; 注意&#xff1a;cpu版本&#…

iOS调试真机出现的 “__llvm_profile_initialize“ 错误

一、错误形式&#xff1a; app启动就崩溃&#xff0c;如下&#xff1a; Demo__llvm_profile_initialize:0x1045f7ab0 <0>: stp x20, x19, [sp, #-0x20]!0x1045f7ab4 <4>: stp x29, x30, [sp, #0x10]0x1045f7ab8 <8>: add x29, sp, #0x100x1…

python最新h5st4.9.1调用源码(2025-10-25)

废话不多说&#xff0c;直接上源码&#xff0c;需要技术支持的私。 一、调用js方法&#xff1a; # -*- coding: utf-8 -*- """ -------------------------------------------------Author: byc6352File: jdh5st.pyTime: 2024/10/25 08:03Technical Support:by…

Python 20个必学实例盘点

Python 1. 计算器程序&#xff1a; def add(x, y): return x ydef subtract(x, y): return x - ydef multiply(x, y): return x * ydef divide(x, y): try: return x / y except ZeroDivisionError: print("除数不能…

基于SpringBoot+Vue+uniapp微信小程序的文玩销售小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…