精华内容
下载资源
问答
  • Python 调用JS文件中的函数 1、安装PyExecJS第三方 2、导入库:import execjs 3、调用JS文件中的方法 Passwd = execjs.compile(open(r"web.js").read().decode("utf-8")).call('loginHandle','steam') ...

    Python 调用JS文件中的函数

    1、安装PyExecJS第三方库

    2、导入库:import execjs

    3、调用JS文件中的方法

    Passwd = execjs.compile(open(r"web.js").read().decode("utf-8")).call('loginHandle','steam')
    语句解析,open后跟所执行的js文件位置,call后第一个单引号引起来的为所执行的js文件的某个function,
    第二个单引号是前面函数的参数
    这里为function loginHandle(steam){...},第一个逗号后为带入function的参数,下图为js文件中的该函数:

    代码:

    import execjs

    Passwd = execjs.compile(open(r"web.js").read().decode("utf-8")).call('loginHandle','steam')
    print Passwd

     

    转载于:https://www.cnblogs.com/monogem/p/11362227.html

    展开全文
  • Python 调用JS文件中的函数方法如下 1、安装PyExecJS第三方 2、导入库:import execjs 3、调用JS文件中的方法 Passwd = execjs.compile(open(rweb.js).read().decode(utf-8)).call('loginHandle','steam') ...
  • 在Web渗透流程暴力登录场景和爬虫抓取场景,经常会遇到一些登录表单用DES之类... ③使用语言调用JS引擎来执行JS函数。缺点是:每个JS引擎执行效果会不一致,导致一些小偏差;   第③种方式Python语言能
  • fastcall是一个外部函数接口,旨在为开发人员提供一种易于使用、100% 基于 JavaScript 的方法,以便开发人员在 Node.js 中使用本机共享,而无需接触 C++ 中的任何内容,也不会牺牲太多性能。 它的设计考虑了性能...
  • Python Get页面并执行js

    2020-09-10 20:13:44
    import re # 字符串正则 import argparse # 控制台执行py传参,用于分割参数 import asyncio # py协程 from aiohttp import ClientSession # ...# 我们最终要执行的是js中的intervalFunc函数,这个函数用于过滤掉不含in
    import re # 字符串正则
    import argparse # 控制台执行py传参,用于分割参数
    import asyncio # py协程
    from aiohttp import ClientSession # 利用ClientSession GET页面
    from bs4 import BeautifulSoup # 提取html标签内容
    import execjs # execjs库调用node底层执行js
    
    # 我们最终要执行的是js中的intervalFunc函数,这个函数用于过滤掉不含intervalFunc的js部分
    def findTargetJS(text):
        url = []
        if isinstance(text, str):
            # find all of url in this string
            url = url + re.findall('intervalFunc', text)
        elif isinstance(text, list):
            # find all of url in this list
            for string in text:
                url = url + re.findall('intervalFunc', str(string))
        else:
            raise ValueError("Invalid type!")
    
        return url
    
    # 利用execjs执行js,需要知道js里的函数名并将函数名传参给call()
    # 如果不知道函数名,可以直接os.system("Node xxx.js")利用shell执行,不过这种前提是要把获取的信息放进js文件里
    # 本函数可传入一段js文本(request_url),也可传入一堆js文本组成的list
    # request_times是执行js的次数
    def doJS(request_url, request_times):
    
        # a single url
        if isinstance(request_url, str):
            # print(request_url)
            for i in range(request_times):
                ctx = execjs.compile(request_url)
                ctx.call("setInterval")
    
        # url list
        elif isinstance(request_url, list):
    
            for i in range(request_times):
                for url in request_url:
                    # print(url)
                    ctx = execjs.compile(str(url))
                    ctx.call("setInterval")
    
        else:
            raise ValueError("Invalid type!")
    
    # async和await表示协利用协程异步执行
    async def request(session, request_url, model):
    
        async with session.get(request_url) as response:
            # 这里get request_url获取页面
            text = await response.read()
    
        # only request js in html
        # model = 1表示请求的页面是js嵌入在html里的
        if model == 1:
            soup = BeautifulSoup(text, 'lxml')
            
            # a list which has all of script
            list = soup.find_all("script") # 获取所有script标签内容
            jslist = findTargetJS(list) # 找含有关键字的js
            doJS(jslist, 1) # 执行js
    
        # only request js
        # model = 2表示请求的页面就是js文件
        elif model == 2:
            # text is needed to beautifulsoup
            # response.read()获取的js文件里换行、TAB、空格等等都变成了转义字符,先BeautifulSoup一下
            soup = BeautifulSoup(text, 'lxml')
    
    
    		# BeautifulSoup是处理html标签的,js文件里没有这些标签他会给自动加上<html>和<body>,所以这里先去掉
            # remove html label from soup
            targetJsText = re.sub("</?[^><]+>", '', str(soup))
    
    		# 然后这里要注意HTML 中的预留字符会被被替换为字符实体,所以要替换回来,一看代码就知道怎么回事了
            # handling html character entities
            targetJsText = targetJsText.replace("&amp;", "&").replace("&lt;", "<").replace("&gt;", ">")
    
            # print(str(text))
            print(str(targetJsText))
            doJS(str(targetJsText), 1)
    
        else:
            raise ValueError("Invalid model number!")
    
    
    
    async def main(model):
        async with ClientSession() as session:
            await request(session, request_url, model)
    
    
    if __name__ == '__main__':
        """
        run: python3 jsExcuterClient.py -c 800 -u http://www.rico.ga/ -m 1
        """
        # 解析传入的参数
        parser = argparse.ArgumentParser()
        parser.add_argument('-c')
        parser.add_argument('-u')
        # model: 1 = js in html; 2 = only js
        parser.add_argument('-m')
    
        args = parser.parse_args()
        request_url = args.u if args.u else "http://www.cico.com/reget218.js"
        number_of_requests = args.c if args.c else 1
    
        model = args.m if args.m else 2
    
    	# 这下面就是协程的基本写法了
        loop = asyncio.get_event_loop()
        task = [asyncio.ensure_future(main(model)) for i in range(number_of_requests)]
        loop.run_until_complete(asyncio.wait(task))
        loop.close()
    
    展开全文
  • js-fire是一个用于从大多数js对象自动生成命令行界面(CLI)的库js Fire是在js中创建CLI简单方法。 js Fire可帮助您探索现有代码或将其他人代码转换为CLI。 js Fire使Bash和js之间转换更加容易。 安装 ...
  • Anki Vector-Node.js API 注意: 由于我已购买并正在... 从%home%/.anki_vector/sdk_config.ini获得值直接传递到构造函数中。 然后初始化API并使用它! var VectorAPI = require ( "anki-vector-nodejs" ) ; va
  • DEMO(test1.ss)和核心(core.ss)中有宏定义和调用函数定义和调用、闭包、列表操作、map操作、fibnacci数列、一个简单的HTTP Server(调用nodejs的http模块实现)core.ss中的defmacro的定义有点问题,使用不方便,...
  • when.py:提供用户友好的函数来帮助用户进行常用的日期和时间操作。 dateutil:Python 标准包 datetime 的扩展。 moment:一个处理日期/时间的,灵感来自 Moment.js。 pytz:支持跨平台时区计算,并将 tz ...
  • python实现数据图表

    2020-09-21 05:39:12
    plotly是现代平台的敏捷商业智能和数据科学,它作为一款开源的绘图库,可以应用于Python、R、MATLAB、Excel、JavaScript和jupyter等多种语言,主要使用的js进行图形绘制,实现过程主要就是调用plotly的函数接口...
  • 注意2 :这是仅Node.js的库,在浏览器中将无法使用,因为浏览器没有Python。 要进行前端突出显示,请选择。 原料药 pygmentize(选项,代码,回调) Pygmentize给定code字符串,并将其作为Buffer返回给...
  • python实现数据图表.pdf

    2020-11-22 21:47:12
    python实实现现数数据据图图表表 plotly是现代平台敏捷商业智能和数据科学它作为一款开源绘图库可以应用于PythonRMATLAB ExcelJavaScript和j upyter等多种语言 要使用的js进行图形绘制实现过程 要就是调用...
  • 学习和练习Python函数:声明一个functoin,调用一个函数函数作用域,嵌套函数函数递归性和许多其他函数概念。 整个教程是 :backhand_index_pointing_up: 交互, :check_mark_button: 自动分级并带有。 :video...
  • plotly是现代平台的敏捷商业智能和数据科学,它作为一款开源的绘图库,可以应用于Python、R、MATLAB、Excel、JavaScript和jupyter等多种语言,主要使用的js进行图形绘制,实现过程主要就是调用plotly的函数接口...
  • Python数据可视化:顶级绘图库plotly

    万次阅读 2016-11-01 21:09:05
    https://plot.ly/python/static-image-export/plotly是现代平台敏捷商业智能和数据科学,它作为一款开源绘图库,可以应用于Python、R、MATLAB、Excel、JavaScript和jupyter等多种语言,主要使用的js进行图形...

    这里写图片描述
          有史以来最牛逼的绘图工具,没有之一
          plotly是现代平台的敏捷商业智能和数据科学库,它作为一款开源的绘图库,可以应用于Python、R、MATLAB、Excel、JavaScript和jupyter等多种语言,主要使用的js进行图形绘制,实现过程中主要就是调用plotly的函数接口,底层实现完全被隐藏,便于初学者的掌握。

          下面主要从Python的角度来分析plotly的绘图原理及方法:

    ###安装plotly:
          使用pip来安装plotly库,如果机器上没有pip,需要先进行pip的安装,这里主要介绍plotly的安装。

    $ pip install plotly 
    or 
    $ sudo pip install plotly 
    or update
    $ pip install plotly --upgrade
    

    ###输出方式:
    在线:
          将你的可视化图像保存到网站上,便于共享和保存。

    import plotly.plotly as py
    import plotly.graph_objs as go
    
    py.sign_in('DemoAccount', '2qdyfjyr7o') # 注意:这里是plotly网站的用户名和密码
    
    trace = go.Bar(x=[2, 4, 6], y= [10, 12, 15])
    data = [trace]
    layout = go.Layout(title='A Simple Plot', width=800, height=640)
    fig = go.Figure(data=data, layout=layout)
    
    py.image.save_as(fig, filename='a-simple-plot.png')
    
    from IPython.display import Image
    Image('a-simple-plot.png')
    

    离线:
          直接在本地生成可视化图像,便于使用。

    # -*- coding:utf-8 -*-
    
    import plotly.plotly
    import plotly.graph_objs as go
    
    trace = go.Box(
        x=[1, 2, 3, 4, 5, 6, 7]
    )
    data = [trace]
    plotly.offline.plot(data)  # 离线方式使用:offline
    

    ###plotly绘图:

    • 基本图表:20种
    • 统计和海运方式图:12种
    • 科学图表:21种
    • 财务图表:2种
    • 地图:8种
    • 3D图表:19种
    • 报告生成:4种
    • 连接数据库:7种
    • 拟合工具:3种
    • 流动图表:4种
    • JavaScript添加自定义控件:13种

    这里写图片描述

    展开全文
  • 服务器端第 1 句是将 它的服务器端程序包含到你的程序里,之后的 2 - 4 句是定义一个远程调用的函数,你会发现它与本地函数没有任何区别。第 5 句是创建服务器端对象,第 6 句是添加要发布的方法,这里添加的就是...
  • 先把post中的headers格式化ii.然后把参数也格式化iii. 最后再执行`requests`的post请求iv. 封装成一个函数2. 调用解密函数i. 分析ii. 先取出js部分iii. 取第一个解密函数作为我们用的解密函数iv. 用execjs执行1. ...

    根据 savefrom条例
    本实例及教程只用于学习交流用,权利归savefrom.net所有
    最后代码+注释大概100行左右,具体代码以github代码为主(可以会在上面修复bug),本文只做具体讲解

    项目地址

    github仓库

    思路

    用python做youtube自动化下载器 思路

    流程

    1. post

    根据思路里的第一步,我们首先需要用post方式取到加密后的js字段,笔者使用了requests第三方库来执行,关于爬虫可以参考我之前的文章

    i. 先把post中的headers格式化

    # set the headers or the website will not return information
        # the cookies in here you may need to change
        headers = {
            "cache-Control": "no-cache",
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,"
                      "*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
            "content-type": "application/x-www-form-urlencoded",
            "cookie": "lang=en; country=CN; uid=fd94a82a406a8dd4; sfHelperDist=72; reference=14; "
                      "clickads-e2=90; poropellerAdsPush-e=63; promoBlock=64; helperWidget=92; "
                      "helperBanner=42; framelessHdConverter=68; inpagePush2=68; popupInOutput=9; "
                      "_ga=GA1.2.799702638.1610248969; _gid=GA1.2.628904587.1610248969; "
                      "PHPSESSID=030393eb0776d20d0975f99b523a70d4; x-requested-with=; "
                      "PHPSESSUD=islilfjn5alth33j9j8glj9776; _gat_helperWidget=1; _gat_inpagePush2=1",
            "origin": "https://en.savefrom.net",
            "pragma": "no-cache",
            "referer": "https://en.savefrom.net/1-youtube-video-downloader-4/",
            "sec-ch-ua": "\"Google Chrome\";v=\"87\", \"Not;A Brand\";v=\"99\",\"Chromium\";v=\"87\"",
            "sec-ch-ua-mobile": "?0",
            "sec-fetch-dest": "iframe",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "same-origin",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/87.0.4280.88 Safari/537.36"}
    

    其中cookie部分可能要改,然后最好以你们浏览器上的为主,具体每个参数的含义不是本文范围,可以自行去搜索引擎搜

    ii.然后把参数也格式化

    # set the parameter, we can get from chrome
        kv = {"sf_url": url,
              "sf_submit": "",
              "new": "1",
              "lang": "en",
              "app": "",
              "country": "cn",
              "os": "Windows",
              "browser": "Chrome"}
    

    其中sf_url字段是我们要下载的youtube视频的url,其他参数都不变

    iii. 最后再执行requests库的post请求

    # do the POST request
        r = requests.post(url="https://en.savefrom.net/savefrom.php", headers=headers,
                          data=kv)
        r.raise_for_status()
    

    注意是data=kv

    iv. 封装成一个函数

    import requests
    
    def gethtml(url):
        # set the headers or the website will not return information
        # the cookies in here you may need to change
        headers = {
            "cache-Control": "no-cache",
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,"
                      "*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
            "content-type": "application/x-www-form-urlencoded",
            "cookie": "lang=en; country=CN; uid=fd94a82a406a8dd4; sfHelperDist=72; reference=14; "
                      "clickads-e2=90; poropellerAdsPush-e=63; promoBlock=64; helperWidget=92; "
                      "helperBanner=42; framelessHdConverter=68; inpagePush2=68; popupInOutput=9; "
                      "_ga=GA1.2.799702638.1610248969; _gid=GA1.2.628904587.1610248969; "
                      "PHPSESSID=030393eb0776d20d0975f99b523a70d4; x-requested-with=; "
                      "PHPSESSUD=islilfjn5alth33j9j8glj9776; _gat_helperWidget=1; _gat_inpagePush2=1",
            "origin": "https://en.savefrom.net",
            "pragma": "no-cache",
            "referer": "https://en.savefrom.net/1-youtube-video-downloader-4/",
            "sec-ch-ua": "\"Google Chrome\";v=\"87\", \"Not;A Brand\";v=\"99\",\"Chromium\";v=\"87\"",
            "sec-ch-ua-mobile": "?0",
            "sec-fetch-dest": "iframe",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "same-origin",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/87.0.4280.88 Safari/537.36"}
        # set the parameter, we can get from chrome
        kv = {"sf_url": url,
              "sf_submit": "",
              "new": "1",
              "lang": "en",
              "app": "",
              "country": "cn",
              "os": "Windows",
              "browser": "Chrome"}
        # do the POST request
        r = requests.post(url="https://en.savefrom.net/savefrom.php", headers=headers,
                          data=kv)
        r.raise_for_status()
        # get the result
        return r.text
    

    2. 调用解密函数

    i. 分析

    这其中的难点在于在python里执行javascript代码,而晚上的解决方法有PyV8等,本文选用execjs。在思路部分我们可以发现js部分的最后几行是解密函数,所以我们只需要在execjs中先执行一遍全部,然后再单独执行解密函数就好了

    ii. 先取出js部分

    # target(youtube address) url
        url = "https://www.youtube.com/watch?v=YPvtz1lHRiw"
        # get the target text
        reo = gethtml(url)
        # Remove the code from the head and tail (we need the javascript part, information store with encryption in js part)
        reo = reo.split("<script type=\"text/javascript\">")[1].split("</script>")[0]
    

    这里其实可以用正则,不过由于笔者正则表达式还不太熟练就直接用split

    iii. 取第一个解密函数作为我们用的解密函数

    当你多取几次不同视频的结果,你就会发现每次的解密函数都不一样,不过位置都是还是在固定行数

    # split each line(help us find the decrypt function in last few line)
        reA = reo.split("\n")
        # get the depcrypt function
        name = reA[len(reA) - 3].split(";")[0] + ";"
    

    所以name就是我们的解密函数了(变量名没取太好hhh)

    iv. 用execjs执行

    # use execjs to execute the js code, and the cwd is the result of `npm root -g`(the path of npm in your computer)
        ct = execjs.compile(reo)
        # do the decryption
        text = ct.eval(name.split("=")[1].replace(";", ""))
    

    其中只取=后面的和去掉分号是指指执行这个函数而不用赋值,当先执行赋值+解密然后取值也不是不可以
    但是我们可以发现马上就报错了(要是有这么简单就好了)

    1. this也就是window变量不存在

    如果没记错是报错this或者$b,笔者尝试把全部this去掉或者把全部框在一个class里面(这样子this就变成那个class了)不过都没有成功,然后发现在npm下有个jsdom可以在execjs里模拟window变量(其实应该有更好方法的),所以我们需要下载npm和里面的jsdom,然后改写以上代码

        addition = """
        const jsdom = require("jsdom");
        const { JSDOM } = jsdom;
        const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
        window = dom.window;
        document = window.document;
        XMLHttpRequest = window.XMLHttpRequest;
        """
        # use execjs to execute the js code, and the cwd is the result of `npm root -g`(the path of npm in your computer)
        ct = execjs.compile(addition + reo, cwd=r'C:\Users\xxx\AppData\Roaming\npm\node_modules')
    

    其中

    • cwd字段是npm root -g的结果,也就是npm的modules路径
    • addition是用来模拟window
      但是我们又可以发现下一个错误

    2. alert不存在

    这个错误是因为在execjs下执行alert函数是没有意义的,因为我们没有浏览器让他弹窗,且原本alert函数的定义是来源window而我们自定义了window,所以我们要在代码前重写覆盖alert函数(相当于定义一个alert)

    # override the alert function, because in the code there has one place using
        # and we cannot do the alerting in execjs(it is meaningless) however, if we donnot override, the code will raise a error
        reo = reo.replace("(function(){", "(function(){\nthis.alert=function(){};")
    

    v. 整合代码

    # target(youtube address) url
        url = "https://www.youtube.com/watch?v=YPvtz1lHRiw"
        # get the target text
        reo = gethtml(url)
        # Remove the code from the head and tail (we need the javascript part, information store with encryption in js part)
        reo = reo.split("<script type=\"text/javascript\">")[1].split("</script>")[0]
        # override the alert function, because in the code there has one place using
        # and we cannot do the alerting in execjs(it is meaningless) however, if we donnot override, the code will raise a error
        reo = reo.replace("(function(){", "(function(){\nthis.alert=function(){};")
        # split each line(help us find the decrypt function in last few line)
        reA = reo.split("\n")
        # get the depcrypt function
        name = reA[len(reA) - 3].split(";")[0] + ";"
        # add jsdom into the execjs because the code will use(maybe there is a solution without jsdom, but i have no idea)
        addition = """
        const jsdom = require("jsdom");
        const { JSDOM } = jsdom;
        const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
        window = dom.window;
        document = window.document;
        XMLHttpRequest = window.XMLHttpRequest;
        """
        # use execjs to execute the js code, and the cwd is the result of `npm root -g`(the path of npm in your computer)
        ct = execjs.compile(addition + reo, cwd=r'C:\Users\19308\AppData\Roaming\npm\node_modules')
        # do the decryption
        text = ct.eval(name.split("=")[1].replace(";", ""))
    

    3. 分析解密结果

    i. 取关键json

    运行完上面的部分,解密结果就存在text里了,而我们在思路中可以发现,真正对我们重要的就是存在window.parent.sf.videoResult.show()里的json,所以用正则表达式取这一部分的json

    # get the result in json
        result = re.search('show\((.*?)\);;', text, re.I | re.M).group(0).replace("show(", "").replace(");;", "")  
    

    ii. 格式化json

    python可以格式化json的库有很多,这里笔者用了json库(记得import)

    # use `json` to load json
        j = json.loads(result)
    

    iii. 取下载地址

    接下来就到了最后一步,根据思路里和json格式化工具我们可以发现j["url"][num]["url"]就是下载链接,而num是我们要的视频格式(不同分辨率和类型)

    # the selection of video(in this case, num=1 mean the video is
        # - 360p known from j["url"][num]["quality"]
        # - MP4 known from j["url"][num]["type"]
        # - audio known from j["url"][num]["audio"]
        num = 1
        downurl = j["url"][num]["url"]
        # do some download
        # thanks :)
        # - EOF -
    

    3. 全部代码

    # -*- coding: utf-8 -*-
    # @Time: 2021/1/10
    # @Author: Eritque arcus
    # @File: Youtube.py
    # @License: MIT
    # @Environment:
    #           - windows 10
    #           - python 3.6.2
    # @Dependence:
    #           - jsdom in npm(windows also can use)
    #           - requests, execjs, re, json in python
    import requests
    import execjs
    import re
    import json
    
    
    def gethtml(url):
        # set the headers or the website will not return information
        # the cookies in here you may need to change
        headers = {
            "cache-Control": "no-cache",
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,"
                      "*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
            "content-type": "application/x-www-form-urlencoded",
            "cookie": "lang=en; country=CN; uid=fd94a82a406a8dd4; sfHelperDist=72; reference=14; "
                      "clickads-e2=90; poropellerAdsPush-e=63; promoBlock=64; helperWidget=92; "
                      "helperBanner=42; framelessHdConverter=68; inpagePush2=68; popupInOutput=9; "
                      "_ga=GA1.2.799702638.1610248969; _gid=GA1.2.628904587.1610248969; "
                      "PHPSESSID=030393eb0776d20d0975f99b523a70d4; x-requested-with=; "
                      "PHPSESSUD=islilfjn5alth33j9j8glj9776; _gat_helperWidget=1; _gat_inpagePush2=1",
            "origin": "https://en.savefrom.net",
            "pragma": "no-cache",
            "referer": "https://en.savefrom.net/1-youtube-video-downloader-4/",
            "sec-ch-ua": "\"Google Chrome\";v=\"87\", \"Not;A Brand\";v=\"99\",\"Chromium\";v=\"87\"",
            "sec-ch-ua-mobile": "?0",
            "sec-fetch-dest": "iframe",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "same-origin",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/87.0.4280.88 Safari/537.36"}
        # set the parameter, we can get from chrome
        kv = {"sf_url": url,
              "sf_submit": "",
              "new": "1",
              "lang": "en",
              "app": "",
              "country": "cn",
              "os": "Windows",
              "browser": "Chrome"}
        # do the POST request
        r = requests.post(url="https://en.savefrom.net/savefrom.php", headers=headers,
                          data=kv)
        r.raise_for_status()
        # get the result
        return r.text
    
    
    if __name__ == '__main__':
        # target(youtube address) url
        url = "https://www.youtube.com/watch?v=YPvtz1lHRiw"
        # get the target text
        reo = gethtml(url)
        # Remove the code from the head and tail (we need the javascript part, information store with encryption in js part)
        reo = reo.split("<script type=\"text/javascript\">")[1].split("</script>")[0]
        # override the alert function, because in the code there has one place using
        # and we cannot do the alerting in execjs(it is meaningless) however, if we donnot override, the code will raise a error
        reo = reo.replace("(function(){", "(function(){\nthis.alert=function(){};")
        # split each line(help us find the decrypt function in last few line)
        reA = reo.split("\n")
        # get the depcrypt function
        name = reA[len(reA) - 3].split(";")[0] + ";"
        # add jsdom into the execjs because the code will use(maybe there is a solution without jsdom, but i have no idea)
        addition = """
        const jsdom = require("jsdom");
        const { JSDOM } = jsdom;
        const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
        window = dom.window;
        document = window.document;
        XMLHttpRequest = window.XMLHttpRequest;
        """
        # use execjs to execute the js code, and the cwd is the result of `npm root -g`(the path of npm in your computer)
        ct = execjs.compile(addition + reo, cwd=r'C:\Users\19308\AppData\Roaming\npm\node_modules')
        # do the decryption
        text = ct.eval(name.split("=")[1].replace(";", ""))
        # get the result in json
        result = re.search('show\((.*?)\);;', text, re.I | re.M).group(0).replace("show(", "").replace(");;", "")
        # use `json` to load json
        j = json.loads(result)
        # the selection of video(in this case, num=1 mean the video is
        # - 360p known from j["url"][num]["quality"]
        # - MP4 known from j["url"][num]["type"]
        # - audio known from j["url"][num]["audio"]
        num = 1
        downurl = j["url"][num]["url"]
        # do some download
        # thanks :)
        # - EOF -
    
    
    • 总计102行
    • 开发环境
    # @Environment:
    #           - windows 10
    #           - python 3.6.2
    
    • 依赖
    # @Dependence:
    #           - jsdom in npm(windows also can use)
    #           - requests, execjs, re, json in python
    
    -end-
    展开全文
  • 调用函数 - Python内置函数 / 导入模块和函数 函数的参数 - 默认参数 / 可变参数 / 关键字参数 / 命名关键字参数 函数的返回值 - 没有返回值 / 返回单个值 / 返回多个值 作用域问题 - 局部作用域 / 嵌套作用域 / ...
  • satellite.js介绍、安装以及用法 ...介绍 一个使通过TLEs在网络上进行卫星传播成为可能的库。 提供SGP4/SDP4计算所需的函数,如可...但是,它被封装在标准JS库(自执行函数),并仅公开跟踪卫星和传播路径。作者对Brandon
  • 08 数学意义的函数与python中的函数 09 为何要有函数 10 函数返回值 11 可变长参数 第15章 01 上节课复习 02 全局变量与局部变量 03 风湿理论之函数即变量 04 函数递归 05 函数递归补充 第16章 01 上节课回顾 02...
  • 函数式编程之lambda

    2018-11-18 00:05:32
    jspython等脚本语言经常可以看到已函数作为变量来传递用法,这种方法使得程序多是在创建函数、或创建函数(运行)路上。更甚至一些简单方法完全不需要调用(引入)就可以用简单几行代码来解决,可以...
  • 服务器端第 1 句是将 它的服务器端程序包含到你的程序里,之后的 2 - 4 句是定义一个远程调用的函数,你会发现它与本地函数没有任何区别。第 5 句是创建服务器端对象,第 6 句是添加要发布的方法,这里添加的就是...
  • 正如示例所希望演示那样,使用API​​密钥创建应用程序非常容易:使用开发人员门户网站创建API密钥,像示例一样设置一个函数来构建API密钥标头,然后进行API调用! 无需处理OAuth重定向或类似事情。 由于...
  • apijson-node Node.ts 版 APIJSON,提供 nestjs 和 typeorm Demo,由字节跳动工程师开发 uliweb-apijson Python 版 APIJSON,支持 MySQL, PostgreSQL, SQL Server, Oracle, SQLite 等 APIJSONParser 第三方 API...
  • 一,准备工作:服务端部署 ... 需要说明是这里gt.js文件,它用于加载对应验证JS库。  1.引入初始化函数   main.js import '../static/global/gt.js'  2.调用初始化函数进行初始化  api.js ...
  • 到目前为止,Polytype可在所有主要浏览器当前版本和Node.js ( )运行。 内容 in isPrototypeOf 寻找基类 将调用分派到多个基类 动态基类更改 TypeScript支持 注意事项 this在基本构造函数中 for...in迭代...
  • java8 看不到源码cloudformation-custom-resources 此存储包含用于设置 Lambda 支持的 CloudFormation 自定义资源的存根代码。 什么是自定义资源? CloudFormation 有许多已定义的资源,您...中的 Lambda 函数的脚
  • Open Chinese Convert(OpenCC)是一个开源中文简繁转换项目,... 支持C、C 、Python、PHP、Node.js等多种语言API,提供命令行直接调用,以及图形界面。 兼容Windows、Linux、Mac等多种平台。 标签:OpenCC

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

python调用js库中的函数

python 订阅