视频爬虫逆向简单入门级

2023-11-02

严禁用于学习交流之外的任何用途,侵删

只能说这个比较简单,没什么难度,很适合做js逆向入门

下面就开始解析一下这个网站吧。aHR0cHM6Ly93d3cubWlndXZpZGVvLmNvbS9tZ3Mvd2Vic2l0ZS9wcmQvZGV0YWlsLmh0bWw/Y2lkPTcxMzM4OTcxNg==

确认需要的视频链接不在源码后,我们开始找接口分析:

                                                        图一 

这么一看,好像是直接在接口里找到目标了,那是不是只需要看看接口有没有加密参数就行了?

那我们看看接口参数:

                                                     图二

经过测试,我们只需要红框里的接口就行了,参数只有需要一个contId,也就是这个网页链接里带的id,好像不需要加密参数。(好像不遮挡域名图片会被河蟹掉,上个博客就是。。。)

那似乎真的就好像对接口请求就行了?

其实不是的,这个接口请求会正常返回数据,但是图一返回的数据中,url是个不完整的链接,无法正常跳转。我们把图一的链接复制一下,再去找一下真正的视频链接:

                                                   图三

 对比:

                                                       图四 

简单对比之后,发现真正请求的链接是多了两个参数的,也就是,我们在接口获取的链接经过了处理。

行,进到js阶段了

参数 ddCalcu:50c0e4d3b334f11879e1f7f9e045206c64df 就是重点了

全局搜一下:

搜到一个结果,进去看看

 打个断点调试:

 一下全都出来了,没有什么难度。

简单来说就是把我们接口(图一)获取到的url,在url匹配到参数,然后对参数进行操作,获取ddCalcu,然后再加上传进来的url,返回真正的链接。

代码操作一下:

import re
import execjs
import requests


def get_video1(url):
    """
    :param url: 参数,视频链接
    :return: None 只解析,不return
    """
    video_id = re.search(r'cid=(\d+)', url).group(1)
    # header中的参数不可缺,否则返回的数据是有问题的
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
        'terminalId': 'www',
        'appId': '域名',
        'clientId': '83356a76249486924b6804daaa5a4e03',
        'Connection': 'keep-alive',
        'Host': 'webapi.域名.com',
        'Origin': 'https://www.域名.com',
        'Referer': 'https://www.域名.com/',
        'X-UP-CLIENT-CHANNEL-ID': '0132_10010001005'
    }
    api = 'https://webapi.域名.com/gateway/playurl/v3/play/playurl?contId={}'
    resp = requests.get(api.format(video_id), headers=headers)

    # 前置链接非视频链接,在源码中,该链接会作为参数传到js中
    video_urls = re.findall(r'"url":"(.*?)"', resp.text, re.S)
    video_url = video_urls[0]

    # 从链接中拿到必要参数
    timestamp = re.search('timestamp=(\d+)', video_url).group(1).strip()
    ProgramID = re.search('ProgramID=(\d+)', video_url).group(1).strip()
    Channel_ID = re.search('Channel_ID=(\d+_\d+)', video_url).group(1).strip()
    puData = re.search('puData=(.*)', video_url).group(1).strip()
    print(timestamp, ProgramID, Channel_ID, puData)

    # 执行js获取真正链接
    ctx = execjs.compile(open('js/migu.js').read())
    video_url = ctx.call("getUrl", video_url, timestamp, ProgramID, Channel_ID, puData)
    print(video_url)


if __name__ == '__main__':
    url = ''
    get_video1(url)

 值得注意的是,请求头的一些参数是必须的,不然图一获取的url就是不正常的,整个代码也就有问题了。

js代码:

function getUrl(e, timestamp, ProgramID, Channel_ID, puData) {
    var t = "eeeeeeeee"
        , r = timestamp
        , n = ProgramID
        , a = Channel_ID
        , o = puData
    if (!o)
        return e;
    var s = "2624";
    s = s.split("");
    for (var u = t.split("")[s[0]] || "e", l = r.split("")[s[1]] || "t", c = n.split("")[s[2]] || "c", f = a.split("")[a.split("").length - s[3]] || "n", d = o.split(""), h = [], p = 0; 2 * p < d.length; p++)
        switch (h.push(d[d.length - p - 1]),
        p < d.length - p - 1 && h.push(o[p]),
            p) {
            case 1:
                h.push(u);
                break;
            case 2:
                h.push(l);
                break;
            case 3:
                h.push(c);
                break;
            case 4:
                h.push(f)
        }
    var v = h.join("");

    return e + "&ddCalcu=" + v
}

对比源码,坐了一定的处理,正则匹配参数的步骤在python执行,js就更简洁点。

以上

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视频爬虫逆向简单入门级 的相关文章

  • 没有任何元数据的 zip 文件

    我想找到一种简单的方法来压缩一堆文件 而无需任何文件元数据 例如时间戳 这zip命令似乎总是保留元数据 我没有找到禁用元数据的方法 我希望解决方案是一个命令或最多一个 python 脚本 谢谢 正如一些帖子已经指出的那样 zip 标头中的大
  • 在 Python 中使用 Selenium 处理“接受 Cookie”弹出窗口

    我一直在尝试用硒抓取这个房地产网站的一些信息 但是 当我访问该网站时 我需要接受 cookie 才能继续 这仅在机器人访问网站时发生 而不是在我手动执行时发生 当我尝试通过 xpath 或 id 查找相应的元素时 正如我在手动检查页面时找到
  • on_delete=models.PROTECT 和 on_delete=models.CASCADE 在 Django 模型上有什么作用?

    我对 Django 很熟悉 但最近注意到有一个on delete models CASCADE and on delete models PROTECT模型的选项 on delete models CASCADE and on delete
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • Python igraph:从图中删除顶点

    我正在使用安然电子邮件数据集 并尝试删除没有 enron com 的电子邮件地址 即我只想拥有安然电子邮件 当我尝试删除那些没有 enron com 的地址时 一些电子邮件由于某些原因被跳过 下面显示了一个小图 其中顶点是电子邮件地址 这是
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 如何使用Python的super()来更新父值?

    我对继承很陌生 之前所有关于继承和 Python 的 super 函数的讨论都有点超出我的理解 我当前使用以下代码来更新父对象的值 usr bin env python test py class Master object mydata
  • Python:计算数据帧列中所有行中特定字符的实例数

    我有一个包含列 toaddress ccaddress body 的数据框 df 我想迭代数据帧的索引 以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小 最大和平均数量 这是通过计算这两列中每个字段中的 和 的实
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • Matplotlib Scatter - ValueError:RGBA 序列的长度应为 3 或 4

    我正在尝试为我的功能绘制图表 但不断收到此错误 ValueError RGBA sequence should have length 3 or 4 每当我只有 6 种形状时 代码就可以完美运行 但现在我将其增加到 10 种 它就不起作用了
  • 如何在与应用程序初始化文件不同的文件中迭代 api 路由

    我有一个 apiroutes py 文件 其中定义了许多路由 例如 api route api read methods GET api route api write methods POST 其中 api 是导入 from import
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 如何禁止 celery 中的 pickle 序列化

    Celery 默认使用 pickle 作为任务的序列化方法 如中所述FAQ http ask github com celery faq html isn t using pickle a security concern 这代表一个安全漏
  • 检查字符串是否只有字母和空格 - Python

    试图让 python 返回一个字符串仅包含字母和空格 string input Enter a string if all x isalpha and x isspace for x in string print Only alphabe
  • TypeError:无法使用抽象方法实例化抽象类 <...>

    这是我的代码 from abc import ABC from abc import abstractmethod class Mamifiero ABC docstring for Mamifiero def init self self
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如

随机推荐

  • 国产代码审计工具Pinpoint介绍

    硬核国产代码审计工具Pinpoint介绍 简介 Pinpoint是由国内源伞科技所研制的一款静态代码审计工具 源伞科技公司是香港科技大学安全实验室的众多博士创建的 产品集成了实验室多年的研究成果 在众多国际顶级学术会议上都发表了成果论文 在
  • MinGW/GCC/CodeBlocks 等在 Win7 编译出现 Permission Denied 错误 - 解决方法

    本文分享了以 MinGW 为主要编译模块的编译器 如 MinGW 自身 以及Dev Cpp CodeBlocks 这些调用 MinGW 进行编译的编译器 在编译连接过程中出现 Permission Denied 错误的解决方法 同样 可能也
  • js搜索关键字,并高亮显示

    当我们搜索时 总想要自己输入的字体显示为重点 今天我为大家解决这个问题
  • 集成spring-boot-admin(一)搭建admin-server

    1 什么是SBA SBA全称为Spring Boot Admin 是一个管理和监控Spring Boot应用程序的开源项目 分为admin server 与 admin client 两个组件 admin server是一个单独的微服务 通
  • C++算术类型

    算术类型分为两类 整型 integral type 包含字符类型和布尔类型 和浮点型 算术类型的尺寸在不同机器有所差别 C 算术类型 类型 含义 最小尺寸 bit 字节 byte bool 布尔类型 未定义 1 char 字符型 8位 1
  • 不相交的线

    不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数 现在 可以绘制一些连接两个数字 nums1 i 和 nums2 j 的直线 这些直线需要同时满足满足 nums1 i nums2 j 且绘制的直线不与任
  • 解决VirtualBox只能安装32位系统的问题

    安装VirtualBox虚拟机后发现只能安装32位系统 如下图 原因分析 电脑未开启cpu虚拟化技术 解决方式 需要到电脑BIOS里设置一下 方可安装 64位系统 操作方式 1 进入BIOS设置 根据电脑型号不同进入方式不一致 可网上查找进
  • 每天定时用爬虫爬取新闻发送给三爷

    需求 1 获取前十条科技要闻 2 通过邮件发送给指定收件人 3 定时发送 1 获取要闻 选的是新浪科技网https tech sina com cn 爬取前十名要闻 import requests from requests import
  • tensorlfow-yolov3训练

    本帖纯粹记录个人开发过程 服务器环境 V100服务器 ubuntu16 04 cuda10 0 tensorflow1 13 1 python3 5 tensorflow yolov3版本 https github com YunYang1
  • ThreadLocal理解及其内存泄露

    ThreadLocal理解及其内存泄露 ThreadLocal可以理解为 为一个线程隔离的变量 他不是一个集合 他只是一个类 这个类可以set get remove set时使用的是哪个线程 get时 也必需用哪个线程去获取 才能获取到值
  • 关于Proximal Methods,近端梯度下降的理解

    本文介绍了两种Proximal Methods的证明方法以及实现 内容主要来源于王然老师的 Proximal Methods 一文以及网络 加入了部分个人理解 由于水平有限 如有不妥之处 敬请指正 为什么会有Proximal methods
  • C语言之结构体(Struct)

    Struct 结构体的两种定义方法 方法1 方法2 结构体的成员的初始化与访问 应用举例 结构体的两种定义方法 方法1 定义一个结构体 struct Name int temp1 float temp2 1 1 定义一个结构体变量 stru
  • 拿offer必须掌握的最全SpringCloud面试题(含答案)

    今天公司的项目比较忙 远程开会和办公的沟通效率总是差那么一点 为了节约点时间 就不介绍SpringCloud了 我想只要是一名Java开发程序员 提到微服务 一定对SpringCloud的大名如雷贯耳 我们直接来看它的高频面试题吧 1 什么
  • R绘制双坐标轴

    目录 方法一 ggplot中的sec axis函数 方法二 plotrix包中的twoord plot 函数和twoord stackplot 函数 方法一 ggplot中的sec axis函数 ggplot2支持直接显示在辅助轴上的数据的
  • 机器学习——为什么逻辑斯特回归(logistic regression)是线性模型

    问 逻辑斯蒂回归是一种典型的线性回归模型 答 正确 逻辑斯蒂回归是一种典型的线性回归模型 它通过将线性回归模型的输出结果映射到 0 1 区间内 表示某个事物发生的概率 从而适用于二分类问题 具体地说 它使用sigmoid函数对线性回归模型的
  • Python的赋值与深浅拷贝

    简要版本 由于 Python 内部引用计数的特性 对于不可变对象 浅拷贝和深拷贝的作用是一致的 就相当于复制了一份副本 原对象内部的不可变对象的改变 不会影响到复制对象 浅拷贝的拷贝 其实是拷贝了原始元素的引用 内存地址 所以当拷贝可变对象
  • FLEX开发人员中心部分下载

    Adobe Application Modeling plug in download Adobe Application Modeling plug in download 点击进入 Flex MX Skin Design Extensi
  • C语言基础入门48篇_47_C语言操作文件(文件操作函数、打开文件fopen()、关闭文件fclose()、fclose规范程序、野指针的定义为:指针地址存在,但是指针指向的是一个已经释放的资源)

    本篇主要介绍c语言中对文件的打开关闭操作 1 C语言文件操作函数 C标准库中提供了一系列的函数 来操作文件 因为C库函数做了这个中间层 屏蔽掉了操作系统上对于文件的不同处理 关于文件的常见基本操作有 打开文件fopen 创建文件或打开文件载
  • 2020-6次面试阿里,持续一个多月,终于拿到offer了!

    从3月开始准备 一直到5月22号 终于拿到阿里的实习offer 这一路 真的是一把辛酸泪 下面细说之 在这一路上 坎坎坷坷 跌跌宕宕 期间 面了阿里 腾讯 百度 今日头条 小米 笔试网易 美团 携程 爱奇艺 不得不说 阿里是持续周期最长的
  • 视频爬虫逆向简单入门级

    严禁用于学习交流之外的任何用途 侵删 只能说这个比较简单 没什么难度 很适合做js逆向入门 下面就开始解析一下这个网站吧 aHR0cHM6Ly93d3cubWlndXZpZGVvLmNvbS9tZ3Mvd2Vic2l0ZS9wcmQvZGV