2chの色々なこと

掲示板サーバの中身

2chの掲示板鯖の基本的なファイル配置はこうなっています(外から見える範囲かつ、主な物だけ)

yutori.2ch.net
 |
 |──news4vip(言わずと知れたν即VIP)
 |    |──index.html(IEで板を開いたときに出てきます)
 |    |──subject.txt(生きているスレのスレタイとスレ番が入ってます)
 |    |──subback.html(↑と内容は同じ。形式が違う)
 |    |──setting.txt(板の設定値(板名とか、本文の行数の上限とか、連投規制値)が入ってます)
 |    |──1001.txt(1001の内容っす)
 |    |──head.txt(ローカルルールの原本がここに)
 |    |──dat(生きているスレのdatが入っとります)
 |    |   |──1172740677.dat
 |    |   |──1172766831.dat
 |    |   |──1172832524.dat
 |    |   |     ・
 |    |   |     ・
 |    |   |     ・
 |    |
 |    |
 |    └──kako(過去ログがたんまりと。面倒だから説明は後々…)
 |
 |──skate(スポーツ系板の問題児!スケート板)
 |
 |──heavn4vip(狐の意図がわからない!天国板)
 |    ・
 |    ・
 |    ・
 |    
 |──_service
 |   |
 |   |──bbslist.txt(その鯖の板一覧が入ってます)
 |   |──数字八桁.txt(10分毎のLAが見れます)
 |   |──PV数字八桁.txt(1時間毎のPVが見れます。http://qb5.2ch.net/operate/1104955745/193)
 |   └──IPnum-(ry.txt(規制関連のデータだったと思います。。。)
 |
 |
 |
 └──test
     |──bbs.cgi(レスとスレ立てに使います)
     |──read.cgi(datフォルダのdatをhtmlに整形してクライアントに返します)
     └──reag.html(↑と同じ動作をするjavascriptが含まれたhtmlを返します)

鯖リスト

2chのボランティアであるroot★氏のサイトが一番新しく確実です。

もしくは、2chの板リストから。

スレの読み方

read.cgiを叩かずに、datを直読みしましょう。
datは2008年現在、

名前<>メール欄<>年/月/日(曜) 時:分:秒.下二桁(無い板もある) ID:hogehoge0<>本文

の形で記録されています。
本文内では、<>"がエスケープされて、改行は<br>であらわされています。

HTTPでのリクエストの方法は、

GET /news4vip/dat/11111111111.dat HTTP/1.0
Host: yutori.2ch.net
User-Agent: Monazilla/1.00
Connection: close

こんな感じです。
余裕が有るなら、下の方で書いてある差分取得も実装しましょう!

bbs.cgiの叩き方

と~く2ちゃんねるさんパクr今風に改変&抜粋しています。
許可とか取ったほうが良いかな……?

とりあえずHTTPリクエストの例(VIPのhttp://yutori.2ch.net/test/read.cgi/news4vip/1217356258/に、 名前欄はデフォ、目欄はsageでhogehogeと書き込みます)

POST /test/bbs.cgi HTTP/1.0
Host: yutori.2ch.net
Content-length: 83
Referer: http://yutori.2ch.net/news4vip/
User-Agent: Monazilla/1.00
Connection: close

bbs=news4vip&key=1217356258&time=1&submit=書き込む&FROM=&mail=sage&MESSAGE=hogehoge

こんな感じでポストすると…

HTTP/1.1  200 OK
Date: Wed, 30 Jul 2008  12:25:17 GMT
Server: Apache/2.0 .59 (Unix) PHP/5 .2.5 mod_ssl/2.0 .59 OpenSSL/0.9. 7e-p1
Set-Cookie: PON=hogehoge; expires= Friday, 01-Jan-2 010 00:00:00 GMT ; path=/
Vary: Accept-Encoding
Content-Length: 1076
Connection: close
Conten t-Type: text/html
以下略

こんな感じのが帰ってきます。
重要なのはここ
>Set-Cookie: PON=hogehoge; expires= Friday, 01-Jan-2 010 00:00:00 GMT ; path=/
PON=の後には自分のホスト名が入っています。

んで、この帰ってきたPON以下を、

POST /test/bbs.cgi HTTP/1.0
Host: yutori.2ch.net
Content-length: 83
Cookie: PON=hogehoge; expires= Friday, 01-Jan-2 010 00:00:00 GMT ; path=/
Referer: http://yutori.2ch.net/news4vip/
User-Agent: Monazilla/1.00
Connection: close

bbs=news4vip&key=1217356258&time=1&submit=書き込む&FROM=&mail=sage&MESSAGE=hogehoge

こんな風に組み入れて再度POSTすれば書き込めます。
自分のIPが変わるまではCookieの中身を流用できます。
IPが変わったら再度Set-Cookieヘッダが付いてきます。

簡単にまとめ

POST /test/bbs.cgi HTTP/1.0
Host: 書き込みたい板のある鯖(namidame.2ch.net等)
Content-length: ポストするデータのサイズ(バイト)
Referer: 書き込みたい板のURL(http://namidame.2ch.net/news等)
User-Agent: Monazilla/1.00(ここは慣例)
Cookie: NAME=名前; MAIL=メール; SPID(PON)=値; expires=有効期限; path=/(NAMEとかMAILに値が入っていると、フォームにデフォで中身が入ってます。)
Connection: close(Keep-Aliveが有効な鯖とそうでない鯖が混在してます。確か。)
(ここは改行)
bbs=板名&key=スレッド番号(スレが立った瞬間のUNIXTIME)&time=1&submit=書き込む(ここは弄らずに)&FROM=名前(名前欄の内容)&mail=sage(目欄の内容)&MESSAGE=本文(そのまんま) 
(もう一度改行)

書き忘れてましたが、名前欄の内容、目欄の内容、本文の内容、
そしてsubmit=「書き込む」はちゃんとURLエンコードしてくださいね。

鯖にやさしい漢になろう

鯖の負荷、転送量を考えたコーディングを行いましょう。
例を挙げますと、
・連続更新の自主規制
・差分取得の実装
・gzip圧縮への対応
等になります。

連続更新の自主規制

読んだまんまです。
Janestyle等では、同時にアクセスできるスレッドがデフォルトでは3つまでだったり、&brl 3秒待たないと同じスレッドを更新できないようになっています。

俺しか使わねーから良いじゃんwwwwと思ってる人も、
リロードバーボンが実装されましたので、アクセスしすぎるとバーボンハウス送りとなります。

差分取得

これは、datをリクエストする時、HTTPヘッダに「If-Modified-Since」「range」を付ける事により、
更新が無い時には再受信せず、更新があるときでも前回読み込んだ場所の終わりから受信するという高等テクニックです。
例えば、前回の受信日時が2008/7/30 12:12:12で、
スレッドを3050バイトまで受信したときは、

If-Modified-Since: Wed, 30 Jul 2008 12:12:12 GMT
Range: bytes=3050

という二行を足してやればおkです。

この手法を使う際は、 更新があったか?無かったか?あぼんはあったか?というのを判定する必要があります。
方法は色々ありますが、個人的にはRangeヘッダには前回受信したバイトから2を引いた数を入れ、
新しく受信したデータが改行コードから始まっているかどうかを見る方法が好きです。

gzip圧縮への対応

datにアクセスするときに、

Accept-Encoding: gzip

をヘッダに加えるだけです。多分。

情報が古くてよく分からないので、そのうち運用板のログ漁って調べときます。。。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS