- 追加された行はこの色です。
- 削除された行はこの色です。
*2chの色々なこと [#t1c26a5b]
#contents
**掲示板サーバの中身 [#m55701a5]
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を返します)
|──offlaw.cgi(dat落ちしたスレを取得する際に使います)
|──subbbs.cgi(スレ立てに使ってましたが、現在は廃止されています)
|──r.i(携帯でのアクセスに使ってましたが、現在は(ry)
|──p.i(携(ry現(ry)
|──headad.txt
|──putad.txt
|──bbs-yakin.cgi
|──flash.txt
└aho┬gonta_oxy.cgi
└gonta893.cgi
**鯖リスト [#fe979f22]
2chのボランティアである[[root★氏のサイト:http://mumumu.mu/serverlist.html]]が一番新しく確実です。
もしくは、[[2chの板リスト:http://www.2ch.net/bbsmenu.html]]から。
**スレの読み方 [#o6b1ada6]
read.cgiを叩かずに、datを直読みしましょう。&br;
datは2008年現在、
名前<>メール欄<>年/月/日(曜) 時:分:秒.下二桁(無い板もある) ID:hogehoge0<>本文
の形で記録されています。&br;
本文内では、<>"がエスケープされて、改行は<br>であらわされています。
HTTPでのリクエストの方法は、
GET /news4vip/dat/11111111111.dat HTTP/1.0
Host: yutori.2ch.net
User-Agent: Monazilla/1.00
Connection: close
こんな感じです。&br;
余裕が有るなら、下の方で書いてある差分取得も実装しましょう!
**bbs.cgiの叩き方 [#adb49020]
[[と~く2ちゃんねるさん:http://age.s22.xrea.com/talk2ch/]]を%%パクr%%今風に改変&抜粋しています。&br;
許可とか取ったほうが良いかな……?
とりあえず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: 95
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&hana=mogera
詳細は、後述の「簡単なまとめ」を見てください。&br;
で、こんな感じでポストすると…
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-2010 00:00:00 GMT; path=/
Set-Cookie: HAP=fugafuga; expires=Friday, 01-Jan-2010 00:00:00 GMT; path=/
Vary: Accept-Encoding
Content-Length: 1076
Connection: close
Conten t-Type: text/html
以下略
こんな感じのが帰ってきます。&br;
重要なのはここ&br;
>Set-Cookie: PON=hogehoge; expires= Friday, 01-Jan-2 010 00:00:00 GMT ; path=/&br;
PON=の後には自分のホスト名が入っています。&br;
んで、この帰ってきたPON以下を、
POST /test/bbs.cgi HTTP/1.0
Host: yutori.2ch.net
Content-length: 95
Cookie: PON=hogehoge;HAP=fugafuga
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&hana=mogera
こんな風に組み入れて再度POSTすれば書き込めます。&br;
自分のIPが変わるまではCookieの中身を流用できます。&br;
IPが変わったら再度Set-Cookieヘッダが付いてきます。&br;
Set-Cookie:の内容を単純に全部組み込んでも構いません。↓
Content-length: 95
Cookie: PON=hogehoge; expires=Friday, 01-Jan-2010 00:00:00 GMT; path=/
Cookie: HAP=fugafuga; expires=Friday, 01-Jan-2010 00:00:00 GMT; path=/
Referer: http://yutori.2ch.net/news4vip/
***簡単にまとめ [#p430350e]
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(1回の送受信で切断するという意味)
(ここは改行)
bbs=板名&key=スレッド番号(スレが立った瞬間のUNIXTIME)&time=1&submit=書き込む(ここは弄らずに)&FROM=名前(名前欄の内容)&mail=sage(目欄の内容)&MESSAGE=本文(そのまんま) &hana=mogera
(もう一度改行)
書き忘れてましたが、名前欄の内容、目欄の内容、本文の内容、&br;
そしてsubmit=「書き込む」はちゃんとURLエンコードしてくださいね。&br;
ConnectionはKeep-Aliveが有効な鯖とそうでない鯖が混在してます。確か。&br;
**鯖にやさしい漢になろう [#m607d19c]
鯖の負荷、転送量を考えたコーディングを行いましょう。&br;
例を挙げますと、&br;
・連続更新の自主規制&br;
・差分取得の実装&br;
・gzip圧縮への対応&br;
等になります。&br;
***連続更新の自主規制 [#j83e6aab]
読んだまんまです。&br;
Janestyle等では、同時にアクセスできるスレッドがデフォルトでは3つまでだったり、&brl
Janestyle等では、同時にアクセスできるスレッドがデフォルトでは3つまでだったり、&br;
3秒待たないと同じスレッドを更新できないようになっています。&br;
俺しか使わねーから良いじゃんwwwwと思ってる人も、&br;
リロードバーボンが実装されましたので、アクセスしすぎると[[バーボンハウス:http://qb6.2ch.net/_403/]]送りとなります。&br;
***差分取得 [#wc9b2266]
これは、datをリクエストする時、HTTPヘッダに「If-Modified-Since」「range」を付ける事により、&br;
更新が無い時には再受信せず、更新があるときでも前回読み込んだ場所の終わりから受信するという高等テクニックです。&br;
例えば、前回の受信日時が2008/7/30 12:12:12で、&br;
スレッドを3050バイトまで受信したときは、
If-Modified-Since: Wed, 30 Jul 2008 12:12:12 GMT
Range: bytes=3050
Range: bytes=3050-
という二行を足してやればおkです。&br;
このとき、If-Modified-Since:の右側には前回取得した時の
Last-Modified: Wed, 30 Jul 2008 12:12:12 GMT
の右側をそのまま与えてください。&br;
更新が無かった場合は304 Not Modifiedが返ってきます。
この手法を使う際は、
更新があったか?無かったか?あぼんはあったか?というのを判定する必要があります。&br;
またこの手法を使う際は更新があったか無かったかの他に、あぼんはあったか?というのを判定する必要があります。(あぼんがあったらdatサイズが減る場合があるため)&br;
方法は色々ありますが、個人的にはRangeヘッダには前回受信したバイトから2を引いた数を入れ、&br;
新しく受信したデータが改行コードから始まっているかどうかを見る方法が好きです。&br;
なお、あぼんによってサイズが減っている場合は
416 Requested Range Not Satisfiable
が返ってきますので、全部取得しなおしてください。
***gzip圧縮への対応 [#g44b3eae]
datにアクセスするときに、
Accept-Encoding: gzip
をヘッダに加えるだけです。多分。&br;
をヘッダに加えます。すると
Content-Encoding: gzip
というヘッダーが返って来て、datが gzip圧縮された状態で返されます。
そのままパイプか何かでgzipに流すかzlib等を使って解凍すると、Accept-Encoding: gzipをつけなかった時と同じ内容になります。
情報が古くてよく分からないので、そのうち運用板のログ漁って調べときます。。。
必ずしも圧縮されて返ってくるわけではない(差分取得の時等)ので、Content-Encoding: gzipがあることを確認してから解凍しましょう。