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
続きを読む »

WordPressが生成したサムネイル画像からexif情報を削除する

WordPressで画像をアップロードするとサムネイル画像が生成されますよねー。
そのサムネイル生成方法はサーバー設定でImagickが有効化されているとImagickがGDが有効な場合はGDが使用されています。
うちの環境はImagickを実行するとApacheを巻き込んでクラッシュするので仕方なくというかPHPではメジャーで軽いGDほぼ一択。

しかしGDでJPEGを生成するとexifコメントに「CREATOR: gd-jpeg v1.0 (using IJG JPEG v90), quality = ...」って情報が追加されてしまいます。
たかが数バイトのデータですが、Yslow等のWebサイトの計測ページでは警告されマイナスポイントになりますし、要らないデータなのでない方がいいかなー。

なので、アップロードした画像と作成されるサムネイルのexif情報を削除するプラグインを作ってみました。
サムネイルのexif削除はGDを使用しているサーバー向けで、Imagickを使ってる場合はサムネイルにはexif情報は記録されません。

exifを削除するのに使用する物はImageMagickのスタンドアローンバージョン又はIMagick。
スタンドアローンを使う場合は、ImageMagickがインストールされている環境でないとダメ。

まずは完成PHPソース。

<?php
/*
Plugin Name: Remove EXIF
Plugin URI: http://blog.wolfs.jp/20160707-3638/
Description: アップロードした画像とサムネイル画像のexif情報を削除します。
Version: 1.0.0
Author: Kerberos
Author URI: http://blog.wolfs.jp/
*/
 
class removeExif {
    private $imagemagick_cli = true;
    private $imagemagick_path = '/usr/imagemagick/convert';
 
    public function __construct() {
        add_filter('wp_handle_upload', array($this, 'wp_handle_upload'));
        add_filter('wp_generate_attachment_metadata', array($this, 'wp_generate_attachment_metadata'), 10, 2);
    }
 
    public function wp_handle_upload($arg) {
        if ($this->check_mime($arg['type']) === true) {
            $this->remove_exif($arg['file']);
        }
 
        return $arg;
    }
 
    public function wp_generate_attachment_metadata($metadata, $attachment_id) {
        $dirArr = explode('/', $metadata['file']);
        $baseDir = wp_upload_dir(null, false);
        $uploadDir = $baseDir['basedir'].'/'.$dirArr[0].'/'.$dirArr[1].'/';
 
        foreach ($metadata['sizes'] as $entry) {
            if ($this->check_mime($entry['mime-type']) === true) {
                $this->remove_exif($uploadDir.$entry['file']);
            }
        }
 
        return $metadata;
    }
 
    private function check_mime($mime = null) {
        return ($mime === 'image/jpeg' || $mime === 'image/jpg');
    }
 
    private function remove_exif($filePath) {
        $filePath = addslashes($filePath);
 
        if (file_exists($filePath) === true) {
            if ($this->imagemagick_cli === true) {
                if (is_executable($this->imagemagick_path) === true) {
                    try {
                        exec('"'.$this->imagemagick_path.'" "'.$filePath.'" -strip "'.$filePath.'"');
                    } catch (Exception $e) {}
                }
            } else {
                if (class_exists('Imagick') === true) {
                    $im = new Imagick($filePath);
 
                    try {
                        $im->stripImage();
                        $im->writeImage($filePath);
                        $im->clear();
                        $im->destroy();
                    } catch (Exception $e) {}
                }
            }
        }
    }
}
 
new removeExif();
?>

かなり簡単なコード。(`・ω・)b

各ファンクションの簡単な説明は・・・
続きを読む »

TaoTronics Selfie Stick TT-ST001を買ってみた

今まで使っていたダイソー製300円の自撮り棒は、伸縮部分は回転する、アーム部分は破損する等あまり良い物ではなかった。
アーム部分は買い換えるのが高く付くほど壊れるので、グルーガンで補強したりして使ってましたw
ダイソー自撮り棒
まあ汎用のカメラ三脚ネジで色々連結できるので、長い三脚として使ったりできるのは楽だったけれど、やっぱりダイソークオリティ。

なので、海外ではSelfie Stickで有名なTaoTronicsの自撮り棒「TaoTronics Selfie Stick TT-ST001」を買ってみました。
値段はこの記事を書いた時点で2,199円、まあそこそこの値段。

TT-ST001の特徴は、
 ・Bluetoothでシャッターを操作 (Android、iPhone対応)
 ・バッテリー30時間
 ・エアロスペースアルミニウム製
 ・最大荷重5Kg
 ・アーム角度270度、伸縮76cm
 ・重さ120g、折りたたみ時 全長18cm 幅5cm
って所です。
 
早速届いた商品を開封。
TaoTronics TT-ST001 - パッケージ TaoTronics TT-ST001 - パッケージ中身
外箱はツルっとした厚紙で内箱とピッチリサイズなので若干取り出しに手こずりましたw
内箱にはサラっとした半透明のビニールに包まれた本体が。
続きを読む »

archive.isの新しいサーバー

archive.isはサイトの著作権を無視しサイトを丸ごとコピーするのはご存じだと思います。
このブログも一部の画像はライセンス購入した物があるので、ライセンスに違反する為削除してほしい と要求を送ったけれど無視されました。

更にサイトのcanonical、description、keywords、OGP、Twitter情報を書き換えるため悪質です。
なのでうちは、archive.isサーバー群のIPアドレスからの接続をドロップしているのですが、どうも新しいサーバーを用意したみたいです。
(サーバー一覧等はarchive.is サーバーIPアドレス一覧前回の記事をご覧下さい。)

ちなみに、Googleにインデックスされたarchive.isのコピーサイトはGoogleへ著作権違反の報告をする事で検索インデックスから削除可能です。
私はこのブログの612ページ分を著作権違反で報告し削除してもらいました。

オリジナルサイトとarchive.isのコピーサイトがGoogleのインデックスに登録されてもarchive.isの順位が上がらないのは著作権違反の報告が多く、Webマスター側の権利が認められているからでしょうねー。
アーカイブ保存され困っているWebマスターさんはドンドン著作権違反でarchive.isを報告しましょう!
 
今回はそのarchive.isに新しいサーバーが増えたようで、見事にダミーサイトがアーカイブされちゃいました。
サーバーはスパム業者を排除しない事で有名なLinode LLCのサーバー。
確認したIPアドレスは139.162.218.90です。
RIRへの照会情報は

% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See http://www.ripe.net/db/support/db-terms-conditions.pdf
% Note: this output has been filtered.
% To receive output for a database update, use the "-B" flag.
% Information related to '139.162.0.0 - 139.162.255.255'
% Abuse contact for '139.162.0.0 - 139.162.255.255' is 'abuse@linode.com'
inetnum: 139.162.0.0 - 139.162.255.255
netname: EU-LINODE-20141229
descr: 139.162.0.0/16
org: ORG-LL198-RIPE
country: US
admin-c: TA2589-RIPE
tech-c: TA2589-RIPE
tech-c: LA538-RIPE
status: LEGACY
remarks: For information on "status:" attribute read https://www.ripe.net/data-tools/db/faq/faq-status-values-legacy-resources
remarks: Please send abuse reports to abuse@linode.com
mnt-by: linode-leg-mnt
created: 2004-02-02T16:20:09Z
last-modified: 2015-05-05T01:52:02Z
source: RIPE

organisation: ORG-LL198-RIPE
org-name: Linode, LLC
org-type: OTHER
address: 329 E. Jimmie Leeds Road, Suite A, Galloway, NJ 08205
abuse-c: AR31889-RIPE
abuse-mailbox: abuse@linode.com
mnt-ref: linode-leg-mnt
mnt-by: linode-leg-mnt
created: 2015-04-20T03:09:43Z
last-modified: 2015-04-20T03:18:36Z
source: RIPE # Filtered

person: Linode Abuse Support
address: 329 E. Jimmie Leeds Road, Suite A, Galloway, NJ 08205, USA
phone: +16093807100
abuse-mailbox: abuse@linode.com
nic-hdl: LA538-RIPE
mnt-by: Linode-mnt
created: 2009-11-11T15:16:50Z
last-modified: 2015-08-13T19:55:05Z
source: RIPE

person: Thomas Asaro
address: 329 E. Jimmie Leeds Road, Suite A, Galloway, NJ 08205, USA
phone: +16093807504
nic-hdl: TA2589-RIPE
mnt-by: Linode-mnt
created: 2009-11-02T17:17:56Z
last-modified: 2014-11-20T18:51:15Z
source: RIPE

% Information related to '139.162.192.0/19AS15830'
route: 139.162.192.0/19
descr: LINODE-UK
origin: AS15830
mnt-by: LINODE-LEG-MNT
created: 2015-06-17T20:45:47Z
last-modified: 2015-06-17T20:45:47Z
source: RIPE
% This query was served by the RIPE Database Query Service version 1.87.4 (DB-1)

うん紛うことなくLinode LLCのサーバー。
逆引きホスト名もli1381-90.members.linode.comなので間違いなし。

いやー、スパムの苗床Linodeを選ぶとは流石archive.isさん!
アビューズ報告してもレンタル先から処分されないんだから絶好のサーバーですよねー
archive.is サーバーIPアドレス一覧ページは既に反映済みです。

スパムメールとかのサイトを弄って遊ぶみたいに、archive.isでも遊べないかな・・・?と思っていたら、ちょっと面白いことを思いついたので実行してみました。
続きを読む »

新しいIP範囲からのスパム

第1オクテットが103のスパムを片っ端からブロックしてたら、来るスパムが減って安心していました。
しかし、今日新しい範囲からスパムらしく短期間に山ほどメールが来ました。

文面の特徴が一致しているので同じ業者だとわかります。
とりあえず、文面はこんな感じ。

第1オクテットが103のスパム

差出人: ◆1700万円をすぐ受け取ってください◆即送金可能◆ <df21bd3@fh1jzkmb3b.com>
件名: Ш至急1700万円を受け取ってもらえませんか?急に変な事を言ってごめんなさい、でも騙したりするつもりで送っている訳じゃないので、とりあえず話しを聞いてもらえませんか? 添付写真
--------------------

◆1700万円をすぐ受け取ってください◆即送金可能◆様よりメールあり!
http://fh1jzkmb3b.com/...

退会なども上記より

 
第1オクテットが59のスパム

差出人: 専属送/金担当者:相川 絵里 <fth51rfcv@e275bj363e.com>
件名: £10,0/0円.【1度のご購,入】お一人様γあたり『960.0万,円』ご送/金のご案/内γで御.座/いますγ!専属送,金担当者,:相川 絵里
--------------------

専属送/金担当者:相川 絵里,様.よ,りメ,ッ/セ,ー/ジあり♪
http://e275bj363e.com/...

退.会なども上/記より

 
今回の送信元IPアドレスをRIRへ照会すると・・・

% [whois.apnic.net]
% Whois data copyright terms http://www.apnic.net/db/dbcopyright.html
% Information related to '59.153.205.0 - 59.153.205.255'
inetnum: 59.153.205.0 - 59.153.205.255
netname: ACCESSNETLLC-JP
descr: ACCESS-NET LLC
descr: 1403 Win Aoyama, 2-2-15 Minami-Aoyama
country: JP
admin-c: ALA2-AP
tech-c: ALA2-AP
status: ALLOCATED NON-PORTABLE
mnt-by: MAINT-ACCESSNETLLC-JP
mnt-irt: IRT-ACCESSNETLLC-JP
changed: info@access-n.net 20151105
source: APNIC
irt: IRT-ACCESSNETLLC-JP
address: 1403 Win Aoyama, 2-2-15 Minami-Aoyama, Minato-Ku Tokyo 107-0062
e-mail: info@access-n.net
abuse-mailbox: info@access-n.net
admin-c: ALA2-AP
tech-c: ALA2-AP
auth: # Filtered
mnt-by: MAINT-ACCESSNETLLC-JP
changed: hm-changed@apnic.net 20130718
source: APNIC
role: ACCESS-NET LLC administrator
address: 1403 Win Aoyama, 2-2-15 Minami-Aoyama, Minato-Ku Tokyo 107-0062
country: JP
phone: +81368691858
fax-no: +81368691858
e-mail: info@access-n.net
admin-c: ALA2-AP
tech-c: ALA2-AP
nic-hdl: ALA2-AP
mnt-by: MAINT-ACCESSNETLLC-JP
changed: hm-changed@apnic.net 20130718
source: APNIC
% This query was served by the APNIC Whois Service version 1.69.1-APNICv1r0 (UNDEFINED)

うん、やっぱり送信元はいつものヤクザスパムでした。
これからは103に加え59も警戒する必要があるかもしれません。

いつもの、スパム送信元リストには追加済みです。

ちなみに、Webサイトは脆弱性がモリモリあるのでTor等で匿名化して相手サーバーを弄って遊んでみるのがオススメです。