>>2.cgiプロトコル仕様書 ver1.23<< このドキュメントは、2.cgi<->iMona間のプロトコルの仕様書です。 記憶とソースから仕様書を起こしていますので何らかの間違いなどがあるかもしれません。 間違い、不明な点などがありましたらスレッド、メールなどで教えて頂ければ幸いです。 この仕様書を使用して、サーバに負荷を加えるいたずらや 無断でiMona以外の用途に使用したりはしないでください。 バージョンDは暫定仕様です。今後、細かな変更や追加などが行われる可能性があります。 ■2.cgiの呼び出し方法 get,postの両方を使用することができます。 getの場合 http://imona.net/2.cgi?v=D&m=m&b=0&t=1234567890&c=s1t20 というようにして呼び出します。 postの場合は、?の後、つまり v=D&m=m&b=0&t=1234567890&c=s1t20 の部分を送信してください。 この場合の意味は以下の項目を参照してください。 ■呼び出しオプション  ・v 意味:データ出力形式のバージョンを指定 値:1 2 3 4 5 6 7 8 9 A B C D 注意:  このドキュメントではそれぞれの値による違いは省略し、iMona 0.74.xで使用されているバージョンCおよび  バグを修正した、iMona 0.75で使用予定のバージョンDのみの解説となります。  全てのコマンドにはバージョンの指定が必要です。  ・m 意味:動作モードを設定 値:b t m s u w src me ver 値の意味:  b 板一覧の読み込み(省略可)  t スレッド一覧の読み込み(省略可)  m スレッドの読み込み(省略可)  s スレッドの検索  u URLを指定して読み込み  U 板番号から板のURLを取得  w 書き込み画面の出力(html)or2chの書き込み画面にリダイレクト(サーバの設定に依存)  src 2.cgiのソースを出力(アプリからは利用しません)  me iMona v0.52用の文字列リソースを出力(現在は使用しません)  ver 2.cgiのバージョンを出力します 注意:  b t mは省略してもその他のデータ(b=〜,t=〜)によって補完されます。  ・p 意味:オプション 値:i t m n a u x p d g z s h f 値の意味:  i IDを消去  t 時刻を消去  m メールを消去  n 名前を消去  a AAを消去(現在は不完全)  u URLを消去  x iMona独自形式での圧縮はしない  p iMona独自形式での圧縮方法 p0:非可逆圧縮+可逆圧縮 p1:非可逆圧縮のみ p2:可逆圧縮のみ p3:圧縮しない(xオプションを指定したのと同じ)  d deflate圧縮 d1〜d9:圧縮率(1:圧縮時間を最短にする、9:圧縮率を最高にする) dのみで、圧縮率の指定がない時は6になります。但し、サーバーの設定により、圧縮率の設定が無効になる場合があります。 圧縮するよう指定されていても、fオプションが指定されていなくて、圧縮後に容量が増えている場合は圧縮を行いません。 この区別のため、fオプションが指定されていない場合は、 圧縮が行われたときは全ての出力の前に0x01が送信され、行われなかったときは0x02が送信されます。 そしてこの後、圧縮されたデータが続きます。  g gzip圧縮 g1〜g9:圧縮率(1:圧縮時間を最短にする、9:圧縮率を最高にする) 詳細はdeflate圧縮の項目を参照してください。  z zip圧縮 z1〜z9:圧縮率(1:圧縮時間を最短にする、9:圧縮率を最高にする ) 詳細はdeflate圧縮の項目を参照してください。 s deflate,gzip,zip圧縮した際、圧縮後のデータサイズも出力する deflate,gzip,zip圧縮が行われた際、0x01の次に240進数で圧縮後のデータサイズを出力し、0x0Aを出力します。  h gzip圧縮の場合、ヘッダ(0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03)を省きます。 これはzip圧縮の時は行われません。 f データ容量にかかわらず必ずdeflate,gzip,zip圧縮を行う(圧縮したかどうかのフラグ(0x01,0x02)は出力しません)。 注意:  p又はxを指定しないとデフォルトで非可逆圧縮+可逆圧縮がかかります。圧縮の詳細は、圧縮についてを参照してください。  複数のオプションを指定する場合は並べて書きます。例えばi,t,m,n,p2を指定する場合は、  p=itmnp2と書きます(順序は問いません)。  また、圧縮しない設定にした場合でも以降に記述する数字の240進数化は行われます。  ・b 意味:板番号 注意:  板番号とは、iMonaでそれぞれの板に勝手に割り当てた番号のことです。  URLを直接介さないことでパケット代を節約する目的で導入されています。  ・t 意味:スレッド番号 注意:  スレッド番号とは2chで使用されているスレがたったときの日付です。  iMonaのスレッド http://pc2.2ch.net/test/read.cgi/software/1055411823/  なら1055411823に当たる部分です。  ・c 意味:読む範囲の指定 書式:sXXXtYYY 又は lZZZ  sXXXtYYYは、XXXからYYYの範囲のスレッド一覧又はスレッドの取得を表します。  lZZZは、最新ZZZのスレッド一覧又はスレッドの取得を表します。 注意:  これが省略された場合、サーバではc=s1t10と補完して動作します。  ・w 意味:スレッド検索時のキーワード 注意:  これはm=sと同時に使用します。  ・u 意味:URLを指定して読み込む時のURL 注意:  2ch以外のURLを指定するとエラーが帰ります。 ■出力データのフォーマット  まず、1バイト目が0x00-0x0Fならばエラーとして処理します。 0x00:なんらかのエラー 0x01:読み込もうとしている範囲にレスがない(新しいレスがない) 0x02:iMonaサーバ<->2chの通信エラー 0x03:検索で何もヒットしなかった 0x04:スレッドはDAT落ち 0x05-0x0F:未定義。 注意:  未定義であっても、他のエラーと区別するためにサーバがこのエラーが返すこともあります。  次にエラーでないときです。  ・スレッド一覧の読み込み、スレッドの検索の時 圧縮後の容量(240) \t(0x09) 圧縮前の容量(240) \n(0x0A) スレッドの数(240) ○以下の物が[スレッドの数]分続く○ スレッド番号(240) \t(0x09) スレッドタイトル(sjis) \t(0x09) レスの数(240) \n(0x0A) 注意:  最終の\n(0x0A)は省略されます。  (240)とは、数字を0x10-0xFFの範囲を使ってバイナリ化されているという意味です。便宜上240進数と呼びます。  例えば1000の場合、1000 = 4 * 240 + 40なので4+16=20(10進数) 40+16=56(10進数)つまり16進数では0x14 0x38となります。  また、ここで言う圧縮前後の容量とは、\nより後ろのバイト数を指しています。  ・スレッドの読み込みの時 圧縮後の容量(240) \t(0x09) 圧縮前の容量(240) \t(0x09) 開始レス番号(240) \t(0x09) 終了レス番号(240) \t(0x09) そのスレのレス数(240) \n(0x0A) ○以下の物が[終了レス番号]-[開始レス番号]+1続く○ レスの内容(sjis,改行コード:\r(0x0D)) \t(0x09) 名前(sjis) \t(0x09) Mail(sjis) \t(0x09) 時間(sjis) (\t(0x09)) (ID(sjis)) \n(0x0A) 注意:  最終の\n(0x0A)は省略されます。  IDは存在しないときはタブと一緒に省略されます。  ・m=u(URLを指定して読み込み)の時 ・出力されたデータはスレッド一覧の時   1バイト目:0x14(バージョンD)   板番号(240)   \t(0x09)   板の名前(sjis)   \n   この後、[・スレッド一覧の読み込み、スレッドの検索の時]の内容が続きます。   注意:    バージョンCの場合、0x14は0x04となっています(エラーとの区別がつかないバグがあります)。 ・出力されたデータはレスの時   1バイト目:0x13(バージョンD)   板番号(240)   \t(0x09)   スレッド番号(240)   \t(0x09)   スレッドの名前(sjis)   \n   この後、[・スレッドの読み込みの時]の内容が続きます。   注意:    バージョンCの場合、0x13は0x03となっています(エラーとの区別がつかないバグがあります)。  ・m=U(板番号から、板のURLを出力)の時 URL(ascii) 注意:  URLにはプロトコルの部分(http://)が省かれます。また、圧縮は行われません。  ・m=b(板一覧の読み込み)の時 圧縮後の容量(240) \t(0x09) 圧縮前の容量(240) \n(0x0A) 板一覧のデータ(sjis) ・板一覧のフォーマットについて   カテゴリ1 \n   カテゴリ2 \n   ・   ・   カテゴリn \n   \n   カテゴリ1の板名1 \t カテゴリ1の板名2 \t カテゴリ1の板名3 \n   カテゴリ2の板名1 \t カテゴリ2の板名2 \t カテゴリ2の板名3 \t カテゴリ2の板名4 \n   ・   ・   カテゴリnの板名1 \t カテゴリnの板名2 \n   となっています。   板番号は、   int(板番号 / 100) = カテゴリのインデックス   板番号 % 100 = カテゴリ内のインデックス   という法則でつけられています。   例えば、板番号0だと0番目のカテゴリの0番目の板(年末年始)   板番号101だと1番目のカテゴリの1番目の板(ニュース速報+)   板番号1102だと11番目のカテゴリの2番目の板(携帯・PHS)   を指すことになります。(0から数えています) ■圧縮について  ・deflate圧縮 J-PHONE/vodafoneのJavaアプリではdeflateしか使用できないのでdefateで出力できるオプションがあります。 2.cgiでは、内部で一度gzip圧縮を行いそれを変換しています。 詳しくはオプションの説明を参照してください。 ヒント:  deflateを使用する場合でも、可逆圧縮+非可逆圧縮を併用した方が容量が多少小さくなることが多いようです。  ・gzip圧縮 現在のバージョンはgzipをサポートしています。 この圧縮はAccept-encoding: gzipが送られたとき、又はgzip圧縮のオプションをつけたときにgzip圧縮が行われます。 この二つが同時に指定されると、オプションの方が優先されます。 詳しくはオプションの説明を参照してください。 ヒント:  deflateの場合と同様に、gzipを使用する場合でも可逆圧縮+非可逆圧縮を併用した方が容量が多少小さくなることが多いようです。  また、Accept-encoding: gzipを使用せずにオプションで指定した方が  Content-encoding: gzipが出力されない分、通信量が少なくなりますのでオプションでの指定を推奨します。  ・gzip圧縮(pkzip形式,zip形式) iアプリではjar形式(zip)しか受け付けないようなのでこのオプションがついています。 しかし、zip形式はgzip形式よりも無駄が多いのでかなり離れ業ですがアプリ内で変換した方がいいと思います。 2.cgiでは、内部で一度gzip圧縮を行いそれを変換しています。解凍する際のファイル名は「a」を指定してください。 この圧縮はzip圧縮のオプションをつけたときに行われます。 詳しくはオプションの説明を参照してください。 ヒント:  deflateの場合と同様に、zipを使用する場合でも可逆圧縮+非可逆圧縮を併用した方が容量が多少小さくなることが多いようです。  ・圧縮の適用範囲 gzip以外の圧縮は、出力データのうちはじめの\n以降にかけられます。(m=uの時は二つ目の\nの後)  ・非可逆圧縮 非可逆圧縮が指定されている場合は、一番はじめに非可逆圧縮がかかります。 ここでは全角文字を半角文字に変換しています。  ・可逆圧縮 次に、可逆圧縮が指定されている場合 ひらがな圧縮 > 単純な辞書を使った圧縮 > ランレングス圧縮 の順にかかります。解凍するときは逆の順番で行います(実際のiMonaでは高速化のために後ろの2つを同時に解凍しています)。 ・ひらがな圧縮   ひらがな圧縮はひらがな0x82[0x9F-0xF1]が4つ以上続く場合、0x08 文字数(bin) 後ろの[0x9F-0xF1]の連続に変換します。   例えば、「ひらがな」(0x82 0xD0 0x82 0xE7 0x82 0xAA 0x82 0xC8)は0x08 0x04 0xD0 0xE7 0xAA 0xC8となります。 ・単純な辞書を使った圧縮   単純な辞書を使った圧縮は「名無しさん」を0x00 「い」を0x01 「う」を0x02 「ん」を0x03 「ttp://」を0x04に変換します。 ・ランレングス圧縮   ランレングス圧縮はまず3〜255回の1文字の連続を、0x0B 回数(bin) 圧縮する文字に変換します。   例えば、「aaaaaa」は0x0B 0x06 0x61(a)となります。   次に、4〜255文字の2〜255回数の連続を、0x07 圧縮する文字列の長さ(bin) 回数(bin) 圧縮する文字列に変換します。   例えば、「aabbccaabbccaabbcc」は0x07 0x06 0x03 0x61(a) 0x61(a) 0x62(b) 0x62(b) 0x63(c) 0x63(c)となります。  注意:   240進数化したバイナリにも可逆圧縮がかかることがあります。当然ですが非可逆圧縮はかかりません。   また、240進数化はここで扱う圧縮とは別枠です。圧縮しない設定にした場合でも240進数化は行われます。 ■呼び出し方法のサンプルと解説  以下は全てget形式で書いていますが、post形式でも同様です。  1.http://imona.net/2.cgi?v=D&m=m&b=0&t=1234567890&c=s1t20 冒頭に書いたものですが、これが基本形でバージョンD,スレッドの読み込み,板番号0, スレ番号1234567890,レスを読む範囲は1〜20を表しています。m=mは省略可能ですので http://imona.net/2.cgi?v=D&b=0&t=1234567890&c=s1t20でも同じです。  2.http://imona.net/2.cgi?v=D&b=0&c=s1t20 これは板番号0のスレッド一覧を読みます。  3.http://imona.net/2.cgi?v=D&b=0&t=1234567890&c=s1t20&p=xiu これは1.に圧縮無し,IDの消去,URLの消去のオプションをつけたものです。  4.http://imona.net/2.cgi?v=D&b=0&s=テスト これは板番号0の板で、「テスト」という文字列がスレッドタイトルに含まれているスレッドを出力します。 getの場合は、URLエンコードしてください。  5.http://imona.net/2.cgi?v=D&m=u&u=http://xxx.2ch.net/test/read.cgi/yyy/1234567890/1-5 これはサーバがhttp://xxx.2ch.net/test/read.cgi/yyy/1234567890/1-5を解析して 適切なデータを返します。この場合はyyy板のスレ番号1234567890の1〜5が出力されます。  以下で実際にどのようなデータが落ちてくるか確認してください。 iMonaのスレッド http://imona.net/2.cgi?v=D&b=3009&t=1055411823&c=s1t20 ソフトウェア板 http://imona.net/2.cgi?v=D&b=3009 以上です。