ガジェカツ~在宅SEのガジェット活動ブログ~

在宅SEな筆者がガジェットネタやIT、プログラミングネタを書き連ねるブログ

2chとの通信方法をまとめてみた〜超基本通信編〜

どうもzuzuです。
少し前からiMona中間サーバー改良のために2chとの通信用ライブラリを作っています。そのために必要な情報すなわち2chとの通信方法をまとめてここに書いていこうと思います。
今回はその最初として最低限2chのスレッド一覧やスレッドを読み込む基本的な方法を記述します。

最初に

多くの情報はと〜く2ちゃんねる - Talk 2chを参考に自分がわかりやすく再構成した物です。
自分で調べた情報は2ch公式キャッシュサーバー、リロードバーボン判定、まちBBSやしたらばへのアクセス用プロクシです。

基本用語

ここではこの記事で使用される単語を説明します。

http://pc12.2ch.net/test/read.cgi/software/1237434726/を例にします。
サーバー名 pc12.2ch.net
板名 software
スレッドキー 1237434726

基本的情報は以下の通りです。

基本通信方法

基本的な通信方法といってもUAの指定や文字コード、接続先ポートなどのことです。

  • UA(ユーザーエージェント)は基本的に以下のような書式のものを利用するのを2chは勧めています。
    • Monazilla/1.00 (ブラウザ名/バージョン)
  • BE系統の板も含めて全ての2chからのデータの文字コードShift_JISです。
  • 接続先ポートは80番(http)です。

板一覧の取得

板一覧はhttp://menu.2ch.net/bbsmenu.htmlまたはbbstable.htmlを取得し解析することで分かります。
bbsmenu.htmlを利用することが多いようですので、ここではbbsmenu.htmlの解析方法を載せておきます。

bbsmenu.htmlのフォーマット
<A HREF=http://www.2ch.net/ TARGET="_top">2chの入り口</A><br>
<A HREF=http://info.2ch.net/guide/>2ch総合案内</A>
<BR><BR><B>地震</B><BR>
<A HREF=http://headline.2ch.net/bbynamazu/>地震headline</A><br>
<A HREF=http://gimpo.2ch.net/namazuplus/>地震速報</A><br>
<A HREF=http://live24.2ch.net/eq/>臨時地震</A><br>
<A HREF=http://live23.2ch.net/eqplus/>臨時地震+</A>

以上のようになっていますが2chおよびbbspink、まちBBSのアドレスだけ取得するために以下のフォーマットに該当するものだけ取り出すのが定石となっています。

<BR><BR><B>[板カテゴリ]</B><BR>
<A HREF=http://[サーバー名]/[板キー]/>板名</A><br>

スレッド一覧の取得

スレッド一覧は各板アドレス直下のsubject.txtに書き込まれています。

subject.txtのアドレス

http://[サーバー名]/[板キー]/subject.txt

subject.txtのフォーマット

subject.txtは以下のようなフォーマットでその板のスレッドが一行に一スレずつ書き込まれています。
そのため板の全スレッド数を数えるにはsubject.txtの文字コード\nの数を数えることで導くことが出来るでしょう。

スレキー.dat<>スレタイトル (総スレ数)\n

スレッドの取得

スレッドは.datという拡張子で保存されています。

スレッドのアドレス

http://[サーバー名]/[板キー]/dat/[スレッドキー].dat

スレッドのフォーマット

以下のように一行一レスずつ書き込まれています。

[名前]<>[メール]<>[日付] [ID] [BE-ID]<> [本文]<>[スレッドタイトル]\n

  • 最後の<>の後ろ、[スレッドタイトル]があるのは1レス目だけです。
  • [ID]と[BE-ID]はかけている場合があります。
  • 名前欄にトリップが使用された場合はトリップの間に</b>と<b>タグが入ります。
  • またキャップが名前欄に使用される可能性もありますがこれはトリップと同じ表記法であると思われます(未確認)
  • 基本的に両方とも常に名前欄からhtmlタグを除外しておけばいいと思われます。
  • 本文中では<br>で改行を示します。また<br>の前後の間には半角スペースが一つずつ入ります。
  • <br>以外のhtmlタグの<>が文字実体参照を利用して変換されていますのでもしHTMLタグを解釈出来ないもので表示する際は文字実体参照を元の文字に戻すことをおすすめします。
  • 再度言いますが文字実体参照を元の文字に戻すのをおすすめするのは表示部分がHTMLタグを解釈しないものであるときだけです。それ以外、いわゆるブラウザコンポーネント(コントロール)を利用する場合は文字実体参照を自動的に解釈するのでそのままにしておいてください。もしブラウザコンポーネントを利用する際に文字実体参照を元の文字に戻した場合はスパム書き込みのjavascriptなどを実行してしまうことがあります。
  • 最近では日本語以外の文字?が文字実体参照へ変換されていることもあります。
スレッドのサンプル

実際に使用されている形式を幾つか例として載せておきます。
基本的にキャップを利用したサンプル以外は全て載せてあります。

名無しさん<>sage<>2008/12/12(金) 17:28:35 ID:???<> テスト <>テストスレ
あ<><>2008/12/19(金) 18:03:53 ID:wVgD6TdW<> てst <>
名無しさん<>sage<>2008/12/12(金) 20:28:38 ID:???<> http://www.blog.jp/40 <>
名無しさん<>sage<>2008/12/13(土) 02:11:04 ID:???<> ほんげー <>
名無しさん<>sage<>2008/12/16(火) 22:08:27 ID:???<> http://aaa.com/img/368.jpg <>
 </b>◆iMona7m46s <b><>sage<>2009/03/19(木) 13:22:18 ID:73hw3YucO<> iMonaのファイル置き場 <br> http://file.k2y.info/ <>
zuzu </b>◆zuzuDj.USc <b><>sage<>2009/04/12(日) 15:11:43 ID:WwrWkjlB0<> お久しぶりです、zuzuです。 <>
 </b>◆zuzuDj.USc <b><><>2010/03/09(火) 16:28:11 ID:LRvfAEgU0 BE:1788420858-2BP(0)<> どうもzuzu鯖管理人のzuzuです。 <>

正規表現サンプル

今回解説した板一覧、スレッド一覧、スレッドの解析時に使用する正規表現のサンプルをここに載せておきます。

板一覧
■板カテゴリの場合
<BR><BR><B>(.+)</B><BR>
■板の場合
<A HREF=http://([a-zA-Z\.]+)/([a-zA-Z]+)/>(.+?)</A><br>
スレッド一覧

([0-9]+\.dat)<>(.+)\s+\(([0-9]+)\)

スレッド

■スレッド全体の場合
(.*?)<>(.*?)<>(.*?)<>\s(.*?)\s<>(.*?)\n
■日付およびID表記場所の場合(BEID無視バージョン)
([0-9]+/[0-9]+/[0-9]+\(.+?\))\s+([0-9]+:[0-9]+:[0-9]+)\s+ID:([^< ]+)
■同上(BEID存在バージョン)
([0-9]+/[0-9]+/[0-9]+\(.+?\))\s+([0-9]+:[0-9]+:[0-9]+)\s+ID:([^<]+)\s+BE:([^<]+)

最後に

今回は板一覧、スレッド一覧、スレッドファイルの取得および解析方法を記述しました。
次回はスレッドの建て方、レスの書き込み方を書きます。
そして三回目ではスレッド一覧、スレッドファイルの更新チェック、スレッドの差分読み込みの方法。
また四回目では2ちゃんねるビューワ(通称、●)およびBEへのログインと利用方法について。
最後の第五回目では規制の判別方法および対策方法また各種機能の情報取得(関連キーワード)を書いていこうと思っています。
それでは!