拡張機能を一通りニコニコ動画Zeroに対応

ニコニコ直ダウンローダー

ニコニコ最前面コメント

ニコニコ除ニコレポ

の3つの拡張機能をニコニコ動画zeroに対応させました。もちろん原宿にも対応しています。

 

順番に開発後記を。先ずはダウンローダー。

ぼつぼつストリーミングサーバーが存在してきたので、公式配信モノがストリーミングに置き換わったらどうしよう と心配していましたが

その心配もなく今までどおりDL出来ます。

動画のタイトルやタグが取得できなくなったかと焦りましたが、/watchの下の方に書いてありました。

contentScriptでは、#watchAPIDataContainerのinnerTextを取ってJSON.parseすれば色々取れます。

オブジェクトで一気にあれこれ取れるので、見つけてからはラクチンでした。

今までは投稿の秒数は取得できなかったけど(もしかしたらスレッド番号で取れたかも)、秒数も取れるようになりました。

視聴ページを開いて、console.log(JSON.parse(document.querySelector(“#watchAPIDataContainer”).innerText));で取れると思います。

ユーザー投稿動画、運営投稿動画チャンネル投稿動画の三種類で確認しました。

 

先にニコレポ。

レイアウトは当然変わりましたが、ニコレポの内容はほぼ変化なし。ニコると動画レビューの項目が追加されただけかな。

 

最後に最前面。

これが最難関でした。原宿はaddVariableを上書きしてやればよかったのですが、Zeroでは出来ませんでした。

最前面の情報も前述の#watchAPIDataContainerに書いてあるのですが、最初に読み取ってグローバルオブジェクトに放り込んでるらしいんですよね。

グローバルオブジェクトを消して、無理やりjsを再読み込みさせると、DOMエレメントに対して二重に初期化され、コメント欄が消えたりして上手く行かず。

グローバルオブジェクトのどこに属性が記録されているかを調査したのですが、スキル不足で分かりませんでした。

結局、関数を切り貼りしたら無事動いたので、それでリリースしました。

 

動画プレイヤーの下にある動画のサムネイルから動画を切り替え出来ますが、結局ページを移動しているだけでした。

何が原点回帰なのか知らんけど、また慣れるかな。

ユーザに叩かれてレイアウトが変わるのが一番怖いということで。

background_pageとoptions_pageは違う

バックグラウンドページ、オプションページ、コンテキストメニュー初期化スクリプトはこんな感じです。

chromeを起動して拡張が読み込まれた時も、オプションページを開いた時も、コンテキストメニュー初期化処理を実行させたくてこう書きました。



ところが、拡張を有効にした時はコンテキストメニューがちゃんと表示されるのですが、オプションページでコンテキストメニュー関連の設定を変更し、コンテキストメニューを初期化するとコンテキストメニューをクリックしても登録した関数のclick()が実行されません。

数分悩んだのですが、拡張を有効にした時はバックグラウンドページでコンテキストメニューの初期化処理が実行され、コンテキストメニューがクリックした時はバックグラウンドページでclick()が実行されます。

ところが、オプションページで再度コンテキストメニュー初期化処理を実行し、コンテキストメニューをクリックすると、オプションページでclick()が実行され、オプションページにclick()が無いのでエラーとなっていました。

この現象を改善するには、オプションページからではなく、バックグラウンドページでコンテキストメニュー初期化処理を実行させる必要があります。

そのためには、オプションページでchrome.extension.sendRequest({},function(){});の通信を行うと無事オプションページからバックグラウンドページに通信が行われ、バックグラウンドページでコンテキストメニューの初期化が行われ、コンテキストメニューをクリックした時にはバックグラウンドページのclick()が実行されました。

WebRequest APIには署名が必要です

一ヶ月近く前からWebRequest APIのblocking機能を使ったGoogleChromeの拡張を公開しています。

先日その拡張のアップデートをしたのですが、何故か即公開になりません。

検出の誤作動かなと思って数日待っていたら、メールが来てサインを書いてグーグルに送れと言われました。

どうやらサインを送るまでは、web storeのデベロッパーダッシュボードから非公開にする以外の編集は一切できないみたいです。



必要な項目は、名前、会社名(任意)、メールアドレス、eMailアドレス、電話、ファックス、国、webサイトURL、グーグルアカウント、署名、日付。

このメールアドレスというのは、住所を書けという事でしょうか。記入欄も大きいし、そういう事なのかな。

そしてchromeewbstore-reviews@google.comに送れと。

メール本文は
From: "Justin"

To: ****@gmail.com

Cc: chromewebstore-reviews@google.com

Subject: Review notification for "ニコニコ直ダウンローダー"

Hi,

Thanks for uploading your item to our Google Chrome Web Store. Your item

was placed in a manual review queue because it uses the WebRequest API in

a blocking fashion.

The process for approving your item is quite straightforward. Due to the

greater performance implications of such extensions, we ask that you

complete the attached PDF form and return it to us. Please attach it as a

reply-all to this email (chromewebstore-reviews@google.com). After

receiving your completed form, your item will be published in the store

and a manual review to ascertain any performance issues will be scheduled.

You will be contacted if any concerns are surfaced by that review.

*IMPORTANT - PLEASE READ.

If we do not receive a signed agreement, your item may be subject to

removal from the store.

Feel free to reply-all to this email if you have any further questions.

All the best,

Justin

Google Chrome Web Store team
こんな感じ。

この拡張機能は先月から公開して、何回かバージョンアップしてたんだけど、WebRequest APIのblocking機能は最初のバージョンから使ってるんですよね。最新バージョンはオプションページの機能を追加しただけで、特別な権限が必要な処理は一切増やしていません。

3月から規約が変わったのかなと思いますが、どこに情報書いてあるのか。リファレンスにも書いてないっぽいし。

この機能はWebRequest API でワザとリクエスト送信を遅くしてみた – hogehoge @teramakoや、上記のリファレンスに「XmlHttpRequests使うとデッドロックする可能性あるから使うな」って書いてある通り、かなり遅くなるから慎重にする事にしたのかな。

うー、めんどくさい。以下、拡張のコード。機能的にもう完成だから、これから直接落としてもいいかもね。
2012-05-13追記

Google ChromeのAPIについて、最新情報や開発のノウハウなどを日本語で共有するGoogle 準公式のコミュニティがあるらしい。そこで直談判したらGoogleの方から返事が来て、公開されるようになりました。


以前のはてブ

ついにGoogleChromでスタンドアロンのダウンローダーとブロックツールを作る事が出来た!

期待を持っていたGoogleChromeの拡張機能である「webRequest」がいつの間にか正式にリリースされていました。

これによってリクエスト/レスポンスヘッダをスクリプトから変更する事が可能に。

Web Requests – Google Chrome Extensions – Google Code

下記サイトがこの上なく参考になりました。

webRequest APIをざっくり理解する。(あるいはChrome拡張の作り方) | mzsm.me

この機能を使ってニコニコ動画の視聴ページ(/watch)から動画をダウンロード&時報ブロックの拡張を作ってみました。

自分も今までいくつかのニコニコダウンロード拡張を使っていたのですが、外部サービス経由でユーザーが増えるとダウンタイムが増えたり、ファイル名が”smile.mp4″固定だったり・・と。どうにも使い勝手が悪かった。

その理由がニコニコの動画サーバーから送られてくるこのレスポンスヘッダ。
Content-Disposition: inline; filename="smile.mp4"

ファイル名が”smile.mp4″なのはまさにこれが原因です。また、URLを新しいタブで開いてもダウンロード開始せずにブラウザ内で再生されるのは”inline”が原因です。動画保存に手間をかけさせたいという運営の努力の痕が見えます。

これを上書きできるwebRequestApiの前では残念ながら無力ですけど。

作った拡張を例に、そんな素晴らしいwebRequestApiを解説してみます。

動画ファイルにアクセスする際動画IDがヒストリーに含まれたクッキーが必要なのですが、クッキーの処理はブラウザがやってくれるので今回は関係ありません。

先ずmanifest.jsonについて。

permissionsに”webRequest”を追加するのはもちろんですが、アクセス先のホストのマッチパターンも書きます。このホストが拡張のインストール時に表示されます。res.nimg.jpは後述の時報ブロックの為。


バックグラウンドページです。

webRequestの準備を行います。addListenerの第一引数が実際に処理を行う関数です。

関数の引数のresponseHeadersを調べ、Content-Dispositionヘッダを書き換え、それをreturnする事でヘッダを書き換え、任意のファイル名でダウンロードを行う事が出来ます。

動画にはmp4やflvと言った様々な種類があるのに注意。

25行目の[“responseHeaders”]を指定しないと、レスポンスヘッダを書き換える事が出来ません。
“blocking”を指定するとアクセスブロックが出来ます。おまけで時報ブロック機能も入れておきました。

flash内から呼び出されるURLのタイプはobjectらしいです。
webRequestの使い方はこんな感じ。

webRequestは様々な関数があるけど、使い分け方は不勉強でわかりません。
  • onAuthRequired
  • onAuthRequired
  • onBeforeRedirect
  • onBeforeRequest
  • onBeforeSendHeaders
  • onCompleted
  • onErrorOccurred
  • onHeadersReceived
  • onResponseStarted
  • onSendHeaders
特にonAuthRequiredにワクワクするけど、どういう意味なのかな。

以下全コードです。webRequestApiと関係ないから端折った視聴ページにボタンを追加する処理とか、タイトルを取得するコードも書いてあります。 以上が全コードです。

非表示ではなく、アクセス遮断を行う広告ブロッカーも近い将来に登場する事でしょう。

もちろん、これより優れたダウンローダーも。

GoogleChromeで完璧なAdblockが来る日も近いであろう

GoogleChromeは拡張から通信を操作出来ないので、FireFoxの様な広告を読み込まない拡張を作るのは不可能でした。現時点でのGoogleChrome用Adblockはロード後非表示にする事しか出来ません。ですが、GoogleChromeの新しい拡張機能で任意の通信を切断する事が出来るかも知れません。実際に任意の通信を切断する拡張機能を付せて紹介します。 続きを読む GoogleChromeで完璧なAdblockが来る日も近いであろう