youtube视频下载

使用的是https://en.savefrom.net/的网站的解析接口,这个解析接口返回的视屏信息是加密的,通过浏览器端解密从而解析出真正的下载地址,代码通过requests请求得到加密密文,pyv8模拟js解密得到下载的url地址,url包含各个清晰度的视屏
在这里插入图片描述
废话不多说,上代码:

# -*- coding:utf-8 -*-
# @Author: YOYO
# @Time: 2018/12/16 18:28
# @说明: 
import json
import re
import sys
import PyV8
import requests
from bs4 import BeautifulSoup
from urllib3 import disable_warnings

reload(sys)
sys.setdefaultencoding('utf8')
disable_warnings()


class Youtb(object):
    def __init__(self,**kwargs):
        self.s=requests.session()
        self.url_download=kwargs.get('url','')

    def get_video(self):
        url=self.url_download
        if not url:
            return

        url = "https://en.savefrom.net/savefrom.php"

        payload = "sf_url={}&sf_submit=&new=1&lang=en&app==".format(self.url_download)
        headers = {
            'host': "en.savefrom.net",
            'connection': "keep-alive",
            'content-length': "92",
            'cache-control': "no-cache",
            'origin': "https://en.savefrom.net",
            'upgrade-insecure-requests': "1",
            'content-type': "application/x-www-form-urlencoded",
            'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3638.0 Safari/537.36",
            'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            'referer': "https://en.savefrom.net/",
            'accept-language': "zh-CN,zh;q=0.9",
            'cookie': "lang=en; country=TW; uid=d458fc8c4bacfa14;",
        }

        response = self.s.request("POST", url, data=payload, headers=headers,verify =False)
        html=response.text
        soup=BeautifulSoup(html,'html.parser')
        js_code=soup.select('script')[0].get_text()
        js_code=js_code.replace('eval(a)','if(a.slice(0,10) == "(function("){ param=a}else{ eval(a)}')
        with PyV8.JSContext() as ctxt:
            with open('./video.js', 'r')as f:
                js = f.read()
            ctxt.eval(js)
            get_video = ctxt.locals.get_video  # 参数传递
            data = get_video(js_code.replace('\n',''))
        # 提取链接:
        d=re.findall(r'window.parent.sf.videoResult.show\((.*?)\);;',data)[0]

        data_dict=json.loads(d)
        urls=data_dict['url']
        print urls


if __name__ == '__main__':
    y=Youtb(url="https://www.youtube.com/watch?v=_XwO73wafp4")
    y.get_video()

js解密代码:

function get_video(js_code){

var param="";
eval(js_code)
return param
}

细心得人可以发现cookie是写死的,'cookie': "lang=en; country=TW; uid=d458fc8c4bacfa14;",
可不可以算出来呢?

cookie之uid:

cookie不是response返回的,是通过js生成的,下断点可以找到生成uid的位置,分析过程需要耐心的找一下.
上代码:

function get_cookie_uid(){
window={}
document={}
location={}
location.hash="";

var cookie = {
    set: function(e, n, t, o) {
        if (e = encodeURIComponent(e),
            n = n ? encodeURIComponent(n) : "",
            o = o || "",
        t && "number" == typeof t) {
            var i = t
                , c = t = new Date;
            c.setDate(c.getDate() + i)
        } else
            t = new Date;
        document.cookie = e + "=" + n + "; domain=" + o + "; path=/; expires=" + t.toUTCString()
    },
    get: function(e) {
        if (!document.cookie)
            return null;
        var n = new RegExp("(?:^|; )" + e + "=([^;]+)")
            , t = document.cookie.match(n);
        return t ? t[1] : null
    },
    del: function(e, n) {
        n = n || "",
            document.cookie = e + "=; domain=" + n + "; path=/; expires=" + new Date((new Date).getTime() - 1e11).toGMTString()
    }
};


var LIBVERSION = "0.7.18"
    , EMPTY = ""
    , UNKNOWN = "?"
    , FUNC_TYPE = "function"
    , UNDEF_TYPE = "undefined"
    , OBJ_TYPE = "object"
    , STR_TYPE = "string"
    , MAJOR = "major"
    , MODEL = "model"
    , NAME = "name"
    , TYPE = "type"
    , VENDOR = "vendor"
    , VERSION = "version"
    , ARCHITECTURE = "architecture"
    , CONSOLE = "console"
    , MOBILE = "mobile"
    , TABLET = "tablet"
    , SMARTTV = "smarttv"
    , WEARABLE = "wearable"
    , EMBEDDED = "embedded";
var util = {
    extend: function(regexes, extensions) {
        var margedRegexes = {};
        for (var i in regexes) {
            if (extensions[i] && extensions[i].length % 2 === 0) {
                margedRegexes[i] = extensions[i].concat(regexes[i])
            } else {
                margedRegexes[i] = regexes[i]
            }
        }
        return margedRegexes
    },
    has: function(str1, str2) {
        if (typeof str1 === "string") {
            return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1
        } else {
            return false
        }
    },
    lowerize: function(str) {
        return str.toLowerCase()
    },
    major: function(version) {
        return typeof version === STR_TYPE ? version.replace(/[^\d\.]/g, "").split(".")[0] : undefined
    },
    trim: function(str) {
        return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "")
    }
};
var mapper = {
    rgx: function(ua, arrays) {
        var i = 0, j, k, p, q, matches, match;
        while (i < arrays.length && !matches) {
            var regex = arrays[i]
                , props = arrays[i + 1];
            j = k = 0;
            while (j < regex.length && !matches) {
                matches = regex[j++].exec(ua);
                if (!!matches) {
                    for (p = 0; p < props.length; p++) {
                        match = matches[++k];
                        q = props[p];
                        if (typeof q === OBJ_TYPE && q.length > 0) {
                            if (q.length == 2) {
                                if (typeof q[1] == FUNC_TYPE) {
                                    this[q[0]] = q[1].call(this, match)
                                } else {
                                    this[q[0]] = q[1]
                                }
                            } else if (q.length == 3) {
                                if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
                                    this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined
                                } else {
                                    this[q[0]] = match ? match.replace(q[1], q[2]) : undefined
                                }
                            } else if (q.length == 4) {
                                this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined
                            }
                        } else {
                            this[q] = match ? match : undefined
                        }
                    }
                }
            }
            i += 2
        }
    },
    str: function(str, map) {
        for (var i in map) {
            if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
                for (var j = 0; j < map[i].length; j++) {
                    if (util.has(map[i][j], str)) {
                        return i === UNKNOWN ? undefined : i
                    }
                }
            } else if (util.has(map[i], str)) {
                return i === UNKNOWN ? undefined : i
            }
        }
        return str
    }
};
var maps = {
    browser: {
        oldsafari: {
            version: {
                "1.0": "/8",
                1.2: "/1",
                1.3: "/3",
                "2.0": "/412",
                "2.0.2": "/416",
                "2.0.3": "/417",
                "2.0.4": "/419",
                "?": "/"
            }
        }
    },
    device: {
        amazon: {
            model: {
                "Fire Phone": ["SD", "KF"]
            }
        },
        sprint: {
            model: {
                "Evo Shift 4G": "7373KT"
            },
            vendor: {
                HTC: "APA",
                Sprint: "Sprint"
            }
        }
    },
    os: {
        windows: {
            version: {
                ME: "4.90",
                "NT 3.11": "NT3.51",
                "NT 4.0": "NT4.0",
                2000: "NT 5.0",
                XP: ["NT 5.1", "NT 5.2"],
                Vista: "NT 6.0",
                7: "NT 6.1",
                8: "NT 6.2",
                8.1: "NT 6.3",
                10: ["NT 6.4", "NT 10.0"],
                RT: "ARM"
            }
        }
    }
};
var regexes = {
    browser: [[/(opera\smini)\/([\w\.-]+)/i, /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, /(opera).+version\/([\w\.]+)/i, /(opera)[\/\s]+([\w\.]+)/i], [NAME, VERSION], [/(opios)[\/\s]+([\w\.]+)/i], [[NAME, "Opera Mini"], VERSION], [/\s(opr)\/([\w\.]+)/i], [[NAME, "Opera"], VERSION], [/(kindle)\/([\w\.]+)/i, /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i, /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i, /(?:ms|\()(ie)\s([\w\.]+)/i, /(rekonq)\/([\w\.]*)/i, /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark)\/([\w\.-]+)/i], [NAME, VERSION], [/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i], [[NAME, "IE"], VERSION], [/(edge|edgios|edgea)\/((\d+)?[\w\.]+)/i], [[NAME, "Edge"], VERSION], [/(yabrowser)\/([\w\.]+)/i], [[NAME, "Yandex"], VERSION], [/(puffin)\/([\w\.]+)/i], [[NAME, "Puffin"], VERSION], [/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i], [[NAME, "UCBrowser"], VERSION], [/(comodo_dragon)\/([\w\.]+)/i], [[NAME, /_/g, " "], VERSION], [/(micromessenger)\/([\w\.]+)/i], [[NAME, "WeChat"], VERSION], [/(qqbrowserlite)\/([\w\.]+)/i], [NAME, VERSION], [/(QQ)\/([\d\.]+)/i], [NAME, VERSION], [/m?(qqbrowser)[\/\s]?([\w\.]+)/i], [NAME, VERSION], [/(BIDUBrowser)[\/\s]?([\w\.]+)/i], [NAME, VERSION], [/(2345Explorer)[\/\s]?([\w\.]+)/i], [NAME, VERSION], [/(MetaSr)[\/\s]?([\w\.]+)/i], [NAME], [/(LBBROWSER)/i], [NAME], [/xiaomi\/miuibrowser\/([\w\.]+)/i], [VERSION, [NAME, "MIUI Browser"]], [/;fbav\/([\w\.]+);/i], [VERSION, [NAME, "Facebook"]], [/headlesschrome(?:\/([\w\.]+)|\s)/i], [VERSION, [NAME, "Chrome Headless"]], [/\swv\).+(chrome)\/([\w\.]+)/i], [[NAME, /(.+)/, "$1 WebView"], VERSION], [/((?:oculus|samsung)browser)\/([\w\.]+)/i], [[NAME, /(.+(?:g|us))(.+)/, "$1 $2"], VERSION], [/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i], [VERSION, [NAME, "Android Browser"]], [/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i], [NAME, VERSION], [/(dolfin)\/([\w\.]+)/i], [[NAME, "Dolphin"], VERSION], [/((?:android.+)crmo|crios)\/([\w\.]+)/i], [[NAME, "Chrome"], VERSION], [/(coast)\/([\w\.]+)/i], [[NAME, "Opera Coast"], VERSION], [/fxios\/([\w\.-]+)/i], [VERSION, [NAME, "Firefox"]], [/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i], [VERSION, [NAME, "Mobile Safari"]], [/version\/([\w\.]+).+?(mobile\s?safari|safari)/i], [VERSION, NAME], [/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i], [[NAME, "GSA"], VERSION], [/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [/(konqueror)\/([\w\.]+)/i, /(webkit|khtml)\/([\w\.]+)/i], [NAME, VERSION], [/(navigator|netscape)\/([\w\.-]+)/i], [[NAME, "Netscape"], VERSION], [/(swiftfox)/i, /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i, /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i, /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i, /(links)\s\(([\w\.]+)/i, /(gobrowser)\/?([\w\.]*)/i, /(ice\s?browser)\/v?([\w\._]+)/i, /(mosaic)[\/\s]([\w\.]+)/i], [NAME, VERSION]],
    cpu: [[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i], [[ARCHITECTURE, "amd64"]], [/(ia32(?=;))/i], [[ARCHITECTURE, util.lowerize]], [/((?:i[346]|x)86)[;\)]/i], [[ARCHITECTURE, "ia32"]], [/windows\s(ce|mobile);\sppc;/i], [[ARCHITECTURE, "arm"]], [/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i], [[ARCHITECTURE, /ower/, "", util.lowerize]], [/(sun4\w)[;\)]/i], [[ARCHITECTURE, "sparc"]], [/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i], [[ARCHITECTURE, util.lowerize]]],
    device: [[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i], [MODEL, VENDOR, [TYPE, TABLET]], [/applecoremedia\/[\w\.]+ \((ipad)/], [MODEL, [VENDOR, "Apple"], [TYPE, TABLET]], [/(apple\s{0,1}tv)/i], [[MODEL, "Apple TV"], [VENDOR, "Apple"]], [/(archos)\s(gamepad2?)/i, /(hp).+(touchpad)/i, /(hp).+(tablet)/i, /(kindle)\/([\w\.]+)/i, /\s(nook)[\w\s]+build\/(\w+)/i, /(dell)\s(strea[kpr\s\d]*[\dko])/i], [VENDOR, MODEL, [TYPE, TABLET]], [/(kf[A-z]+)\sbuild\/.+silk\//i], [MODEL, [VENDOR, "Amazon"], [TYPE, TABLET]], [/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, "Amazon"], [TYPE, MOBILE]], [/\((ip[honed|\s\w*]+);.+(apple)/i], [MODEL, VENDOR, [TYPE, MOBILE]], [/\((ip[honed|\s\w*]+);/i], [MODEL, [VENDOR, "Apple"], [TYPE, MOBILE]], [/(blackberry)[\s-]?(\w+)/i, /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i, /(hp)\s([\w\s]+\w)/i, /(asus)-?(\w+)/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/\(bb10;\s(\w+)/i], [MODEL, [VENDOR, "BlackBerry"], [TYPE, MOBILE]], [/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i], [MODEL, [VENDOR, "Asus"], [TYPE, TABLET]], [/(sony)\s(tablet\s[ps])\sbuild\//i, /(sony)?(?:sgp.+)\sbuild\//i], [[VENDOR, "Sony"], [MODEL, "Xperia Tablet"], [TYPE, TABLET]], [/android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i], [MODEL, [VENDOR, "Sony"], [TYPE, MOBILE]], [/\s(ouya)\s/i, /(nintendo)\s([wids3u]+)/i], [VENDOR, MODEL, [TYPE, CONSOLE]], [/android.+;\s(shield)\sbuild/i], [MODEL, [VENDOR, "Nvidia"], [TYPE, CONSOLE]], [/(playstation\s[34portablevi]+)/i], [MODEL, [VENDOR, "Sony"], [TYPE, CONSOLE]], [/(sprint\s(\w+))/i], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i], [VENDOR, MODEL, [TYPE, TABLET]], [/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, /(zte)-(\w*)/i, /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i], [VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]], [/(nexus\s9)/i], [MODEL, [VENDOR, "HTC"], [TYPE, TABLET]], [/d\/huawei([\w\s-]+)[;\)]/i, /(nexus\s6p)/i], [MODEL, [VENDOR, "Huawei"], [TYPE, MOBILE]], [/(microsoft);\s(lumia[\s\w]+)/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/[\s\(;](xbox(?:\sone)?)[\s\);]/i], [MODEL, [VENDOR, "Microsoft"], [TYPE, CONSOLE]], [/(kin\.[onetw]{3})/i], [[MODEL, /\./g, " "], [VENDOR, "Microsoft"], [TYPE, MOBILE]], [/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i, /mot[\s-]?(\w*)/i, /(XT\d{3,4}) build\//i, /(nexus\s6)/i], [MODEL, [VENDOR, "Motorola"], [TYPE, MOBILE]], [/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i], [MODEL, [VENDOR, "Motorola"], [TYPE, TABLET]], [/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [/hbbtv.+maple;(\d+)/i], [[MODEL, /^/, "SmartTV"], [VENDOR, "Samsung"], [TYPE, SMARTTV]], [/\(dtv[\);].+(aquos)/i], [MODEL, [VENDOR, "Sharp"], [TYPE, SMARTTV]], [/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i, /((SM-T\w+))/i], [[VENDOR, "Samsung"], MODEL, [TYPE, TABLET]], [/smart-tv.+(samsung)/i], [VENDOR, [TYPE, SMARTTV], MODEL], [/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i, /(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i, /sec-((sgh\w+))/i], [[VENDOR, "Samsung"], MODEL, [TYPE, MOBILE]], [/sie-(\w*)/i], [MODEL, [VENDOR, "Siemens"], [TYPE, MOBILE]], [/(maemo|nokia).*(n900|lumia\s\d+)/i, /(nokia)[\s_-]?([\w-]*)/i], [[VENDOR, "Nokia"], MODEL, [TYPE, MOBILE]], [/android\s3\.[\s\w;-]{10}(a\d{3})/i], [MODEL, [VENDOR, "Acer"], [TYPE, TABLET]], [/android.+([vl]k\-?\d{3})\s+build/i], [MODEL, [VENDOR, "LG"], [TYPE, TABLET]], [/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i], [[VENDOR, "LG"], MODEL, [TYPE, TABLET]], [/(lg) netcast\.tv/i], [VENDOR, MODEL, [TYPE, SMARTTV]], [/(nexus\s[45])/i, /lg[e;\s\/-]+(\w*)/i, /android.+lg(\-?[\d\w]+)\s+build/i], [MODEL, [VENDOR, "LG"], [TYPE, MOBILE]], [/android.+(ideatab[a-z0-9\-\s]+)/i], [MODEL, [VENDOR, "Lenovo"], [TYPE, TABLET]], [/linux;.+((jolla));/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/((pebble))app\/[\d\.]+\s/i], [VENDOR, MODEL, [TYPE, WEARABLE]], [/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i], [VENDOR, MODEL, [TYPE, MOBILE]], [/crkey/i], [[MODEL, "Chromecast"], [VENDOR, "Google"]], [/android.+;\s(glass)\s\d/i], [MODEL, [VENDOR, "Google"], [TYPE, WEARABLE]], [/android.+;\s(pixel c)\s/i], [MODEL, [VENDOR, "Google"], [TYPE, TABLET]], [/android.+;\s(pixel xl|pixel)\s/i], [MODEL, [VENDOR, "Google"], [TYPE, MOBILE]], [/android.+;\s(\w+)\s+build\/hm\1/i, /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i, /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, MOBILE]], [/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i], [[MODEL, /_/g, " "], [VENDOR, "Xiaomi"], [TYPE, TABLET]], [/android.+;\s(m[1-5]\snote)\sbuild/i], [MODEL, [VENDOR, "Meizu"], [TYPE, TABLET]], [/android.+a000(1)\s+build/i, /android.+oneplus\s(a\d{4})\s+build/i], [MODEL, [VENDOR, "OnePlus"], [TYPE, MOBILE]], [/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i], [MODEL, [VENDOR, "RCA"], [TYPE, TABLET]], [/android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i], [MODEL, [VENDOR, "Dell"], [TYPE, TABLET]], [/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i], [MODEL, [VENDOR, "Verizon"], [TYPE, TABLET]], [/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i], [[VENDOR, "Barnes & Noble"], MODEL, [TYPE, TABLET]], [/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i], [MODEL, [VENDOR, "NuVision"], [TYPE, TABLET]], [/android.+;\s(k88)\sbuild/i], [MODEL, [VENDOR, "ZTE"], [TYPE, TABLET]], [/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i], [MODEL, [VENDOR, "Swiss"], [TYPE, MOBILE]], [/android.+[;\/]\s*(zur\d{3})\s+build/i], [MODEL, [VENDOR, "Swiss"], [TYPE, TABLET]], [/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i], [MODEL, [VENDOR, "Zeki"], [TYPE, TABLET]], [/(android).+[;\/]\s+([YR]\d{2})\s+build/i, /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i], [[VENDOR, "Dragon Touch"], MODEL, [TYPE, TABLET]], [/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i], [MODEL, [VENDOR, "Insignia"], [TYPE, TABLET]], [/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i], [MODEL, [VENDOR, "NextBook"], [TYPE, TABLET]], [/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i], [[VENDOR, "Voice"], MODEL, [TYPE, MOBILE]], [/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i], [[VENDOR, "LvTel"], MODEL, [TYPE, MOBILE]], [/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i], [MODEL, [VENDOR, "Envizen"], [TYPE, TABLET]], [/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i], [VENDOR, MODEL, [TYPE, TABLET]], [/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i], [MODEL, [VENDOR, "MachSpeed"], [TYPE, TABLET]], [/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i], [VENDOR, MODEL, [TYPE, TABLET]], [/android.+[;\/]\s*TU_(1491)\s+build/i], [MODEL, [VENDOR, "Rotor"], [TYPE, TABLET]], [/android.+(KS(.+))\s+build/i], [MODEL, [VENDOR, "Amazon"], [TYPE, TABLET]], [/android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i], [VENDOR, MODEL, [TYPE, TABLET]], [/\s(tablet|tab)[;\/]/i, /\s(mobile)(?:[;\/]|\ssafari)/i], [[TYPE, util.lowerize], VENDOR, MODEL], [/(android[\w\.\s\-]{0,9});.+build/i], [MODEL, [VENDOR, "Generic"]]],
    engine: [[/windows.+\sedge\/([\w\.]+)/i], [VERSION, [NAME, "EdgeHTML"]], [/(presto)\/([\w\.]+)/i, /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, /(icab)[\/\s]([23]\.[\d\.]+)/i], [NAME, VERSION], [/rv\:([\w\.]{1,9}).+(gecko)/i], [VERSION, NAME]],
    os: [[/microsoft\s(windows)\s(vista|xp)/i], [NAME, VERSION], [/(windows)\snt\s6\.2;\s(arm)/i, /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i], [[NAME, "Windows"], [VERSION, mapper.str, maps.os.windows.version]], [/\((bb)(10);/i], [[NAME, "BlackBerry"], VERSION], [/(blackberry)\w*\/?([\w\.]*)/i, /(tizen)[\/\s]([\w\.]+)/i, /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]*)/i, /linux;.+(sailfish);/i], [NAME, VERSION], [/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i], [[NAME, "Symbian"], VERSION], [/\((series40);/i], [NAME], [/mozilla.+\(mobile;.+gecko.+firefox/i], [[NAME, "Firefox OS"], VERSION], [/(nintendo|playstation)\s([wids34portablevu]+)/i, /(mint)[\/\s\(]?(\w*)/i, /(mageia|vectorlinux)[;\s]/i, /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i, /(hurd|linux)\s?([\w\.]*)/i, /(gnu)\s?([\w\.]*)/i], [NAME, VERSION], [/(cros)\s[\w]+\s([\w\.]+\w)/i], [[NAME, "Chromium OS"], VERSION], [/(sunos)\s?([\w\.\d]*)/i], [[NAME, "Solaris"], VERSION], [/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i], [NAME, VERSION], [/(haiku)\s(\w+)/i], [NAME, VERSION], [/cfnetwork\/.+darwin/i, /ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i], [[VERSION, /_/g, "."], [NAME, "iOS"]], [/(mac\sos\sx)\s?([\w\s\.]*)/i, /(macintosh|mac(?=_powerpc)\s)/i], [[NAME, "Mac OS"], [VERSION, /_/g, "."]], [/((?:open)?solaris)[\/\s-]?([\w\.]*)/i, /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i, /(unix)\s?([\w\.]*)/i], [NAME, VERSION]]
};
var UAParser = function(uastring, extensions) {
    if (typeof uastring === "object") {
        extensions = uastring;
        uastring = undefined
    }
    if (!(this instanceof UAParser)) {
        return new UAParser(uastring,extensions).getResult()
    }
    var ua = uastring || (window && window.navigator && window.navigator.userAgent ? window.navigator.userAgent : EMPTY);
    var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
    this.getBrowser = function() {
        var browser = {
            name: undefined,
            version: undefined
        };
        mapper.rgx.call(browser, ua, rgxmap.browser);
        browser.major = util.major(browser.version);
        return browser
    }
    ;
    this.getCPU = function() {
        var cpu = {
            architecture: undefined
        };
        mapper.rgx.call(cpu, ua, rgxmap.cpu);
        return cpu
    }
    ;
    this.getDevice = function() {
        var device = {
            vendor: undefined,
            model: undefined,
            type: undefined
        };
        mapper.rgx.call(device, ua, rgxmap.device);
        return device
    }
    ;
    this.getEngine = function() {
        var engine = {
            name: undefined,
            version: undefined
        };
        mapper.rgx.call(engine, ua, rgxmap.engine);
        return engine
    }
    ;
    this.getOS = function() {
        var os = {
            name: undefined,
            version: undefined
        };
        mapper.rgx.call(os, ua, rgxmap.os);
        return os
    }
    ;
    this.getResult = function() {
        return {
            ua: this.getUA(),
            browser: this.getBrowser(),
            engine: this.getEngine(),
            os: this.getOS(),
            device: this.getDevice(),
            cpu: this.getCPU()
        }
    }
    ;
    this.getUA = function() {
        return ua
    }
    ;
    this.setUA = function(uastring) {
        ua = uastring;
        return this
    }
    ;
    return this
};
UAParser.VERSION = LIBVERSION;
UAParser.BROWSER = {
    NAME: NAME,
    MAJOR: MAJOR,
    VERSION: VERSION
};
UAParser.CPU = {
    ARCHITECTURE: ARCHITECTURE
};
UAParser.DEVICE = {
    MODEL: MODEL,
    VENDOR: VENDOR,
    TYPE: TYPE,
    CONSOLE: CONSOLE,
    MOBILE: MOBILE,
    SMARTTV: SMARTTV,
    TABLET: TABLET,
    WEARABLE: WEARABLE,
    EMBEDDED: EMBEDDED
};
UAParser.ENGINE = {
    NAME: NAME,
    VERSION: VERSION
};
UAParser.OS = {
    NAME: NAME,
    VERSION: VERSION
};
if (typeof exports !== UNDEF_TYPE) {
    if (typeof module !== UNDEF_TYPE && module.exports) {
        exports = module.exports = UAParser
    }
    exports.UAParser = UAParser
} else {
    if (typeof define === FUNC_TYPE && define.amd) {
        define(function() {
            return UAParser
        })
    } else if (window) {
        window.UAParser = UAParser
    }
}
var $ = window && (window.jQuery || window.Zepto);
if (typeof $ !== UNDEF_TYPE) {
    var parser = new UAParser;
    $.ua = parser.getResult();
    $.ua.get = function() {
        return parser.getUA()
    }
    ;
    $.ua.set = function(uastring) {
        parser.setUA(uastring);
        var result = parser.getResult();
        for (var prop in result) {
            $.ua[prop] = result[prop]
        }
    }
}

function initSfJs(e, r, i, n, o, t, a, s, u) {
    function c(e) {
        return "string" == typeof e || (l.debug && console.error("Your value is not a string"),
            !1)
    }
    function d(e) {
        if (void 0 === e && (e = ""),
            !e)
            return {};
        for (var r = {}, i = e.replace(/^[#\?]/, "").split("&"), n = 0; n < i.length; n++) {
            var o = i[n].split("=")
                , t = decodeURIComponent(o[0])
                , a = "";
            2 == o.length ? a = o[1] : o.length > 2 && (a = o.slice(1).join("=")),
                r[t] = a
        }
        return r
    }
    var l = {
        lang: e,
        isRtlLanguage: u,
        cookieDomain: r,
        openxHost: i,
        openxEnabled: n,
        openxAutorun: !0,
        gaTrackers: {
            televzrIos: {
                id: "UA-7055055-41",
                sendPageview: !0
            },
            televzrAndroid: {
                id: "UA-7055055-42",
                sendPageview: !0
            }
        },
        channel: [],
        cdnRoot: s || "/"
    };
    l.uaParser = new UAParser,
        l.ua = l.uaParser.getUA(),
        l.browser = l.uaParser.getBrowser() || {},
        l.device = l.uaParser.getDevice() || {},
        l.os = l.uaParser.getOS() || {},
        l.country = o || "CN",
    l.country && (l.country = l.country.toLowerCase()),
        l.countryTier = {
            tier1: ["au", "ca", "gb", "nz", "us"],
            tier2: ["at", "be", "ch", "cz", "de", "dk", "es", "fr", "ie", "it", "nl", "pt"],
            cis: ["az", "am", "by", "kg", "kz", "md", "ru", "tj", "ua", "uz"]
        },
        l.countryTierName = function() {
            if (!l.country || !l.countryTier)
                return "";
            for (var e in l.countryTier)
                if (l.countryTier.hasOwnProperty(e) && l.countryTier[e].indexOf(l.country) > -1)
                    return e;
            return ""
        }(),
        l.query = d() || {},
        l.hash = d(location.hash) || {},
        l.requestedWithApp = {
            "com.inc_3205.televzr": "televzr",
            "com.inc_3205.televzr_player": "televzr",
            "reactivephone.msearch": "smartsearch"
        };
    var p = {
        televzr: "tz_in_app"
    };
    l.extraExperiments = [],
        l.extraExperiments.has = function(e) {
            if ("Array" !== e.constructor.name)
                return l.debug && console.error('Prop "expNames" is not an array'),
                    !1;
            for (var r = 0; r < e.length; r++) {
                if (!1 === c(e[r]))
                    return !1;
                if (-1 !== this.indexOf(e[r]))
                    return !0
            }
            return !1
        }
        ,
        l.extraExperiments.add = function(e) {
            return !1 !== c(e) && (!1 === this.has([e]) && this.push(e),
                !0)
        }
        ,
        l.extraExperiments.remove = function(e) {
            if (!1 === c(e))
                return !1;
            const r = this.indexOf(e);
            return -1 !== r && (this.splice(r, 1),
                !0)
        }
        ,
        function(e) {
            l.applications = e;
            var r = l.query.app || l.hash.app || l.query.from || l.hash.from || "";
            if (!r)
                // if ((r = cookie.get("x-requested-with")) && l.requestedWithApp[r])
                if (null)
                    r = l.requestedWithApp[r];
                else if (p)
                    for (var i in p)
                        p.hasOwnProperty(i) && l.ua.indexOf(p[i]) > -1 && (r = i);
            r && -1 != l.applications.indexOf(r) && (l.app = r)
        }(t),
        function() {
            var e = ["Android", "Bada", "BlackBerry", "Firefox OS", "iOS", "MeeGo", "Sailfish", "Series40", "Symbian", "Tizen", "WebOS", "Windows Phone"];
            if (!l.device.type && l.os.name && e.indexOf(l.os.name) > -1 && (l.device.type = "mobile"),
            l.device.type && ("tablet" == l.device.type ? (l.mobile = !0,
                $("html").addClass("tablet")) : "mobile" != l.device.type && "wearable" != l.device.type || (l.mobile = !0,
                $("html").addClass("mobile"))),
                l.mobile) {
                var r = ["Android Browser", "Chrome", "Chrome Mobile", "Chrome Mobile iOS", "Edge Mobile", "IE Mobile", "Fennec", "Firefox", "Firefox Mobile", "Opera", "Opera Mobile", "Opera Mini", "Safari", "Mobile Safari", "UCBrowser", "UC Browser", "Yandex", "Yandex Browser"];
                l.browser.inApp = !1,
                l.browser.name && -1 === r.indexOf(l.browser.name) && (l.browser.inApp = !0)
            }
        }(),
        function() {
            l.user = {
                loggedIn: null
            },
                l.user.loggedIn && "0" != l.user.loggedIn ? "televzr" != l.user.loggedIn && "email" != l.user.loggedIn && (l.user.loggedIn = !0) : l.user.loggedIn = !1
        }(),
        function() {
            l.stats = {
                uid: a || ""
            },
            // a || (l.stats.uid = cookie.get("uid"),
            a || (l.stats.uid =null,
            l.stats.uid || (l.stats.uid = function() {
                var e, r = "0123456789abcdef".split(""), i = [];
                for (e = 0; e < 16; e++)
                    i[e] = r[0 | 16 * Math.random()];
                return i.join("")
            }(),
                cookie.set("uid", l.stats.uid, 3650, l.cookieDomain)))
                // cookie=l.stats.uid


        }(),
        window._sf = l
    return document.cookie.split(';')[0].split("=")[1]
}

var uid=initSfJs("en",".savefrom.net","rek.savefrom.net",true,"",["sf-android","televzr","smartsearch","android-light"],"","\/\/sfstatic.net\/",false);
return uid

}
// console.log(get_cookie_uid())

猜你喜欢

转载自blog.csdn.net/wu0che28/article/details/86163145