iwnidAPI利用 統計データ集

iwnidAPIを利用した統計データ集です。
全体のデータと自動収集データの月別・週別推移を表示します。

statistics.phps

広告

iwnidAPI スレッドデータをXMLで返す

概要

iwnidで取得した中から指定したスレッドのデータをXML形式で返します。

リクエストの形式

http://example.com/boardName/xml に対して以下のパラメータをGETリクエストで送信することで、XML形式でスレッドのデータを取得することが出来ます。

all
全てのスレッドデータを取得します。all以外のパラメータはname=valueで指定しますが、allallのみで指定します。また、allは他にパラメータがある場合、省略が可能です。

live
liveなスレッド限定でスレッドデータを取得するならtrue、liveではないスレッド限定で取得するならfalseを指定します。何も指定しなければ両方を取得します。

start
スレッドデータの選択範囲の開始日時を八桁の整数で指定します。はじめの四桁が年、次の二桁が月、最後の二桁が日になります。それぞれ0以上の整数である程度柔軟に解釈します。
 ex.20070331,20070400,20061531は全て2007年3月31日を指します。

end
スレッドデータの選択範囲の終了日時を八桁の整数で指定します。はじめの四桁が年、次の二桁が月、最後の二桁が日になります。それぞれ0以上の整数である程度柔軟に解釈します。
ex.20070331,20070400,20061531は全て2007年3月31日を指します。

time
開始日時・終了日時をスレ立て時刻で得るならstart、最終確認時刻で得るならconfirmを指定します。指定がない場合のデフォルトはstartです。

limit
一度に取得したいスレッドデータ件数を整数で指定します。指定がない場合は全件取得です。

offset
オフセット値を整数で指定します。オフセット値の指定にはlimitの指定が必須です。オフセット指定がない場合のデフォルトは0です。

order
スレッドデータを昇順ソートする場合はasc、降順ソートする場合はdescを指定します。指定がない場合のデフォルトはascです。

mode
自動収集データのみを取得するにはauto、手動データのみを取得するにはhandを指定します。指定がない場合は両方を取得します。

XMLデータの構造

返り値として得られるXMLデータは以下のような構造になっています。

mainURL
基準ページのURLです。

mainTitle
基準ページのタイトルです。

editor
編集著作権者です。

subject
subject.txtの相対位置です。

lastModTime
最終巡回時刻です。

allThreadCount
保持しているスレッド総数です。

threads
個々のスレッドデータをthread要素に持ちます。

threadの子要素

startTime
RFC2822形式のスレ立て時刻です。

lastConfirmTime
RFC2822形式のスレッド最終確認時刻です。

mode
自動収集の場合auto、手動の場合handです。

title
スレッドタイトルです。

live
liveなスレッドの場合true、livrではないスレッドの場合falseです。

resCount
レス数です。

readURL
スレッドを読む場合の相対位置です。

datURL
datの相対位置です。

originalURL
元スレッドのURLです。

iwnidAPI使用条件

個々のスレッドタイトル及びそれに付随する情報の著作権は2ちゃんねる及びスレ立て人に帰属します。iwnidが収集したスレッドの編集著作権は私(sanemat)に帰属します。

sanematに帰属する著作権の範囲では、クリエイティブ・コモンズ 表示 2.1 日本 ライセンス Creative Commons License の下でライセンスします。最小限の表示は’Powered by iwnid, sanemat’のテキスト、それ以上は好きにしてください。また、2ちゃんねるのデータの利用に関しては
2ちゃんねる
http://www.2ch.net/
を参照してください。

iwnidAPI使用制限

現在、呼び出し回数及び転送量に制限はありません。試行錯誤歓迎です。ただしこれは将来にわたって無制限を保障するものではありません。特に、呼び出し側で適度にキャッシュしてもらえると助かります。

リクエストの例

liveな最新1スレを取得する
http://example.com/boardName/xml?limit=1&order=desc&live=true

返り値として得られるデータは以下のようになります。

<?xml version="1.0" encoding="Shift_JIS" ?>
<iwnid>
  <mainURL>http://example.com/boardName/</mainURL>
  <mainTitle>@iwnid</mainTitle>
  <editor>sanemat</editor>
  <subject>subject.txt</subject>
  <lastModTime>Sun, 17 Jun 2007 01:14:22 +0900</lastModTime>
  <allThreadCount>1252</allThreadCount>
  <threads>
    <thread>
      <startTime>Sun, 17 Jun 2007 00:42:23 +0900</startTime>
      <lastConfirmTime>Sun, 17 Jun 2007 01:14:15 +0900</lastConfirmTime>
      <mode>auto</mode>
      <title><![CDATA[【野球】ドン底阪神の景気づけプラン そらそうよドリンク作る ]]></title>
      <live>true</live>
      <resCount>2</resCount>
      <readURL>nonyu.php/1182008543/</readURL>
      <datURL>dat/1182008543.dat</datURL>
      <originalURL>http://news21.2ch.net/test/read.cgi/mnewsplus/1182008543/</originalURL>
    </thread>
  </threads>
</iwnid>

読んだだけでは何がなんだかよくわからないと思います。ですので、xml?allとかxml?live=true&order=desc&limit=10とかxml?start=20070501とかそんな感じでいろいろやってみてください。

iwnid b0.2.4

[新機能] API機能(REST)をつけました。

iwnidでログ収集をしていると、index.htmlはどんどん肥大化していきます。この点、表示部分をカスタマイズしてpager等で分割表示することは現状でも可能です。でもどうせなら、ということでindex.htmlに加えてデータをSQLiteに書き出し、さらにそれをAPI(REST)で呼び出すことが出来るようにしました。

GETでリクエストするとデータがXMLで帰ってくる、というあれです。これにより誰でもデータを引っ張り出して好きなように組み立てることが出来ます。

携帯用の省スペース版、直近10スレッド、スレッド表示を月別に、新着をRSSフィードとして配信、週毎のスレッド数統計、今liveなスレッド一覧、スレ立て時間帯でスレッドを分類、などなどアイデア次第でパターンは無限大です。逆に言えば必要な人は自分でデータをカスタマイズしてね、ということです。

詳しい使い方・私のところでの使用条件は改めて別エントリに書き出します。

専用ブラウザから"ブラウザで開く"類を設定

専用ブラウザから"ブラウザで開く"類のアクセスに404を返したままでした。

http://example.com/test/read.cgi/boardName/threadKey/optionhttp://example.com/boardName/nonyu.php/threadKey/option にリダイレクトするように設定しました。

ドメイン直下の.htaccessでRewriteEngine Onにするのは嫌だったので、testディレクトリを作りその中の.htaccessで


RewriteEngine On
RewriteBase /
RewriteRule ^read\.cgi/([^/]*)/(.*) $1/nonyu.php/$2 [R,L]

としました。

iwnid b0.2.3

[新機能] NGワード機能をつけました。

手動で消していく運用は取りこぼしを極力減らすことが出来ます。しかしdat落ち周期の長い板が混じっていた場合、消すまでのタイムラグが長くなってしまいます。 ですのでNGワード機能をつけました。長めのNGワードをアドホックに追加することで取りこぼしを少なくすることが可能です。除外検索の実装はまたいつか…

datのcrawlerを共用鯖に置く非

利 「設置が容易」「コストが安価」
非 「共用鯖ではスクリプトに強制時間制限があることが多い」「共用鯖からの複数アクセスは相手にとって区別が付かない」「IPが変わらない」

自己中心で考えていくとこれ以上ない利なわけですが、使い方によっては各所に迷惑を掛けてしまいます。以下その非について触れます。
ちなみにここでは共用鯖、専用鯖、グローバルIPが割り当てられてる鯖(専用鯖、自宅鯖)ぐらいに分けて考えています。

クローラはクロールされる側から見れば、比較的短時間に同じIPから繰り返し呼び出す対象です。このとき、独自ドメインを取っていようと同じサーバの別のアカウントだろうと、同じIPからのアクセスは同一の相手からのアクセスにしか見えません。もちろんUserAgentやリファラ等で区別することが可能な場合もありますが、「どこからのアクセス」を見る際にそんなところはチェック対象にしないので大差はないです。これはアクセスに対してIPで対応しようがホストを引こうが同じことです。

要するに、自分が節度を持ってアクセスしていても同じIPから(同じサーバじゃなくても)無茶するやつがいればまとめて規制を受けます。逆もまた然りです。

次に、共用鯖のスクリプトは大量のアクセス・重い処理を一気に処理することは想定していても、ぽつぽつと定期的に(数秒〜数十秒間隔)軽い処理をすることは想定していません。だいたいどのサーバでも10秒から30秒程度で強制的にストップされてしまいます。settimelimit等の設定しだいですが、これを弄れないサーバも多いです。

制限時間内に巡回を終えなければ、という方向にばかり意識が向かってしまうと、毎秒n回の連打アクセスなんてことになってしまいます。

そして、こと2chそれも読み込みに限った規制の話をします。とかげの尻尾切り、バーボンハウス、海外規制、htaccessで手動、知っているのはこれぐらいです。2chwikiを見れば大体のことは把握できます。それ以上詳しい情報は各自調べてください。
2ちゃんねるWiki – いきいき Wiki ( http://info.2ch.net/wiki/ )

一番食らいやすいのはとかげの尻尾切り規制です。これは、K秒・分単位に、L回アクセスがあった場合、M時間アクセスできなくなる、ものです。これに引っかかると規制リスト入りしてバーボンハウスとなります。巡回プログラムをパラメータ調整しながら作っていたときに私も実際に何度か食らいました。これは回線切ってIP変えられる場合は簡単に対応できます。自分が繋いでいたIPを割り当てられた人はドンマイですが。しかし、固定IPの場合そうも行きません。ただしこの規制は、ほっとくと直ります。

連続書き込み、クローラで地引、なんて場合に引っかかるのがバーボンハウス規制です。トカゲの尻尾きり→規制リスト入りでバーボンハウスの場合は前述の通りほっとけば直ります。しかし、それ以外のルートでバーボンハウスの場合はほっといても直りません。クロール専用鯖( http://liveb1.2ch.net/ )が用意されている場合、そこは地引いてもバーボンハウスにはならないそうです。しかし、クロール鯖が用意されていない板も多々あるのでその場合は気を付ける必要があります。

海外規制は書き込みのみ規制、読み込みも規制を含めて何段階もありそうです。ここは推測にすぎません。具体的には、海外無料鯖からつないだ時に2chから接続を拒否されるものがありました。個別に規制されていたのか、IPで包括的に規制されているのか、その辺がわかる術は私にありません。

最後に手動規制。以前自分が悪さをしたり、あるいはそのIPから誰かが悪さをした場合、手動で永久規制になっているものがあります。その場合解除の見込みはほぼ無いです。

以上の規制はブラックリスト型ですが、逆にホワイトリストも存在します。みみずん、肉ちゃんねる、p2.2ch.netクラスになるとそっちに入れてもらえるらしいですが、そこまではなかなか。

「共用鯖ではスクリプトに強制時間制限があることが多い」「共用鯖からの複数アクセスは相手にとって区別が付かない」「IPが変わらない」

これらの理由から共用鯖にcrawlerを置くことは非なのです。回線負荷、ハードウェア負荷が小さくても、です。

2chのp2スレのテンプレ「※レンタル鯖にp2設置は2ch運営とp2ユーザーに迷惑なのでやめましょう。 」はこの辺も含めて言ってるんだと思います。

でもさあ、グローバルIPもらえる専用鯖や自宅鯖って技術的にも金銭的にもハードル高い…

更新トリガに使っている各種RSSリーダ・アンテナのIP・UA

 Bloglines
HTTP_REFERER:
HTTP_USER_AGENT:Bloglines/3.1 (http://www.bloglines.com; 1 subscriber)
REMOTE_ADDR:65.214.44.29
gethostbyaddr:crawler.bloglines.com
メモ:巡回間隔は約1時間

google reader
HTTP_REFERER:
HTTP_USER_AGENT:Feedfetcher-Google;
(+http://www.google.com/feedfetcher.html; 1 subscribers;
feed-id=2780404538756860077)
REMOTE_ADDR:72.14.199.15
gethostbyaddr:72.14.199.15
メモ:巡回間隔は約3時間

livedoor reader
HTTP_REFERER:
HTTP_USER_AGENT:livedoor FeedFetcher/0.01
(http://reader.livedoor.com/; 1 subscriber)
REMOTE_ADDR:203.104.98.220
gethostbyaddr:5a-m02-d5.data-hotel.net
メモ:巡回間隔は約5時間

はてなアンテナ
HTTP_REFERER:
HTTP_USER_AGENT:Hatena Antenna/0.5 (http://a.hatena.ne.jp/help)
REMOTE_ADDR:222.149.234.136
gethostbyaddr:p3136-ipbf615marunouchi.tokyo.ocn.ne.jp
メモ:巡回間隔は約5時間 HEAD→GETと取得が丁寧

WEBCRON
HTTP_REFERER:
HTTP_USER_AGENT:WEBCRON ENGINE II – v1.0.1
REMOTE_ADDR:62.193.231.80
gethostbyaddr:wpc1810.amenworld.com
メモ:最短の巡回間隔は1時間 設定次第 巡回にムラあり

iwnid b0.2.1

[バグ修正] 更新用のフィードが更新無かった時304を返さなくなっていたバグを修正しました。

ヘッダ出力の前にrequireされてるファイルがexit吐いてて、それが悪さをしていました。returnに変えてバグを修正。