<< CloudReadersでオフラインHTMLを読む : main : クレジットカードの有効期限が切れた >>

Google Chrome ExtensionとAutoPagerize

django snippets というDjangoの役立ちコードを投稿するサイトがある.その中の"By Tags"において一度に20個しかタグが表示されず,実際にどんなタグがあるのか全貌を見ることができない.

全部のページを定期的に読み込んで加工することも考えたのだが,サーバを作らなくてもブラウザの中で先読みすればjavascriptで何とかできるだろうと思い,Google Chrome Extensionを作ってみることにした.
Chrome Extensionsの作り方は Google Chrome Extensions に書かれているとおりなので詳細は割愛するが,manifest.json というファイルを作って設定をその中に記述する.今回はContent Scriptを使った.
{
"name": "Django Snippets Taglist",
"version": "1.0",
"description": "Autolod tag list",
"content_scripts": [
{
"matches": ["http://djangosnippets.org/tags/", "http://djangosnippets.org/tags/?page=*"],
"css": [ "djsnippets.css" ],
"js": ["jquery-1.4.2.min.js", "script.js"]
}
]
}

matchesで対象サイトを(複数)設定し,そのページで読み込ませたいcssとjavascriptファイルを指定すればよい.読み込ませるファイルはmanifest.jsonと同じディレクトリに入れる.

作成したら,「拡張機能」で「デベロッパーモード」を開き,「パッケージ化されていない拡張を読み込みます」でmanifest.jsonの入ったディレクトリを指定すれば登録される.

[メモ]
拡張機能中のスクリプトにはコンソールからはアクセス出来ないので,コンソールから変数の値をチェックしたり関数を呼び出したりできない.対象サイトのページをファイルに落とすなりしてローカルのテスト用HTMLを用意し,そのヘッダファイルを書き換えてcss/jsを読み込むようにするとコンソールからアクセスできるのでデバッグしやすい.

スクリプトの中にbreakpointを設定しておくと,breakした時はそのスクリプトの変数にアクセスできる.この方法で実行経路と値のチェックができる.

printfデバッグに近い方法として console.log() を使う方法がある.引数には文字列だけでなくオブジェクトを与えることができ,オブジェクトを与えた場合にはコンソール上でその内容にツリー形式でアクセスできる.



動作するようになったらパッケージを行う.「拡張機能」の「拡張機能のパッケージ化」からパッケージ化するディレクトリを指定するだけ.秘密鍵の部分は2回目以降(更新時)のみ入力する.最初は空欄にしておけば新たに生成される.
Chrome Extensionのパッケージ化

生成された *.crx をGoogle ChromeにDrag & Dropすれば普通の拡張としてインストールされる.

できたもの: djangosnippets.crx

やってること
- CSS: liタグが縦でなく横に並ぶように float: left に変更
- Javascript: Next 20< というリンクの先を読み込んでリストに追加することを400ms毎に繰り返す.

実際に動かしてみるとあまり感慨がない.(-_-)
最初に djangosnippets のタグページが使いづらいと感じた当時はタグがアルファベット順に出力されていた.しかも記号が入ったタグがあったために,ページをめくらないとまともなタグが見えない状態であった.しかし,現在はその点は改善されて使用頻度の高いタグが先頭に出るようになっている.



さて,ここまでやったところで単に次のリンクをたどるだけなら,普段使っている AutoPagerize で十分な気がしてきた.こちらは対象ページのパターン,たどるリンク,取り出す要素などを指定したSITEINFOを作るだけでOKのようだ.

SITEINFOでは対象要素をXPathで指定するようになっており,SITEINFOの作り方 ではFireBugを使うように指示されている.だが調べてみると Google ChromeのDeveloper Toolsの検索ボックスでXPathが使えるようだ.

試しにやってみる
XPathで検索
ハイライトはされないようだが,該当する要素が見つかったかどうかはmatchesを見れば良く,また見つかった要素がDOMツリーで展開される.

さて,では実際にdjangosnippets.org/tags/ を対応させてみることにする.
まず,テスト的に対応させる方法についてFirefoxについては記述があるのだが,Chromeについては記述がない.調べたところ,AutoPagerize のメインファイルである autopagerize.user.js 中の SITEINFO に直接記述して,Google Chromeを再起動すれば読み込まれることが分かった.autopagerize.user.js はC:\Documents and Settings\your_account\Local Settings\Application Data\Google\Chrome\User Data\Default\Extensions\igiofjhpmpihnifddepnpngfjhkfenbp\0.1.8\autopagerize.user.js にある.ここに次のようなデータを追記した.
{
url: 'http://djangosnippets.org/tags/',
nextLink: '//p[@class="pagination"]/a[contains(text(),"Next")]',
pageElement: 'id("main")/ul',
exampleUrl: 'http://djangosnippets.org/tags/',
}

この状態で http://djangosnippets.org/tags/ を開くと,次々とページがめくられてゆく.

最初,nextLinkとpageElementを誤って逆に書いてしまったのだが,その時はコンソールログにエラーメッセージが表示された.ただ,その内容は「undefinedにmatchメソッドがない」という物だったので原因が分かるまでに時間を要した.(リンクであるnextLinkの href を読み取ろうとするが,それが存在しないとundefinedとなり,次の行でエラーとなっていた.)

さて,この情報をAutoPagerizeのデータベース に登録するとみんなが使えるようになる.OpenIDを使ってログインした後に「アイテム追加」を行えば登録ができる.登録するとJSONでそのデータが直ちに利用可能となる.

ちなみに,OpenIDには便利なボタンが用意されていないので例えばGoogleの場合は https://www.google.com/accounts/o8/id のようにEndPpint URLを入力する必要がある.

さて,サーバへの登録を行っても自分のブラウザでは有効化されない.調べてみるとローカルストレージにキャッシュを持っていて,1日以上経たないと更新されない.これでは動作テストでは困るので何とか無理矢理キャッシュをクリアしたい.

Chromeのプラグインは目に見える部分以外にバックグラウンドの見えないおエージ存在し,ストレージはそちら側にあるのでどうも直接は手出しができそうにない.

そこで,background.jsの中の refreshSiteinfo を一時的に書き換えて,常にネットワークからデータを読み込むようにして無理矢理更新させたところ,認識するようになった.
コンピュータ > ソフトウェア : comments (299) : trackbacks (0)

Comments

ステッチ引っ張られなければならないもしないそこぶら下がっているスレッドがないいずれかから一部のバッグ。だけを運ぶ基礎あなたのハンドバッグに維持品質。抵抗できない、シャネルを運ぶあなたの同僚を見たか?
スーパーコピー エルメス 財布...2013/12/02 12:11 PM
一般的に場合、信条が押されていません内、革とパネルを接着剤で、その後袋は多くの場合、偽。内部のバッグを開いたときに正方形の革下見張りの板。
財布 人気ブランド ミュウミュウ...2013/12/02 12:11 PM
とき人コーチ バッグあげる集塵袋と一緒にそれ。割引財布もインター ネット ショッピングのサイトで使用できます。部分間で、エキサイティングな eBay のショッピングは、スリル良いオークション。
gucci 財布 ホワイト...2013/12/02 12:11 PM

Comment Form

  

Trackbacks

Trackback url
Latest Entries
Categories
Recent Comments
Recent Trackback
Archives
Profile
Other
RECOMMEND