1+ // ==UserScript==
2+ // @name VIP视频破解
3+ // @name :en VIP Video Cracker
4+ // @namespace hoothin
5+ // @version 1.4.1
6+ // @description 解析并破解各大视频站的VIP权限
7+ // @description :en Crack VIP permissions of some chinese video sites
8+ // @author hoothin
9+ // @include *://v.qq.com/x/*
10+ // @include *://*.mgtv.com/b/*
11+ // @include *://*.le.com/ptv/vplay/*
12+ // @include *://v.youku.com/v_show/*
13+ // @include *://*.iqiyi.com/v_*
14+ // @include *://*.iqiyi.com/dianying/*
15+ // @include *://*.tudou.com/albumplay/*
16+ // @include *://*.tudou.com/listplay/*
17+ // @include *://*.tudou.com/programs/view/*
18+ // @include *://*.wasu.cn/Play/show/id/*
19+ // @include *://tv.sohu.com/*
20+ // @include *://film.sohu.com/album/*
21+ // @include *://ddp.vip.pptv.com/vod_detail/*
22+ // @include *://*.pptv.com/show/*
23+ // @include *://www.acfun.cn/v/*
24+ // @include *://*.fun.tv/vplay/*
25+ // @include *://vip.1905.com/play/*
26+ // @include *://vip.pptv.com/show/*
27+ // @include *://v.yinyuetai.com/video/*
28+ // @include *://v.yinyuetai.com/playlist/*
29+ // @include *://www.bilibili.com/video/*
30+ // @exclude *?url=*
31+ // @exclude *?qt=*
32+ // @exclude *?v=*
33+ // @grant GM_setValue
34+ // @grant GM_getValue
35+ // @grant GM_openInTab
36+ // @grant unsafeWindow
37+ // @license MIT License
38+ // ==/UserScript==
39+
40+ ( function ( ) {
41+ 'use strict' ;
42+ var cracks = [
43+ { name :"47影视云" , url :"http://api.47ks.com/webcloud/?v=%s" } ,
44+ { name :"疯狂解析" , url :"http://vip.ifkdy.com/?url=%s" } ,
45+ { name :"无名小站1" , url :"http://www.wmxz.wang/video.php?url=%s" } ,
46+ { name :"无名小站2" , url :"http://www.sfsft.com/admin.php?url=%s" } ,
47+ { name :"71ki解析" , url :"http://jx.71ki.com/tong.php?url=%s" } ,
48+ { name :"VIP看看" , url :"http://2.jx.72du.com/video.php?url=%s" } ,
49+ { name :"歪歪电影" , url :"http://www.yydy8.com/common/?url=%s" } ,
50+ { name :"10号影院" , url :"http://player.gakui.top/?url=%s" } ,
51+ { name :"Relon" , url :"http://yyygwz.com/index.php?url=%s" } ,
52+ { name :"爱看TV" , url :"http://aikan-tv.com/tong.php?url=%s" } ,
53+ { name :"迷失之梦" , url :"http://mt2t.com/yun?url=%s" } ,
54+ { name :"SO视频" , url :"http://parse.colaparse.cc/jx1.php?url=%s" } ,
55+ { name :"Moondown" , url :"http://moon.moondown.net/tong.php?url=%s" } ,
56+ { name :"选片网" , url :"http://jx.xuanpianwang.com/parse?url=%s" } ,
57+ { name :"云上" , url :"http://www.ou522.cn/t2/1.php?url=%s" } ,
58+ { name :"小海解析" , url :"http://jx.ck921.com/?url=%s" } ,
59+ { name :"强强卷" , url :"http://000o.cc/jx/ty.php?url==%s" } ,
60+ { name :"Lewei369" , url :"http://s1y2.com/?url=%s" } ,
61+ { name :"紫狐云" , url :"http://yun.zihu.tv/play.html?url=%s" } ,
62+ { name :"眼睛会下雨" , url :"http://www.vipjiexi.com/yun.php?url=%s" } ,
63+ { name :"土豪网" , url :"http://www.tuhao13.com/yunparse/index.php?url=%s" } ,
64+ { name :"舞动秋天" , url :"http://qtzr.net/s/?qt=%s" } ,
65+ { name :"CloudParse" , url :"http://api.cloudparse.com/?url=%s" }
66+ ] , video ;
67+ var vipVideoCrackJump = GM_getValue ( "vipVideoCrackJump" ) ;
68+ var vipVideoCrackUrl = GM_getValue ( "vipVideoCrackUrl" ) ;
69+ var selectStyle = document . createElement ( "style" ) ;
70+ selectStyle . innerHTML = ".crackJump{margin-left:5px;color:white;text-shadow:#000 1px 0 0,#000 0 1px 0,#000 -1px 0 0,#000 0 -1px 0;-webkit-text-shadow:#000 1px 0 0,#000 0 1px 0,#000 -1px 0 0,#000 0 -1px 0;-moz-text-shadow:#000 1px 0 0,#000 0 1px 0,#000 -1px 0 0,#000 0 -1px 0;*filter: Glow(color=#000, strength=1);}.vipSelect{background:black;color:white;width:88px;}.crackArea{position:absolute;z-index:999999;left:0px;top:0px;opacity:0.50;filter:alpha(opacity=50);transition:opacity 0.3s ease,width 0.3s ease;width:95px;overflow:hidden;white-space:nowrap;}.crackArea:hover{opacity:1;filter:alpha(opacity=100);width:161px;}" ;
71+ document . getElementsByTagName ( "head" ) [ 0 ] . appendChild ( selectStyle ) ;
72+ var select = document . createElement ( "select" ) ;
73+ select . className = "vipSelect" ;
74+ select . innerHTML = "<option value=''>VIP视频解析</option>" ;
75+ if ( ! GM_getValue ( "hacgGodTurnVisited" ) ) {
76+ select . innerHTML += "<option value='https://greasyfork.org/scripts/23316/code/hacg.user.js'>\u2605\u0020\u8001\u53f8\u673a\u811a\u672c\u0020\u2605</option>" ;
77+ }
78+ cracks . forEach ( function ( item ) {
79+ var optionStr = "<option value='" + item . url + "'>" + item . name + "</option>" ;
80+ select . innerHTML += optionStr ;
81+ } ) ;
82+ select . onchange = function ( ) {
83+ var value = select . options [ select . options . selectedIndex ] . value ;
84+ if ( value ) {
85+ window . open ( value . replace ( "%s" , location . href ) ) ;
86+ if ( value == "https://greasyfork.org/scripts/23316/code/hacg.user.js" ) {
87+ GM_setValue ( "hacgGodTurnVisited" , true ) ;
88+ select . options . remove ( select . options . selectedIndex ) ;
89+ } else {
90+ vipVideoCrackUrl = value ;
91+ GM_setValue ( "vipVideoCrackUrl" , vipVideoCrackUrl ) ;
92+ video . parentNode . removeChild ( video ) ;
93+ }
94+ select . options . selectedIndex = 0 ;
95+ }
96+ } ;
97+ var quickAccess = document . createElement ( "label" ) ;
98+ quickAccess . className = "crackJump" ;
99+ quickAccess . innerHTML = "<input type='checkbox'>立即跳转" ;
100+ var jumpCheck = quickAccess . querySelector ( "input" ) ;
101+ jumpCheck . onclick = function ( ) {
102+ vipVideoCrackJump = jumpCheck . checked ;
103+ GM_setValue ( "vipVideoCrackJump" , vipVideoCrackJump ) ;
104+ crackJump ( ) ;
105+ } ;
106+ var crackArea = document . createElement ( "div" ) ;
107+ crackArea . className = "crackArea" ;
108+ crackArea . appendChild ( select ) ;
109+ crackArea . appendChild ( quickAccess ) ;
110+ var placeholder = document . createElement ( "div" ) ;
111+ placeholder . style . cssText = "width:100%;height:100%;text-align:center;font-size:x-large;cursor:pointer;" ;
112+ placeholder . innerHTML = "点击恢复视频播放" ;
113+ function crackJump ( ) {
114+ if ( vipVideoCrackJump ) {
115+ var value = vipVideoCrackUrl ?vipVideoCrackUrl :cracks [ 0 ] . url ;
116+ GM_openInTab ( value . replace ( "%s" , location . href ) , false ) ;
117+ if ( video . parentNode ) {
118+ video . parentNode . replaceChild ( placeholder , video ) ;
119+ }
120+ }
121+ }
122+ var si = setInterval ( function ( ) {
123+ [ ] . every . call ( document . querySelectorAll ( "object,embed" ) , function ( item ) {
124+ var style = getComputedStyle ( item , null ) ;
125+ if ( style . width . replace ( "px" , "" ) > 100 && style . height . replace ( "px" , "" ) > 100 ) {
126+ video = item ;
127+ return false ;
128+ }
129+ return true ;
130+ } ) ;
131+ if ( video ) {
132+ clearInterval ( si ) ;
133+ var videoParent = video . parentNode ;
134+ videoParent . appendChild ( crackArea ) ;
135+ videoParent . addEventListener ( "click" , function ( ) {
136+ if ( ! video . parentNode ) {
137+ videoParent . replaceChild ( video , placeholder ) ;
138+ }
139+ } ) ;
140+ placeholder . style . lineHeight = getComputedStyle ( videoParent ) . height ;
141+ if ( vipVideoCrackJump ) {
142+ jumpCheck . checked = true ;
143+ }
144+ crackJump ( ) ;
145+ var pushState = unsafeWindow . history . pushState ;
146+ var replaceState = unsafeWindow . history . replaceState ;
147+ unsafeWindow . history . pushState = function ( state ) {
148+ setTimeout ( function ( ) { crackJump ( ) ; } , 1 ) ;
149+ return pushState . apply ( history , arguments ) ;
150+ } ;
151+ unsafeWindow . history . replaceState = function ( state ) {
152+ setTimeout ( function ( ) { crackJump ( ) ; } , 1 ) ;
153+ return replaceState . apply ( history , arguments ) ;
154+ } ;
155+ } else {
156+ //console.log("no player!");
157+ }
158+ } , 500 ) ;
159+ } ) ( ) ;
0 commit comments