過去に作った、〇〇〇〇(HamaZo)内で自分のブログの現在ランキングを表示するブログパーツの仕組みを公開。このブログの右上に表示されているブログパーツになります。現在「番外」と表示されているやつです。
このブログパーツは、僕が2番目に書いたスクリプトですね。
ちなみに、一番最初にプログラム覚えて書いた最初の1番目は、オレンジ色のRSSリーダーです。
このブログパーツは、〇〇〇〇のブログランキングを取得して、単純に表示させているだけです!
でも「ブログランキングを取得する」というところがミソになりますね。
普通にやると、データベースから取得するというやり方でお手軽簡単に書くらしいのですが、僕は社内でプログラム組んでるわけではないので、そんなことしません。
あくまで社外の1人、誰でもできるやり方で作りました。
本当に「車輪の再発明」とか馬鹿の象徴ですね。
まず、〇〇〇〇のランキングは以下のページにあります。
■〇〇〇〇ランキングページ
http://hamazo.tv/ranking
このページの HTML を解析して、データとして再利用しやすいように xml に変換します。
最近、データはなんでもかんでも xml にしてしまうと便利ということに気づきました。
この xml ファイルに変換して出力するのは PHP で作っています。
PHP は全く分からなかったので、これが作りたいがために勉強しました。
正規表現によって以下のような xml の形式に変換。
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"><channel> <title>HamaZo ランキングXML変換</title> <link>http://hamazo.tv</link> <description>ランキングページのHTMLをXMLに変換したもの</description> <language>ja</language> <pubDate></pubDate> <lastBuildDate>$today</lastBuildDate> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <generator>$domein</generator>\n
サーバーに負荷をかけると怒られるので、毎日午前1時に html を取得実行するようにします。
借りている レンタルサーバーで cron に設定しています。
そうして書き出された静的な xml ファイルを、ブログパーツが表示されるたびに、設定ファイルとして読み込むように しています。
実際のブログパーツですが、Flash で制作。
作ったのは 2008 年 5 月のようですが、当時 ActionScript 2.0 で作っていたので、xml パースをする機能がありせん。なので、XMLPATH というライブラリを読み込んでいます。
そして配列に入れ込んだ ランキングデータから、自分のブログの URL から検索して 何位かを取得します。
function getXML(){ //test1:ノードを辿って、指定の要素にアクセスする。 //「var 解析データ格納用Arrayインスタンス名:Array=XPath.selectNodes(解析対象のXMLオブジェクト,"解析対象の指定")」 //testNodes:配列の格納の仕方調査、先頭ノード(1)を表示 // var testNodes:Array=XPath.selectNodes(indexXMLRoot,"rss/channel/item[1]"); //test表示 // trace(testNodes); //test表示---------------------------------- //配列に入れる var itemRanking:Array=XPath.selectNodes(entryRDF,"rss/channel/item/rank"); //rank var itemURL:Array=XPath.selectNodes(entryRDF,"rss/channel/item/url"); var itemTitle:Array=XPath.selectNodes(entryRDF,"rss/channel/item/title/text()"); //順位取得 var itemMe:Array=XPath.selectNodes(entryRDF,"rss/channel/item[url='" + blogID + "']/rank/text()"); var itemMe = string(itemMe).split( "位" ); var itemMe = itemMe[0]; if ( itemMe == "" ) { // ランキング入ってなかったら starBurst.attachMovie("rankingout", "rankingout_mc", 110); starBurst.rankingout_mc._x = 12; starBurst.rankingout_mc._y = 96; trace("nothing."); } else if ( itemMe < 100 ) { // 2桁だったら itemMe0 = itemMe.charAt(0); itemMe1 = itemMe.charAt(1); } else { // 3桁だったら starBurst.rankText.todayRank100.text = itemMe; starBurst.rankText.todayRank_bk100.text = itemMe; starBurst.rankText.todayRank_wh100.text = itemMe; }
と、いうことをしています。
それにしても、もう4年前に作ったものになるんですね。
コメント