開発ブログ

カレンダー

<< December 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

  • スクレイピングとWebAPI
  • WebAPIをいろいろ作っている。

    公開中なのが、カロリー計算、と、クイズAPI
    野良APIだけど、今後、このドメインはずっと継続していくつもりなので、きちんとサービスは続けようと思っている。

    こういうAPIがあったらなぁ、というのをメモしてみる。
    誰か作ったら、教えてほしい。

    ・日付API(日付からその日の出来事を提供)
    ・名言API(「人生の名言」という感じでデータの提供)
    ・ミュージシャンAPI(ミュージシャンのデータと楽曲データ)
    ・スポーツ選手API(成績や所属チームなど)
    ・車API(車の品番を提供)
    ・偉人API(偉人のデータ)
    ・国名API(首都や、エリアなど)
    ・英単語API

    こうしてみると、今まで、各Webサイトで個々が独自で集めていたデータだったりする。
    これを、API化することで、いろんなサービスが、ドメインの垣根を越えて、相互活用が可能になる。
    データを外部に出す、ということは、そのサイトからすれば、デメリットが大きい気がするが、
    それ以上のメリットが与えられるはず。
    多くのサイトが多数のデータを保持しているが、これを外部に公開してくれたら・・・と願わずにいられない。

    ある程度の利用を無償とし、それ以上の利用であれば有料課金の体系も考えられる
    また、サイトの宣伝にもなるし、提供するデータを一部にとどめれば、独自性の確保も可能となる。
    (たとえば、カロリーAPIでは、よみがな、のデータは外部に出していない)

    このまま、内部にデータを保持していても、スクレイピングという技術を使えば情報は、いくらでも抜き出されてしまう。
    それならば、先にAPIとして公開した方が、潔いと思うのだ。
    スクリレイピングの説明をすると長くなるので、こちらこちらのサイトなどを参考にしてみてください。
    スクレイピングされない方法として、上記のサイトでは、JavaScriptのdocument.writeを使う方法など書いているが、こんなのは言語道断である。スクリプトを利用していないユーザに情報を伝えられなければ本末転倒だからだ。

    スクレイピングされる側からすれば、データを勝手に使うのは言語道断!ということになるのだろうが、じゃあ、googleの引用はどうなんだ?と聞いてみれば、答えに窮するだろう。挙句「googleは別だよ、検索エンジンだし…」となるのではなかろうか。
    一方スクレイピングする側からすれば、googleの件を持ち出しても、Web上で公開されているということはこういうことなんだ!と思っていても、今ひとつ倫理観がひかっかったりする。それは、データ提供側の努力を無視することへの躊躇感であったりするだろう。
    また、データ提供元のDOMの構造が変化したり、アクセス規制を受ける懸念は常に考えていかなくてはならない。
    そのため取得したデータをデータベースにキャッシュとして保存することも考えられる。そうすると、データの権利はどこに帰属するのが垣根があやしくなってくる。

    そう考えれば、データをもってる側は積極的にWebAPIとして公開することが求められるのではないだろうか。
    それが、イニシャチブをとることにつながるし、利用者とも心地よい関係を築いていく事のできる唯一の方法だと思う。

    まねきねこでは、カロリーAPIにしても、クイズAPIにしても、これらがどういう形で変化していくか楽しみにしている。
    まぁ、野良APIである以上、なかなか利用者がいないのが残念なのだが、いいものができたら、是非教えてもらいたいと思っています。

    関連サイト:この文章を書くにあたり、スクレイピングに関する下記のページを参考にさせていただきました。
    よろしければ、下記ページもあわせてご覧ください。
    http://blog.ne2ma2.com/archives/134
    http://www.ark-web.jp/blog/archives/2007/04/_wwwmechanize.html
    http://gihyo.jp/dev/serial/01/web20sec/0007



    wikipediaの記事に対し、スクレイピング処理を行い、下記のページを作りました。ご覧ください。
    wikipediaで問題集を

| 開発関連 | 17:54 | comments(0) | trackbacks(0) |

  • カロリーAPIの公開
  • カロリーAPIの呼び出し方

    本サイトで提供しているバナナ何本?のカロリー計算サービスに使っている食べ物名およびカロリーデータを提供するAPIを用意いたしました。このようなサービスを提供しようと思った背景はこちら

    http://24th.jp/test/api_cal.phpに対し、
    以下のリクエストパラメータを送信する。
    name料理に含まれる語句(要UTF8でエンコード)
    submiton


    サンプルURL
    http://24th.jp/test/api_cal.php?submit=on&name=%E3%81%8B%E3%82%8C%E3%83%BC

    レスポンスフィールド
    Results内部ID
    api_cersion本APIのバージョン
    results_returned検索結果数
    food複数要素
    ├ id内部ID
    ├ name料理名
    ├ cal消費キロカロリー


    このAPIサービスは、まねきねこプロジェクトによる、テスト中のサービスです。
    本サービスをご利用される際には、以下の事項を承諾されたものとさせていただきます。
    尚、本規約は事前に予告なく変更されることがあります。
    変更があった場合は、このページ上にて告知いたします。


    • 本サービスは、日本国内が対象となります。

    • サービスの内容は予告なく変更することがありますのでご了承ください。

    • 本サービスの利用によってご利用者に損害が生じたり、また、使用した結果によるいかなる損害に対しても当方は責任を負うことはできません。

    • バージョンアップに関して、下位互換を前提と考えておりますが、下位互換しきれない場合、リクエストURIが変更される場合があります

    • 利用制限は特に設けておりませんが、常識の範囲外の利用が確認できた場合、該当参照元からの利用を規制いたします/li>
    • サービス提供元は、どのような理由においても、いかなるお客様に対し随時サービスの提供を予告なく拒否する権利を留保します。



    今後、機能の拡充が予想されますので、なるべく本ページへのリンクを利用ページ中に表示してくださいますよう、よろしく申し上げます。

    関連アドレス(継承略)
    日本で公開されているAPI一覧
    e3rd
    IT Media

    いろいろ調べて面白そうだと思った記事メモ
    mixiのAPI発掘1


| 開発関連 | 14:58 | comments(1) | trackbacks(0) |

  • データは公開してこそ意味がある〜WebAPIの作成
  • カロリー変換プログラムを作ってみました。

    カロリー変換プログラム

    ただのカロリー計算ではなく、『カツ丼1杯はバナナ何本分のカロリーに相当するのか?』というふうに変換するサービスです。バナナだけでなく、キュウリとか、睡眠時間に相当する数値を計算で出してくれます。

    サイトの紹介は、なかのひとのブログに任せるとして…

    このサービスでやりたいと思ったのは、WebAPIを提供すること。今まであちこちのWebAPIを使ってきたが、今度はこれを提供する側としてやってみよう、と思ったのです。それはまねきねこプロジェクトが、『データをもってるサイトは、データを自身で抱え込むだけでなく率先して外部に提供していくこと求められている』と、考えているからです。

    サイトを運営すると、データは自身のところだけで抱え込みたくなるものです。がんばって集めたデータだから、その気持ちもわかります。わかるんですが、データを外部に提供することでWeb全体の発展につながっていくという、いわゆるオープンソース的な考え方が、これからのWebには必要なことだと思うのです。

    オープンソースという考え方、WebAPIの公開、そういうのが今の流れなんだと、まねきねこは考えます。それに抗っていては、先に進めないような気がしています。実際、僕らは、あちこちでその恩恵にあずかっています。Mozzilaのブラウザもそう、Webサーバのapacheもそう、各種リソースや、Q&A、wikipedia、google…

    そういう考え方に基づき、本サービスを作ってみました。自分でデータを集めて整理し、データベースを構築し、補完し、分類して、1000種類近くのデータを作り上げました。このデータベースを試しに使ってみたのがカロリー変換プログラムというわけです。

    これから、このデータベースを読み出すためのWebAPIを作っていきます。このAPIを使って、いろんな新しいサービスが作れるようになると思います。食べ物の名前をこのAPIに投げれば、そのカロリーが数値で返ってきます。新たに作るサービスは、カロリーのデータベースを用意する必要は無く、サービスの充実を考えれば済むようになります

    いろんな人が、WebAPIを使って、いろんなサービスを作り、データを補完していく。

    これって、凄いことだと思うのです。クイズサイトやスポーツやミュージシャンのデータを蓄積してるサイトは、ただデータを抱え込むだけでなく、どんどん外部にデータを提供していってほしいです。そうすることで、更なる化学変化を生み出すことは間違いないし、それがお互いのプラスになることだと、まねきねこプロジェクトは考えています。

    カロリーWebAPIはこちらで、公開いたしました。
    それを使って、面白いサービスができたなら、開発者冥利につきるってものです。

| 開発関連 | 00:15 | comments(0) | trackbacks(0) |

  • 引用符で囲まれた値が何個かある時、一部の引用符だけを外す
  • 引用符(シングルクォート)で囲まれた値が何個かある時、一部の引用符だけを外す正規表現(秀丸)

    'aaaa' , 'bbbb' , 'ccc' , 'ddd' を 'aaaa' , 'bbbb' , ccc , 'ddd' と 置換する

    正規表現を
    【検索例】'¥f.[^']*¥f','¥f.[^']*¥f','¥f.[^']*¥f','¥f.[^']*¥f'¥f

    とし、置換先を
    【置換例】'¥1','¥3',¥5,'¥7'
    とする。

    【 説明 】
    まず
    .[^']*
    は、
    任意の文字 ⇒ .

    何個か並んだ ⇒ *
    形をしている文字列。
    ただし、
    シングルクォート(’)を除く ⇒ [^']
    ものである。

    次に、¥f。
    これは、¥fから¥fまで囲んだ領域に合致(マッチング)するものが、¥0 , ¥1 , ¥2 , ¥3 …と割り振られる。

    なので、【検索例】は、
    【検索例】'¥f.[^']*¥f','¥f.[^']*¥f','¥f.[^']*¥f','¥f.[^']*¥f'¥f
    と、なる。

    マッチングした箇所を表に示すと


    ¥0 ¥1 ¥2 ¥3 ¥4 ¥5 ¥6 ¥7 ¥8
    ' .[^']* ',' .[^']* ',' .[^']* ',' .[^']* '

    となる。

    これを【検索例】に当てはめると
    【置換例】'¥1','¥3',¥5,'¥7'
    となる。

| 開発関連 | 02:04 | comments(0) | trackbacks(0) |

  • DOMを使いこなそう-その1〜羞恥心ブログパーツ
  • 友達に、動的にページ内の値を変化させたい、ということを質問されて作ってみたものです。
    動作サンプルを表示
    ソースを表示(Javascriptファイル)

    ブログパーツ設置方法
    <script type="text/javascript" src="http://24th.jp/js/hexagon.js"  charset="utf-8" ></script>
    各ブログのブログパーツの設置は、本ブログではお答えできません。ごめんなさいm(_ _)m


    ソース解説
    DOMを使いこなすために、まず最初にgetElementByIdを憶えてしまいましょう。

    まず、特定のタグにid="xxxx"をつけて、
    オブジェクト変数=document.getElementById("xxxx")
    とすることで、指定したidをもつオブジェクトを取得できます。取得したオブジェクトは、innerHTMLを指定すればタグの包括要素を書き換えることができます。また、styleを指定することで、スタイル属性を変えることができます

    このように、オブジェクトの各種プロパティを参照及び書き換えを行えば、動的にページの情報を変更することができます。

    今回のブログパーツでは、divタグに「qus_area」というIDを割り振り、回答する都度、該当オブジェクトを取得してinnerHTMLを書き換えています。また、ボタンにbtn1,btn2というIDを割り振り、正回答に対し、disabled=trueとしてボタンを押せないようにし、誤回答に対しdisabled=falseとしてボタンを押せるようにしてみました。誤回答しか選べないクイズってのも珍しいですよね?^^



    軽くメモ
    script srcで外部ファイルを指定するとき、charset="文字コード"をつけないとちゃんと動作しないので注意。

| 開発関連 | 01:15 | comments(0) | trackbacks(0) |

  • 広告などの外部リンクを消して見やすくするブックマークレット2
  • 先に作ったブックマークレットを某サイトで試してみたら、iFrameを用いた箇所の広告を消すことができなかったので、iFrame対応のブックマークレットを書いてみました。
    iframe対応のブックマークレット

    ソースは以下。
    d=document;tags='a/iframe'.split('/');for(i=0;i<tags.length;i++){t=tags[i];ob=d.getElementsByTagName(t);for(o=0;o<ob.length;o++){switch(t){case 'a':if(ob[o].href.indexOf(d.domain)==-1){ob[o].innerHTML='';}break;case 'iframe':if(ob[o].src.indexOf('http://'+d.domain)==-1){ob[o].src='';}break;}}}void(0);


    iFrameは、別ドメインの場合、ドキュメント本体を参照しようとするとセキュリティエラーを返すので、別ドメインのiFrameがあればsrc属性をnullにするように修正してみました。iFrameについての試行錯誤は下記のとおり。

    1.iFrame内のdocumentを取得してみる
    f=document.getElementsByTagName("iframe");
    ここで
    alert(f.length)
    とすれば、iFrameの数が取得可能。
    FireFox場合、
    f[0].contentDocumentは[object HTMLDocument]
    として扱われます。
    IEの場合、
    f[0].document
    でOK。

    2.オブジェクトの内容を取得
    m="";for(i in document){m+=i+"¥n"}alert(m)
    その中には当然、getElementByIdも存在する。

    3.上記を踏まえ、同じようにしてiFrame内のオブジェクトを取得
    f=document.getElementsByTagName("iframe");m="";for(i in f[0].contentDocument){m+=i+"¥n"}alert(m)
    そうすると、FireBugにより、以下のようなエラーが吐き出された。
    [Exception... "Access to property denied" code: "1010" nsresult: "0x805303f2 (NS_ERROR_DOM_PROP_ACCESS_DENIED)" location: "http://www.test.com Line: XX"]


    結論
    つまり、自身のドメインとiFrameのドメインが異なる場合、セキュリティ上の問題で操作できないということのらしい。。

    その後
    親ドキュメントのiFrameに含む要素なら取得できるだろう、とのことで
    f=document.getElementsByTagName("iframe");m="";alert(f[0].src)
    を実行すると、そのiFrameのsrc要素を取得できました。src要素なら、当然書き込みは問題ありません。

    JavaScriptのセキュリティ制限は年々厳しくなってますね。

| 開発関連 | 05:42 | comments(0) | trackbacks(0) |

  • 広告などの外部リンクを消して見やすくするブックマークレット
  • いろんなサイトを見てると、そのサイト以外へのリンクが多すぎて肝心のページにたどり着けない事がよくありませんか?ひどいサイトだと、広告か分からないリンクがありすぎて、どこだろどこだろ?とクリックしてみても、なかなか目的のサイトにたどり着けず苛々してしまうことも多いと思います。

    そこで、こんなブックマークレットを作ってみました!そのページのドメインと同じリンク以外を消すという強力ツール。

    ドメインというのは、このページだったら「blog.24th.jp」のこと。そのページのファイルがおいてあるサーバコンピュータの名前の事だと思ってください。つまりこのツールは、そのページの関連するファイルがおいてあるサーバコンピュータ以外へのページのリンクは消しちゃうよ!というもの。

    ためしに、下のボタンを押してみてください。下記の外部リンクや横にあるバナーとか消えるはずです。
    ※本ブックマークレットはiFrameの内容には対応していません。iFrame対応のバージョン


    使い方は簡単です。下記のリンクの上で右クリックして、サブメニューの中から「このリンクをブックマーク(お気に入りに追加)」を選んでください
    このリンクをブックマークにいれてください

    右クリック押下の画面(Internet Explorer)
    右クリック押下の画面(Internet Explorer)
    Internet Explorerはお気に入りに追加すると、セキュリティの警告が出る場合があります(追加しようとしているお気に入りは、安全でない可能性があります。実行しますか?と聞かれます)。また、お気に入りにJavaScriptを含む場合、該当エラーが出ることがあります。

    お気に入り追加のダイアログ(Internet Explorer)
    お気に入りを保存する先は、リンクバーの中に入れるといいですよ。
    お気に入り追加のダイアログ(Internet Explorer)
    保存先フォルダは「リンク」にすると下記のようにリンクバーに表示されます。保存先フォルダが出ない場合は「フォルダ」ボタンを押下してください。

    リンクツールバーに追加された画面(Internet Explorer)
    リンクツールバーに追加された画面(Internet Explorer)
    リンクの一番右端に「外部リンクを消す」があります。

    リンクを消したいページにたどり着いたら、そのブックマークを開いてください。このツールが実行されます。

    技術者な方ならこのソースは簡単なものだと思いますが、ちょっとソースを説明します。

    本ソースはJavaScriptでかかれてます。ソースコードは下記のとおりです。

    JavaScript:d=document;lk=d.getElementsByTagName("a");for(i=0;i

    これで上記アドレスを、リンク先に指定してブックマークに保存している、というわけです(いわゆるブックマークレット)。
    ソースが読みづらいので、随時改行してコメントを付与してみます。
    d=document;//変数dに、ドキュメントオブジェクトを代入
    lk=d.getElementsByTagName("a");//ドキュメント内のリンクタグを取得し配列lkに代入
    for(i=0;i   if(lk[i].href.indexOf(d.domain)==-1){//配列lkのi番目の要素に本ページのドメインが含まれていないのであれば…
        lk[i].innerHTML="";//i番目の配列lkのタグに囲まれた部分(innerHTML)を空白にする
      }
    }
    void(0);//処理を遷移させない。

    これを多少改造すれば、ページ内のリンクを取得して一覧表示(document.write)するスクリプトや、ページ内の画像一覧を取得するスクリプトなんてのも簡単に作れます。改編の報告など特に気にしませんが、面白いソースができたら、教えてくださいませ〜。

    関連:おもしろそうなブックマークレット

| 開発関連 | 19:03 | comments(0) | trackbacks(0) |

  • EXCELマクロ並べ替え習作
  • ちょっとデータを整理しなきゃいけない状況に追われたので、そのEXCELマクロ(VBA)を書いてみました。以下のように、文字と数値が縦方向に交互に並んでいる時、文字、数値の順に並べ替えるというもの。

    EXCELマクロ



    以下、マクロのソース。
    Sub test()
    '【本マクロ使用時の注意】
    '処理を終了する最後のセルに、「end」と入れること。
    Dim iCnt As Integer'数値型
    iCnt = 1
    Do While Cells(iCnt, "A").Value <> "end" '値がENDになるまで
    val1 = Cells(iCnt, "A").Value
    val2 = Cells(iCnt + 1, "A").Value
    Debug.Print "val1" & val1 & "/val2=" & val2'テスト表示
    If (isNumeric(val2) > 0) Then 'val2の値が数値であれば
    Cells(iCnt, "A").Value = val2
    Cells(iCnt+1, "A").Value = ""
    iCnt=iCnt+1'次の行は空白の為、省く
    End If
    iCnt = iCnt + 1
    Loop
    End Sub

    iCntを1ずつ追加することで縦方向にセルを走査し、条件に合致した時、指定の処理を行う、というだけのマクロ。とても簡単なマクロだけど、この程度のものをちょっと書ければ業務で凄く楽になるはず。

    以下、応用例です。
    'val2の値が数値であればの箇所が、特定の文字を含む場合
    If (InStr(1, val2, "特定文字") > 0) Then 

    一文字目が「N」の場合
    If Left$(val2,1)="N" Then 

    val2の値が、10文字、という条件の場合
    If (len(val2)=10) Then

    いざ、お試しアレ。

| 開発関連 | 06:00 | comments(0) | trackbacks(0) |

  • PHPによるRSSの取得
  • まねきねこプロジェクトのトップページに、下記2つのブログの新着記事を載せられるようにしてみました。
    1. まねきねこプロジェクト開発ブログ
      技術的な内容を考察するためのブログ

    2. なかのひと〜ぬこの人ブログ
      上記ブログに載せるような内容ではないけれど、なるべくいろんな人が楽しめるように、と書いたブログ

    以下、実装までの手順です。

    1.RSSのアドレスを確認
    まず、2つのRSSアドレスを確認します。
    1. http://blog.24th.jp/index.rdf

    2. http://yaplog.jp/nakano-neko/index1_0.rdf


    2.RSSパーサのダウンロード
    次に、RSSを取得するために、オープンソースのRSSパーサをダウンロードします。今回はMagpieRSSというものを使います。
    http://magpierss.sourceforge.net/
    圧縮がtar.gzだけど、技術関連やってる人には問題なく解凍できるでしょう。解凍したファイルは、とりあえずincludes/rssとかに入れておきます。

    3.文字コードの変換
    「rss_fetch.inc」の中で文字コードが定義されている箇所があります。「ISO-8859-1」「UTF-8」に変換、ファイルをUTF-8で保存しておきます

    あとは、以下のようなコーディングをすればOK。簡単です。
    <?php
    //rss_fetch.incのパスを指定する。
    require_once('../includes/rss/rss_fetch.inc');

    //指定するRSSは複数のRDFに対応させる
    $uri=array();
    $uri[]="http://blog.24th.jp/index.rdf";
    $uri[]="http://yaplog.jp/nakano-neko/index1_0.rdf";
    $output="";

    for($iCnt=0;$iCnt<count($uri);$iCnt++){
     if ($uri[$iCnt] != '') {
      //指定RSSからXML情報を取得する
      $rss = @fetch_rss($uri[$iCnt]);
      if ($rss != NULL) {
       //本文情報の取得
       $title = $rss->channel['title'];
       $url = $rss->channel['link'];
       $output .="<a href=¥"$url¥">$title</a>¥n";
       $output .="<ul>";
       
       //記事情報の取得(とりあえず5件までの表示)
       $num=0;
       foreach ($rss->items as $item) {
        $title = $item["title"];
        $url = $item["link"];
        $output .= "<li><a href=¥"$url¥">$title</a></li>¥n";
        $num++;if($num>=5){break;}
       }
       $output .= "</ul>¥n";
      //パーサ・エラー時
      } else {
       $output .= "parse error<br>¥n";
       $output .="<!-- can't parse this rss file ".$uri[$iCnt] . "-->";
      }
     }
    }
    echo $output;
    ?>


    制作時間はいろいろ調べてる時間を含めて30分といったところ。
    この記事を書いてる時間が一番かかってたりするかもしれませんw

| 開発関連 | 03:26 | comments(0) | trackbacks(0) |

  • 予告.inじゃないけど、データ集積ツールを作ってみた
  • 「ネット上の犯行予告を検知できるソフトの開発費を来年度予算の概算要求に盛り込む」と総務省が発言した
    と、いう報道を受け、犯行予告収集サイト「予告.in」が公開されました。
    関連サイト:ITメディア

    秋葉原殺傷事件は本当に痛ましい事件だったと思います。犠牲者のことを思うと、このような事件は二度とあってほしくないですし、ネットというものがこういう形で注視されるのは非常に残念なことだと思っています。
    そんな中、作成された「予告.in」。存在の是非はさておき、技術者が世の中に対して何かできること、と考える姿勢が凄く立派だと思いました。自分たちでも何かできないものか?と思い、以下のようなツールをつくってみました。

    指定アドレスから順次リンクを辿り、指定語句を含むページをリストアップする』ツール

    ※使い方は、本EXCELの『使い方』シートを参照してください。
    ※本ファイルはZIP圧縮してますので、解凍ソフトを用いて、解凍してください。
    ※本ファイルはEXCELマクロで作成しています。マクロを有効にして実施してください。


    このツールなら、犯罪の予告をしているようなサイトを探すだけじゃなく、指定ページのリンクを辿って自分が必要としてる語句を探し出す、ということも可能になります。有名サイトであれば検索エンジンのロボットも頻繁に確認しますが、そうでないサイトだとgoogleなどの検索エンジンではなかなか見つけられません。本システムなら、指定サイトからリンクを次々に辿ることで、指定語句を探し当てることができます

    利用例としては、
    • 自分で書いたmixiのデータをローカルに保存させるために利用
    • 特定のデータを列挙しているサイトからデータを取得させてEXCEL上で一覧表示
    • 特定の語句のいずれかを含む場合ではなく、特定の語句全てが含むケースを対象とする
    といったところでしょうか。拙作で恥ずかしいのですが、ソースはパスワードをかけずに公開します。各自が自分に使い勝手のよいようにカスタマイズしてご利用ください。いろいろできると思います。

    本件、開発は早かったのですが、いろいろと試行錯誤する羽目に。
    最初は、サーバサイドのプログラムにしようかと思ったのですが、順次リンクを辿っていくとサーバに負荷がかかりすぎるな、と断念(fopenして、そのHTMLをDOM解析そこからn件のリンク先を抜き出して…n件のリンクがm階層に渡れば、nのm乗数!)。1サイトの解析に1秒かかったとして、n=100でmが10だとしても1000000000000秒!サーバ側でやる処理じゃありません。。

    次に、クライアントサイドで処理させようと思ったのですが、わざわざEXEファイルにすると仰々しいので、Javascriptで書いてみました。iFrame内に指定URLを表示させ、そこからLINKを取得し、順次遷移を…と書いてたところで、ブラウザのセキュリティにひっかかる。。フレーム(iFlame)とtop.documentのドメインが異なる場合は、そのソースを参照することができないというやつです。

    こういうセキュリティの問題は面倒ですね…
    ここで、ちょっと頓挫。

    他の方法…と考えた時、結果をリスト表示するなら、EXCELでもいいか〜と久々にEXCELマクロで書いてみることに。EXCELマクロは、セキュリティの問題から敬遠されることが多いのは分かっているのですが、心配な方はウィルスチェックしてください。
    ※尚、ちゃんとウィルスチェックして問題ないことは確証済みです。

    最初はCreateObjectでIEコントロールを作っていたのですが、Createした直後にフォーカスがIEに移り、EXCEL側に戻ってこない、というハプニングがあったので、結局EXCEL上にWebBrowserコントロールを配置し、以下の処理を実施しました。
    1. 指定アドレスに遷移
    2. 「WebBrowser1_DocumentComplete」プロシージャで読み込み終了後に、リンクの一覧を取得し、セルに列挙(広告のURLなどは除く)
    3. ページの内容を確認し、指定語句を含めば、そのページのアドレスを列挙
    4. リンク一覧から次のリンクに遷移して処理を繰り返し、特定の件数に達したら終了

    難しい処理ではないですが、WebBrowserコントロールが呼び出すページがフレームになってる時にちょっと手こずりました。IEコントーロールをCreateした場合は以下で問題なかったんですけど。
    ieObj = document.frames(n).document
    もしかするとWebコントロールのバグかもしれません(本件はOFFICE2000での開発ですので、それ以外のコントロールだと挙動が異なるかもしれません)。他にも、しばらくマイクロソフトの環境で作成する機会から遠ざかってたので、いろいろ四苦八苦したところがあります。

    Do While WebBrowser1.Busy
     DoEvents
    Loop
    で、WebBrowser1.Busyが終わらず、無限ループから返ってこなくなったり…(これだけ悩むなら、WSHで書けば楽だったかしら?)

    そんなこんなで、いろいろ上手くないトコが多々あるのですが、お遊びがてら、公開してみることにしてみました。「予告.in」の矢野さんじゃないけど、数時間で作った作品です。深夜、ネットでEURO2008の試合を見ながら作りました。

    こういう自動化プログラムは、人の作業を飛躍的に向上することもできるのですが、その道具を使う人間の意志によって、悪意あるプログラムに改ざんすることも容易なのです。個々人の良心に期待したいと思っていますので、よろしくおねがいします。

    システムの公益性を考え、改変したマクロの再配布はご自由にしていただいて構いません。
    ただ…もし、面白いものができたら、おしえてください。

| 開発関連 | 11:10 | comments(0) | trackbacks(2) |