字幕ダウンロード テキスト

字幕ダウンロード テキスト


スポンサーリンク

Viki専用の字幕抜きスクリプトです。(VikiPASS動画にも利用できます。)Vikiでの利用規約ではダウンロードは禁止されていますが利用規約の正式な手続きが無いことと、字幕はテキスト扱いになるので配布などしない限りはダウンロードをしても法律的には違法ではないはずです。


メモ帳を開きます。


ブログ内の字幕ダウンロード テキストをコピー


メモ帳に貼り付け


名前を付けて保存。(名前はなんでも良いです。)

 → 
保存したテキストファイルの拡張子を変更。
「txt」 → 「js」又は「jse」
拡張子が表示されない場合はコントロールパネルから設定して下さい。
(windows10では左下ウインドウズマークを右クリック)

解説URL→http://lxvxl.com/article/216360486.html


完成

これを開き、URLを入力。日本語ファイルがある場合はダウンロードされます。ファイルは「srt」です。
(ダウンロードファイルは「srt」ですが「srt」を「txt」に書き換えればテキストとして開くことが出来ます。)


↓↓字幕ダウンロード テキスト↓↓

/*************************************************************
* caption.js
* ViKi (http://www.viki.com/) の字幕ファイルを取得します
**************************************************************/

//setting
var _Set = {};
_Set.SubtitleLanguage = [ "ja" ];
_Set.Extension = "srt";
_Set.showSubtitleData = false;


//restart if 64bit WSH
restartScript();


//script path の取得
var objFs = new ActiveXObject( "Scripting.FileSystemObject" );
var strScriptFolderPath = objFs.GetParentFolderName( WScript.ScriptFullName );


//objHttp作成。
try {
var objHttp = new ActiveXObject( "WinHttp.WinHttpRequest.5.1" );
} catch( e ) {
objHttp = null;
}
if ( !objHttp ) {
WScript.Echo( "objHttpの作成に失敗。\n終了します。" );
WScript.Quit();
}


//url->vidの取得
var objIBox = new clsInputBox();
if ( !objIBox.isOK ) {
WScript.Echo( "インプットボックスを作成できませんでした。\n終了します。" );
WScript.Quit();
}
var retIb = objIBox.InputBox(
"字幕を取得したい動画のページURLを入力してください。",
"スクリプトより", "http://"
);
if ( !retIb ) WScript.Quit();
var url = trim( retIb );

if ( url.match( /^(\d+)v?$/i ) ) {
var vid = RegExp.$1;
} else {
vid = getVid( url );
if ( !vid ) {
var rdurl = getRedirect( url, objHttp );
vid = getVid( rdurl );
}
}

if ( !vid ) {
WScript.Echo( "このURLから字幕の取得ができません。\n" + url + "\n\n終了します。" );
WScript.Quit();
}


//arrSubを決定。settingに固定
var arrSub = [];
var objDat = getData( vid, objHttp );
//取得言語を、settingに固定せず、ユーザー入力にしたい場合は、
//このあたりにコードを書き加えてください。
arrSub = _Set.SubtitleLanguage;
if ( _Set.showSubtitleData ) {
var arrShow = [];
for ( var i = 0; i < arrSub.length; i++ ) {
arrShow.push( "title1(" + arrSub[i] + ") : " + objDat.ctitles[arrSub[i]]
+ "\ntitle2(" + arrSub[i] + ") : " + objDat.ttitles[arrSub[i]]
+ "\nsub(" + arrSub[i] + ") : " + ( (typeof objDat.subs[arrSub[i]] == "number")? (objDat.subs[arrSub[i]] + "%"): "not found" )
);
}
WScript.Echo( "title:\n" + objDat.title + "\n\n" + arrShow.join( "\n\n" ) );
}

//objStreamの作成
try{
var objStream = new ActiveXObject( "ADODB.Stream" );
} catch( e ) {
WScript.Echo( "objStream の作成に失敗" );
WScript.Quit();
}


//download->save
var arrErr = [];
var st_0 = "http://api.viki.io",
st_1 = "/v4/videos/",
st_2 = "v/subtitles/",
st_3 = "?app=65535a&t=",
st_4 = "&site=www.viki.com",
st_5 = "&sig=";
var objHash = ( new clsSHA1 ).Hash_Viki();
var title = ( objDat.title? objDat.title: "sub" ) + "_" + vid + "_";
var diff = ( typeof objDat.timediff == "number" )? objDat.timediff+1: 15;

for ( var i = 0; i < arrSub.length; i++ ) {
var t = Math.floor( new Date().getTime() / 1000 ) - diff;
var suburl = st_1 + vid + st_2 + arrSub[i] + "." + _Set.Extension + st_3 + t + st_4;
var hash = objHash.getHash_viki( suburl );
suburl = st_0 + suburl + st_5 + hash;

try {
objHttp.Open( "GET", suburl, false );
objHttp.Send();
status = objHttp.status;
} catch( e ) {
arrErr.push( e.description );
status = -1;
}
if ( status != 200 ) {
arrErr.push( "言語 " + arrSub[i] + " ファイル取得失敗\nsuburl=" + suburl );
continue;
}

if ( !objHttp.responseText ) {
arrErr.push( "言語 " + arrSub[i] + " コンテンツ取得失敗\nsuburl=" + suburl );
continue;
}

if ( objHttp.responseText.match( /^\s*\{\s*"error"\s*:\s*"([^"]*)"/m ) ) {
arrErr.push( "言語 " + arrSub[i] + " 字幕ファイル取得失敗 : " + RegExp.$1 + "\nsuburl=" + suburl );
continue;
}

var filename = title + arrSub[i] + "." + _Set.Extension;
filename = filename.replace(/[\\\/:*?"<>|]/g, "_");
var savepath = chkPath( strScriptFolderPath + "\\" + filename, objFs );

try {
objStream.Open();
objStream.Type = 1;
objStream.Write( objHttp.responseBody );
objStream.SaveToFile( savepath, 2 ); //adSaveCreateOverWrite??
objStream.Close();
} catch( e ) {
arrErr.push( e.description + "\n言語 " + arrSub[i] + " ファイル保存失敗\nsuburl=" + suburl );
}
}

//終了
objFs = null;
objHttp = null;
objSteam = null;

WScript.Echo( ( (arrErr.length > 0)? (arrErr.join( "\n" ) + "\n\n"): "" )
+ "終了。" );

//メインここまで。


function restartScript() {
if ( !enableSC() ) {
try {
var objShell = new ActiveXObject( "WScript.Shell" );
} catch( e ) {
objShell = null;
}
if ( !objShell ) return false;

if ( getOSArc( objShell ) == "64" ) {
var wow64path = WScript.FullName.replace( /system32/i, "SysWOW64" );
if ( chkFileExist( wow64path ) ) {
var ret = objShell.Popup( "このスクリプトを64bitで起動しました。"
+"\nインプットボックスを表示するには、32bitで起動する必要があります。"
+"\nこのスクリプトを 32bitで再起動しますか?", 0, "スクリプトより", 4+32 );
if ( ret == 6 ) {//はい
objShell.Run( "\"" + wow64path + "\" \"" + WScript.ScriptFullName + "\"", 4, false );
WScript.Quit();
}
}
}
}


function enableSC() {
var flag = true;
try {
new ActiveXObject( "ScriptControl" );
} catch( e ) {
flag = false;
}
return flag;
}

function getOSArc( objShell ) {
try {
var strArc = objShell.Environment("Process").Item("PROCESSOR_ARCHITECTURE");
} catch( e ) {
strArc = "";
}
if ( !strArc ) return "unknown";

if ( strArc.toLowerCase() == "x86" ) return "32";
else return "64";
}

function chkFileExist( strPath ) {
try {
var objFs = new ActiveXObject( "Scripting.FileSystemObject" );
} catch( e ) {
objFs = null;
}
if ( !objFs ) return false;

return objFs.FileExists( strPath );
}

}


function clsInputBox(){
//VBScript InputBox
this.isOK = false;
this._objSC = null;

this._initialize = function (){
try {
this._objSC = new ActiveXObject( "ScriptControl" );
this.isOK = true;
} catch(e) {
this.isOK = false;
return;
}
this._objSC.Language = "VBScript";
this._objSC.AddCode( "Function VB_IB(p, t, d) : VB_IB = InputBox(p, t, d) : End Function" );
}
this._initialize();

this.InputBox = function (msg, title, def){
if ( this.isOK ){
return this._objSC.Run( "VB_IB", msg, title, def);
}
}
}


function trim( str ) {
if ( !str || typeof str != "string" ) return "";
return str.replace( /^\s+/,"" ).replace( /\s+$/,"" );
}


function getVid( url ) {
var vid = "";
if ( url.match( /http:\/\/(?:[^\/]+\.)?viki\.(?:com|jp|mx)\/videos\/(\d+)/ ) ) {
vid = RegExp.$1;
} else
if ( url.match( /http:\/\/(?:[^\/]+\.)?viki\.(?:com|jp|mx)\/player\/(\d+)/ ) ) {
vid = RegExp.$1;
}
return vid;
}


function getRedirect( url, objHttp ) {
try {
objHttp.Open( "HEAD", url, false );
objHttp.Send();
var rdurl = objHttp.Option(1);
} catch( e ) {
rdurl = "";
}

if ( !rdurl ) return url;
else return rdurl;
}


function getData( vid, objHttp ) {
var objRet = { "subs":{},
"ttitles":{}, "ttype":"unknown",
"ctitles":{}, "ctype":"unknown",
"blocked":false,
"title":"", "success":false,
"timestamp":-1, "timediff":undefined };

var esiurl = "http://www.viki.com/video_esi/" + vid + "v?action=show";
try {
objHttp.Open( "GET", esiurl, false );
objHttp.Send();
var status = objHttp.Status;
} catch( e ) {}

if ( status != 200 ) return objRet;

if ( objHttp.responseText.match( /[{,]\s*("|')?timestamp\1\s*:\s*(\d+)\s*[},]/m ) ) {
objRet.timestamp = parseInt( RegExp.$2, 10 );
objRet.timediff = Math.floor( new Date().getTime() / 1000 ) - objRet.timestamp;
}

if ( objHttp.responseText.match( /\bvideo_json\s*=\s*(\{[\s\S]+?\})\s*;/m ) ) {
try {
var objJ = ( new Function( "var ret=" + RegExp.$1 + ";return ret;" ) )();
} catch( e ) {
objJ = null;
}
}

if ( !objJ || typeof objJ != "object" ) return objRet;

objRet.success = true;
if ( objJ.subtitle_completions && typeof objJ.subtitle_completions == "object" ) objRet.subs = objJ.subtitle_completions;
if ( objJ.titles && typeof objJ.titles == "object" ) objRet.ttitles = objJ.titles;
if ( objJ.type && typeof objJ.type == "string" ) objRet.ttype = objJ.type;
if ( objJ.container && typeof objJ.container == "object" ) {
if ( objJ.container.titles && typeof objJ.container.titles == "object" ) objRet.ctitles = objJ.container.titles;
if ( objJ.container.type && typeof objJ.container.type == "string" ) objRet.ctype = objJ.container.type;
}
if ( typeof objJ.blocked == "boolean" ) objRet.blocked = objJ.blocked;

var type = objRet.ttype.toLowerCase();
switch( type ) {
case "episode":
if ( objRet.ctitles.en ) {
objRet.title = objRet.ctitles.en
+ ( (typeof objJ.number == "number")? (" Episose " + objJ.number): "" )
+ ( objRet.ttitles.en? (": " + objRet.ttitles.en): "" );
}
break;

case "movie":
if ( objRet.ttitles.en || objRet.ctitles.en ) {
objRet.title = objRet.ttitles.en || objRet.ctitles.en;
}
break;

case "music_video":
if ( objRet.ttitles.en ) {
objRet.title = ( objRet.ctitles.en? (objRet.ctitles.en + " - "): "" )
+ objRet.ttitles.en;
}
break;

case "news_clip":
if ( objRet.ttitles.en ) {
objRet.title = objRet.ttitles.en;
}
break;

default:
}

return objRet;
}


function clsSHA1(){
var K = [ 0x5a827999 , 0x6ed9eba1 , 0x8f1bbcdc , 0xca62c1d6 ];
var H = [ 0x67452301 , 0xefcdab89 , 0x98badcfe , 0x10325476 , 0xc3d2e1f0 ];

function _rotl( x, n ){ return ( x << n ) | ( x >>> ( 32 - n ) ); };

function _round( arrData ){
var arrBuff = [];
for ( var i = 0; i < H.length; i++ ) arrBuff[ i ] = H[ i ];
for ( var i = 0; i < arrData.length; i = i + 64 ){
var arrW = new Array();

for ( var j = 0; j < 16; j++ ){
var k = i + j * 4;
arrW[ j ] = ( arrData[ k ] << 24 ) | ( arrData[ k+1 ] << 16 )
| ( arrData[ k+2 ] << 8 ) | ( arrData[ k+3 ] );
}

for ( var j = 16; j < 80; j++ ){
arrW[ j ] = _rotl( arrW[ j- 3 ] ^ arrW[ j- 8 ] ^
arrW[ j-14 ] ^ arrW[ j-16 ], 1 );
}

var tmp0 = arrBuff[ 0 ];
var tmp1 = arrBuff[ 1 ];
var tmp2 = arrBuff[ 2 ];
var tmp3 = arrBuff[ 3 ];
var tmp4 = arrBuff[ 4 ];

for ( var j = 0; j < 80; j++ ){
var tmp;
if ( j < 20 )
tmp = ( ( tmp1 & tmp2 ) ^
( ~tmp1 & tmp3 ) ) + K[ 0 ];
else if ( j < 40 )
tmp = ( tmp1 ^ tmp2 ^ tmp3 ) + K[ 1 ];
else if ( j < 60 )
tmp = ( ( tmp1 & tmp2 ) ^
( tmp1 & tmp3 ) ^
( tmp2 & tmp3 ) ) + K[ 2 ];
else
tmp = ( tmp1 ^ tmp2 ^ tmp3 ) + K[ 3 ];

tmp = tmp + _rotl( tmp0, 5 ) + arrW[ j ] + tmp4;

tmp4 = tmp3;
tmp3 = tmp2;
tmp2 = _rotl( tmp1, 30 );
tmp1 = tmp0;
tmp0 = tmp;
}

arrBuff[ 0 ] = ( arrBuff[ 0 ] + tmp0 ) & 0xffffffff;
arrBuff[ 1 ] = ( arrBuff[ 1 ] + tmp1 ) & 0xffffffff;
arrBuff[ 2 ] = ( arrBuff[ 2 ] + tmp2 ) & 0xffffffff;
arrBuff[ 3 ] = ( arrBuff[ 3 ] + tmp3 ) & 0xffffffff;
arrBuff[ 4 ] = ( arrBuff[ 4 ] + tmp4 ) & 0xffffffff;
}

return arrBuff;
}

function getHashByte( arrByte ) {
var arrData = mkArrData( arrByte );
var arrBuff = _round( arrData );
var arrHash = [];
for ( var i = 0; i < arrBuff.length; i++ ){
for ( var j = 24; j >= 0; j = j - 8 ){
var tmp = ( arrBuff[ i ] >>> j ) & 255;
arrHash.push( tmp );
}
}
return arrHash;
}

function getHash( str ) {
return arrByteToHexStr( getHashByte( strToArrByte(str) ) );
}

function mkArrData( arrByte ) {
var dataLen = arrByte.length * 8;
arrByte.push( 128 );
while ( arrByte.length % 64 != 56 ) arrByte.push( 0 );
for ( var i = 0; i < 4; i++ ) arrByte.push( 0 );
arrByte.push( ( dataLen >>> 24 ) & 255 );
arrByte.push( ( dataLen >>> 16 ) & 255 );
arrByte.push( ( dataLen >>> 8 ) & 255 );
arrByte.push( dataLen & 255 );

return arrByte;
}

function strToArrByte( str ) {
//character code, byte order,未対応。
var arrByte = [];
for ( var i = 0; i < str.length; i++ ){
var chrcode = str.charCodeAt( i );
if ( chrcode <= 255 ){
arrByte.push( chrcode );
}else{
arrByte.push( chrcode >>> 8 );
arrByte.push( chrcode & 255 );
}
}
return arrByte;
}

function arrByteToHexStr( arrByte ) {
var arr = [];
for ( var i = 0; i < arrByte.length; i++ ) {
arr.push( (arrByte[i]<16?"0":"") + arrByte[i].toString(16).toLowerCase() );
}
return arr.join( "" );
}

this.getHash = getHash;


//for Viki
function Hash_Viki() {
var seed_viki = "-$iJ}@p7!G@SyU/je1bEyWg}upLu-6V6-Lg9VD(]siH,r.,m-r|ulZ,U4LC/SeR)";
var arrSeed = strToArrByte( seed_viki );
if ( arrSeed.length > 64 ) {
arrSeed = getHashByte( arrSeed );
arrSeed = arrSeed.slice( 0, 64 );
}
if ( arrSeed.length < 64 ) {
var diff = 64 - arrSeed.length;
for ( var i = 0; i < diff; i++ ) arrSeed.push( 0 );
}

var arrSeedA = [];
var arrSeedB = [];
for ( var i = 0; i < arrSeed.length; i++ ) {
arrSeedA.push( 54 ^ arrSeed[i] );
arrSeedB.push( 92 ^ arrSeed[i] );
}

function getHash_viki( str ) {
var arrSeedC = arrSeedA.concat( strToArrByte( str ) );
var arrHashC = getHashByte( arrSeedC );
var arrHash = getHashByte( arrSeedB.concat( arrHashC ) );
return arrByteToHexStr( arrHash );
}

return { "getHash_viki": getHash_viki };
}

this.Hash_Viki = Hash_Viki;
}


function chkPath( savepath, objFs ){
var safe = 99;
var count = 1;
var strParentFolderPath = objFs.GetParentFolderName( savepath );
var strFileBaseName = objFs.GetBaseName( savepath );
var strFileExtensionName = objFs.GetExtensionName( savepath );
while( objFs.FileExists( savepath ) && ( count <= safe ) ){
savepath = strParentFolderPath + "\\"
+ strFileBaseName + "_" + count
+ "." + strFileExtensionName;
count++;
}
return savepath;
}

※ダウンロードは推薦していませんので自己責任でお願いします。