Twitterにアップされている動画のTSファイル一覧を表示&保存する

Twitterにアップされている動画で保存したい物があったので、HTTPリクエストログからURLをゲットしようとおもったら・・・
なんとm3u8の再生リスト形式になっていて動画自体も.tsに分割されていました。

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=320000,RESOLUTION=240x180,CODECS="mp4a.40.2,avc1.42001f"
/ext_tw_video/.../pu/pl/240x180/???.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=832000,RESOLUTION=480x360,CODECS="mp4a.40.2,avc1.42001f"
/ext_tw_video/.../pu/pl/480x360/???.m3u8
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:3
#EXTINF:3.000,
/ext_tw_video/.../pu/vid/0/3000/480x360/???.ts
#EXTINF:3.000,
/ext_tw_video/.../pu/vid/3000/6000/480x360/???.ts
#EXTINF:3.000,
/ext_tw_video/.../pu/vid/6000/9000/480x360/???.ts
#EXTINF:3.000,
/ext_tw_video/.../pu/vid/9000/12000/480x360/???.ts
#EXTINF:3.000,
/ext_tw_video/.../pu/vid/12000/15000/480x360/???.ts
....

再生リストから欲しいサイズの動画を選んで分割ファイルをダウンロードすれば良いんだろうけど面倒くさいw
それに、分割は3秒毎なので2分を超える動画は70ファイル超え!

そんなの1つずつURLをコピペなんてやってられない・・って事で、動画サイズ毎のURLとファイルを一覧表示するGreasemonkeyスクリプトを作ってみました。
動作してる動画はこちら。

1ファイル毎に手動保存なのはローカルに自動でファイルを保存するAPIが呼び出せないから。
userChrome.jsとして動かせばできるんだけど、セキュリティ的にあまり宜しくない。

まあ随分と楽になるんじゃないかなーと。
保存時にはINDEXに表示されている番号と同じファイル名にしないと、TSファイルの連結時に時系列がごちゃごちゃになりますw

おまけ?として法人など業界用の動画VMAP形式の動画も落とせるようにしました。
分割されていないので楽ちんですw
続きを読む

イカロスオンラインをActiveXなしで起動する

2015/07/01追記:
 Firefoxからイカロスを起動できるアドオンを公開してみました、詳細はこちらの記事へ

昨日からOβが始まったイカロスオンライン。
ゲームの起動にはWebサイトからActiveXを使用するタイプなのでIE系系が必須。
残念なことにうちのPCはIEを消してあるので使えないw

幸いゲームクライアントの起動に必要な引数はゲーム起動ページ内に記載されているので、ゲーム起動のJavaScriptを乗っ取って引数をゲットすることにします。
乗っ取りのコードは簡単。

var body = document.getElementsByTagName("body")[0];
body.onload = null;
 
window.addEventListener("load", function() {
    var activeX = document.getElementById("wmoWebLauncher");
    activeX.object = true;
    activeX.ExecuteGameLauncher = function(path) {
        return 0;
    };
    activeX.execute = function(arg) {
        prompt("イカロスオンライン 起動コード", arg);
        return 0;
    };
    playstart();
}, false);

イカロスオンライン - 起動引数
1.BODYエレメントに記入されているonloadを無効化しゲーム起動やActiveXの確認をするplaystartの実行を阻止。
2.ActiveXが指定されているObjectエレメントにイカロスオンラインの起動に必要な変数等を設定する。
  このオブジェクトの変数やファンクションに乗っ取り用のコードを記入。
  今回は起動引数を渡しているファンクション「execute」にプロンプトを入れて、起動命令が出たらプロンプトに起動引数が表示される仕組み。
3.playstartを実行

本当に超簡単。
Greasemonkey用だけど、userChrome.jsでも動くと思う。
ダウンロードはGreasemonkey/userChrome.js配布ページから。

あとはゲットした起動引数をランチャーに渡すだけ
batファイルが楽で良いので作ってみる。

@echo off
setlocal
 
set gamedir=C:\WeMade Online\ICARUSONLINE\Bin32
set launcher=WGLauncher.exe
set runcode="no"
set confirm=0
 
cd /d "%gamedir%"
 
 
:code_input
set runcode="no"
cls
echo.
echo イカロスオンラインの起動コードを入力してください。
set /p runcode=
if not "%runcode%" == "no" (
    goto check
)
goto code_input
 
:check
set confirm=0
cls
echo.
echo 以下の起動コードでイカロスオンラインを起動します、宜しいですか? [yes/no]
echo %runcode%
echo.
set /p confirm=
if "%confirm%" == "yes" (
    goto run
)
if "%confirm%" == "y" (
    goto run
)
if "%confirm%" == "no" (
    goto code_input
)
if "%confirm%" == "n" (
    goto code_input
)
goto check
 
 
:run
cls
echo.
echo イカロスオンラインを起動しています...
start /d "%gamedir%" %launcher% %runcode%
 
:end

イカロスオンライン - 起動引数入力
インストールした場所をかえている場合はgamedirの値を変更するだけ。

起動引数を入力したら、コマンドプロンプトの指示に従えばランチャーが起動。
イカロスオンライン - ランチャー
あとはゲームを起動して遊ぶだけ!

ゲーム制作者側はいい加減ActiveXに頼らないプロトコル起動を採用して欲しい。

ちょっとだけuserscriptを公開。

20日からX-Legendの新しいゲーム「ハンターヒーロー」のテストが始まってます。
X-Legendのゲームは以前に幻想神域ってのをプレイ済。

しかしこのX-Legendのゲームはログインが少し面倒でユーザー名、パスワード、OTPコード若しくは画像認証が必要。
大抵のゲームサイトはユーザー名、パスワードをパスワード管理ソフトで管理することができるけれどX-Legendはダメ。
 
サイトのソースを見てみると、formエレメントは存在するけれどactionがしていされておらずformエレメントからPOSTしていない。
じゃあどうやってPOSTしているのかというとログインボタンにクリックイベントを登録してjQueryのajaxでPOSTしていました。

全部の処理にjQueryが使用されているのでPOST部分のAPIを乗っ取ればイイカンジにできそう。
と言うことでスクリプトを書いてみた。
配布ページはこちら

$("document").ready(function() {
    var xLegendUser = {
        "user":"",
        'pass':"",
        'otp':""
    };
 
    var xLegendOTPInput = function() {
        xLegendUser.otp = window.prompt("SecureOTP コードを入力して下さい。", xLegendUser.otp);
        if (xLegendUser.otp == null || xLegendUser.otp == "" || isNaN(xLegendUser.otp) == true) {
            xLegendUser.otp = '';
            return false;
        } else {
            if (window.confirm("下記情報でログインします、よろしいですか?\n\nユーザー名: "+xLegendUser.user+"\nOTPコード: "+xLegendUser.otp)) {
                 return true;
            }
        }
 
        return false;
    };
 
    if (document.getElementById("after_login") == null) {
        $("#otp_login").unbind();
        $("#click_tab2").click();
        $("#otp_username").val(xLegendUser.user);
        $("#otp_p_show").hide();
        $("#otp_input").hide();
 
        $("#otp_login").click( function() {
            if (!xLegendOTPInput()) {
                return false;
            }
 
            $.ajax({
                url: "/ajax/eat.php",
                type: 'POST',
                data: { 
                    "method" : "web_login",
                    "otp_username" : xLegendUser.user,
                    "otp_password" : xLegendUser.pass,
                    "otp_input" : xLegendUser.otp,
                    "login_type" : 'otp_login'
                },
                success: function(ret) {
                    data = eval('('+ret+')');
                    $("#otp_error_msg").hide();
                    if(data['status'] == 1){
                        window.location.reload();
                        $("#otp_error_msg").hide();
                        $("#error_msg").hide();
                    }else if (data['status'] == 5){
                        $("#click_tab1").click();
                        $("#left_img").attr("src", '/images/login/loginTab1_active.gif');
                        $("#right_img").attr("src", '/images/login/loginTab2_off.gif');
                        $("#error_msg").html('画像認証でログインして下さい');
                        $("#error_msg").show();
                    }else if (data['status'] == 6 || data['status'] == '-1'){
                        $("#otp_error_msg").html("アカウントまたはパスワードは正しくありません!");
                        $("#otp_error_msg").show();
                        $("#error_msg").html("アカウントまたはパスワードは正しくありません!");
                        $("#error_msg").show();
                    }else if (data['status'] == 10){
                        $("#otp_error_msg").html("アカウントは停止されています。");
                        $("#otp_error_msg").show();
                    }else if (data['status'] == 'protected'){
                        window.location.href = 'https://member.x-legend.co.jp/member/security_chord.php';
                    }else{
                        var otperr = data['status'];
                        $("#otp_error_msg").html(otperr);
                        $("#otp_error_msg").show();
                    }
                    $("#otp_error_msg").effect("shake", { times:5 }, 50);
                    $("#error_msg").effect("shake", { times:5 }, 50);
                }
            });
        });
    } else {
        xLegendUser = null;
    };//end document.getElementById
});

処理はすごく簡単で $("#otp_login").unbind(); でログインボタンのイベントを全部消して $("#otp_login").click(... で自前のクリックイベントを設定。
あとはxLegendUserオブジェクトで指定しておいたユーザー名とパスワードとpromptで入力したOTPコードをajaxのPOSTするデータにいれてやるだけ。

このスクリプトを利用して公式サイトにいくとこうなる。
X-Legend ログインアシスト
ログインボタンを押すとOTPコード入力ダイアログが出るので入力をすれば後は勝手にログインしてくれます。

配布しているのはGreasemonkey用だけれどuserChrome.jsでも多分動きますw
配布ページで公開しているスクリプトはX-Legend公式サイト、幻想神域、プライドオブソウル、ハンターヒーローで動くように変更済み。
 
これで毎回毎回長いユーザー名とパスワードを入力しないで済むw

userChrome.js / Greasemonkey スクリプト配布

ここではuserChrome.js / Greasemonkeyのスクリプトを配布しています。

主に自分用に作った物なので普段から開発している訳ではありません・・w
不具合や改善案などがありましたらコメントやメールでお願いします。
 

注意事項

配布物の紹介について
 こちらで配布している物を動画やWebサイト等での紹介・使用は制限しません。
 リンクを記載する場合、アリフィエイト等の収入が入る機能がない物を使用しリンク先はこのページにしてください。

 連絡はしなくても結構ですが連絡してくださると私が喜びます。
 
再配布、改変について
 再配布は行わないで下さい。
 スクリプトの改変は自由に行って頂いて結構ですが、他者への配布は行わないで下さい。
 
使用について
 使用は全て自己責任でお願い致します。
 導入したことにより生じたいかなる損害・損失に対して作者は一切保証しません。
 インストールした時点でこれに同意したものとします。
 

公開スクリプト一覧

更新日 スクリプト名 説明
更新日 スクリプト名 説明
2017/03/26
20:13
v2.1.0
Twitter: 動画保存サポーター Twitterにアップされている動画(.m3u8, .ts, .mp4)の一覧を表示しダウンロードのサポートをします。
使い方などはこちらの記事:Twitterの動画のTSファイル一覧を表示&保存する
2015/07/21
05:29
v1.0.2
Fur Affinity.net: Change Method 検索フォームのメソッドをGETに変更します。
これにより検索途中のページをお気に入りやタブに記録することができます。
2014/10/22
20:08
v1.0.1
X-Legend ログインアシスト (OTP版) X-Legend各種サービスへ半自動ログインを可能にします。
インストール後にスクリプトをメモ帳等のエディタで開き「ログインするユーザー情報の設定」の部分を変更して下さい。
2015/04/24
21:32
v1.0.0
イカロスオンライン: 起動コード表示 イカロスオンライン(ICARUS ONLINE)の起動にはActiveXが必要ですが、このスクリプトを使用するとランチャー起動に必要な起動引数を表示することができます。
起動方法はイカロスオンラインをActiveXなしで起動するに記載してあります。
2014/12/14
23:56
v1.0.0
Dビデオ スタイル変更 Dビデオの作品ページ等、黒背景・白文字で目が痛くなるページを白背景・黒文字(参考画像)を基調としたページに変更します。
(設定ページ等一部ページは変更していません)

 

更新履歴

2017/03/26: 更新:Twitter: 動画保存サポーター v2.1.0
2015/07/26: 更新:Twitter: 動画保存サポーター v2.0.2
2016/07/13: 公開:Twitter: 動画保存サポーター
2015/07/21: 更新:Fur Affinity.net: Change Method v1.0.2
2015/04/24: 公開:イカロスオンライン: 起動コード表示 v1.0.0
2014/12/14: 公開:Dビデオ スタイル変更 v1.0.0
2014/10/22: 更新:X-Legend ログインアシスト (OTP版) v1.0.1
2014/10/21: 個人使用いていたものを公開