2018年12月21日金曜日

Linuxでfriioを使う(実用編)

Linuxでfriioを使う(構築編)

の続きです。

前の記事では、Xubuntu 18.04でrecfriioをビルドする方法をご紹介しましたが、これを実際に動作させるには、更に以下のパッケージが必要です。
pcscd
pcsc-tools
これらのパッケージをapt installで導入してください。

また、以下のようにして、カードドライバであるpcscdを予め起動させておく必要があります。
systemctl start pcscd
尚、最近のLinuxカーネルには、dvb_usb_friioなるドライバモジュールが予め内包されており、friioを接続するとこのドライバモジュールが自動的にロードされデバイスを専有してしまいます。(recfriioを使おうとしても、デバイスがbusyである旨のエラーが表示されます。)

このため、dvb_usb_friioドライバが自動的にロードされないよう、ブラックリストを作成します。
echo 'blacklist dvb_usb_friio  > /etc/modprobe.d/blacklist-dvb.conf
設定が完了したら、システム再起動します。

これでrecfriioが使えるようになります。
recfriio --b25 27 60 result.ts
とやることにより、27チャンネル(東京スカイツリーからの放送波でNHK総合に該当)を60秒録画したりできます。
放送されているチャンネルの割当は地方によって違いますので、以下のページからお住まいの場所のチャンネルの割当のご確認ください。

地上デジタル放送 チャンネル一覧表
 https://www.maspro.co.jp/contact/bro/bro_ch.html

ハードオフで安く購入した白フリーオですが、上記のコマンドで無事に録画できました。

良い買い物でした。

Linuxでfriioを使う(構築編)

先日、近所のハードオフに行くと、ジャンクコーナーで白Friioが540円で売られていました。

ルータが入った箱の中に、乱雑に詰め込まれていました。
店員さんが何なのか分からず、面倒になって適当に値段をつけてジャンク箱に放り込んだっぽいです。

動けばもうけものなので、早速購入しました。
今回はこれをハックしてみたいと思います。

まず、最初に残念なお知らせから。
フリーオの純正ドライバー類は購入者のメールアドレスがないとダウンロードできないようです。
とは言いつつも、まだネット上には有志の方々が残した互換ドライバなどが存在していて、丹念に探して行けば使えそうです。

普段家ではLinuxを使っているので、Linuxで使うための情報を探してみましたが、recfriioというコマンドラインツールで録画ができるようです。

recfriioについては、以下のサイトにあがっていたのを使わせて頂きました。

Friio関係ファイル置き場
http://www2.wazoku.net/2sen/friioup/

ここから以下のファイルをダウンロードします。
up1206.zip recfriio r5本体
up1210.zip recfriio r5のパッチ
ただし、これらのファイルは、私が使っているXubuntu 18.04ではビルドすることはできませんでした。

色々試行錯誤して、ビルドできるようにソースコードを修正しました。
こちらに上げておきますので、ご利用されたい方はどうぞ。
試していないですが、恐らくUbuntuでも動くと思います。

なお、Xubuntu 18.04でビルドするには、以下のパッケージが必要でした。
それぞれ、apt installでインストールしてください。
make
pkg-config
libboost1.65-all
libpcsclite-dev
ソースコードのtarアーカイブを展開した後、recfriior5のディレクトリに移動してmakeすればOKです。

お使いの環境にもよりますが、2〜3分でビルドが完了し、recfriioの実行ファイルが生成される筈です。

2018年12月20日木曜日

JavaScript実行後のHTMLソースを取得する

とあるブログ(blog.jpドメインのlivedoorブログ)を定期的に確認し、更新があったら保存するような仕組みを作りたくなり、シェルスクリプトとwgetでなんとかしようと試行錯誤したのですが、取得したHTMLから記事のURLを抽出できませんでした。

おかしいなと思って取得したHTMLソースを見たところ、記事の中身や写真はすべてJavaScriptでレンダリングされているようです。
多分クローラー避けなんでしょうが、最近はこういうサイトが多くて嫌になります。

残念ながらwgetはJavaScriptを処理してくれないため、このままでは記事を抜き出すことは不可能です。
ということで、JavaScriptを実行した後のHTMLを取得する方法を調べてみたのですが、PhantomJSを使うのが一番簡単そうなので試してみました。

PhantomJSは、様々なOSのディストリビューションでパッケージとして提供されています。

Xubuntuでは、
sudo apt install phantomjs
FreeBSDでは、
pkg install phantomjs
でインストールすることが可能です。

使い方はこんな感じです。
phantomjs script.js ${url_target} ${user_agent}
「script.js」は、以下のような感じで記述します。
var system=require('system');
var webpage=require('webpage');
var url=system.args[1];
var user_agent=system.args[2];
var delay=3000;
var page=webpage.create();
page.settings.userAgent=user_agent;
page.open(url,function(status){
    setTimeout(function(){var html=page.evaluate(function()
    {return document.documentElement.outerHTML;});
    system.stdout.write(html);phantom.exit(0);},delay);})
PhantomJSが第一引数で指定した上記JavaScriptを実行してコンテンツを取得、保存します。

保存したHTMLから、無事に記事のURLを抽出できるようになりました。

尚、PhantomJSを使う以外にも、「Selenium+WebDriver+ブラウザ(ヘッドレスモード)」っていう選択肢もあるようです。
(ブラウザを実行させるためにXなどのGPU環境が必要になるなど、若干重た目かも…)

このように便利はPhantomJSですが、既に開発が終了しているようで、ちょっと残念です。

以下のページを参考にしました、ありがとうございました。
https://teratail.com/questions/19039