Няма описание

NanashiNoGombe 72e0a63499 README преди 3 години
.gitignore 3d15608573 gitignore and LICENSE преди 3 години
BBS2chProxyAuth.cpp 7da05f538f 20200621 преди 4 години
BBS2chProxyAuth.h 05f0aa1652 20150312 преди 9 години
BBS2chProxyConnection.cpp 4f4bf53e80 20210519 преди 3 години
BBS2chProxyConnection.h 33e4abd620 20171002 преди 7 години
BBS2chProxyThreadInfo.h 68094204d0 20170422 преди 7 години
DataStorage.cpp 9a65b31f2e 20150223 преди 9 години
DataStorage.h 9a65b31f2e 20150223 преди 9 години
LICENSE 3d15608573 gitignore and LICENSE преди 3 години
Makefile 10a1b0140a 20180624 преди 6 години
Makefile.mingw 05f0aa1652 20150312 преди 9 години
README.md 72e0a63499 README преди 3 години
dependencies eef53d857e 20150317 преди 9 години
main.cpp 4f4bf53e80 20210519 преди 3 години
utils.h 9eb6aa6e63 20210416 преди 3 години

README.md

これは何?

read.cgi経由でdatファイルを生成、もしくはAPIでdatを取得し、クライアントに返すプロクシです。
接続先が*.2ch.netの場合、内部でURLを*.5ch.netに変換した上で接続を行います。

使い方

起動し、各ブラウザのプロクシ設定を変更してください。デフォルトではポート9080で接続を受け付けます。以下のオプションが指定可能です。

  • -p port

    ポート番号を指定します。デフォルトは9080です。

  • -t timeout

    タイムアウト(秒) を指定します。デフォルトは30秒です。

  • -a user-agent

    read.cgiもしくはAPIにアクセスするときのUser-Agentヘッダを上書きします。デフォルトはクライアントの指定した値です。

  • -g

    全ての接続を受け付けます。これを指定しない場合は、同じマシンからlocalhost(127.0.0.1)への接続のみを受け付けます。

  • -c

    HTTP CONNECTリクエストを受け付けます。httpsなプロクシとして動作するようになりますが、リクエストの改変は行えないので単純なプロクシとしてのみ機能します。

  • -4

    強制的にIPv4で接続します。

  • --proxy server:port

    プログラムが使うプロクシサーバを指定します。
    socks4://192.168.1.1:1080のように頭にsocks4://socks5://を付けると、socksプロクシを指定できます。

  • -b backlog

    listen関数で接続を待ち受けるソケットのbacklogの値を指定します。デフォルトは32です。

  • -s

    *.2ch.net, *.5ch.net, *.bbspink.comドメインへの接続をhttpsで行います。

  • --api AppKey:HmacKey

    このオプションを指定すると、read.cgi経由ではなくAPIで直接datを取得します。いわゆるApp keyとHMAC keyの2つをコロンで連結して与えてください。

  • --api-auth-ua user-agent

  • --api-dat-ua user-agent

    APIのSID取得時、dat取得時のUser-Agentヘッダの値を指定します。

  • --api-auth-xua X-2ch-UA

  • --api-dat-xua X-2ch-UA

    APIのSID取得時、dat取得時のX-2ch-UAヘッダの値を指定します。

  • --api-server server

    APIのゲートウェイサーバを指定します。デフォルト値はapi.5ch.netです。

  • --chunked

    素通しする接続に対して、Transfer-Encoding: chunkedなレスポンスをchunkedなまま送り返します。
    SofTalk WEBというソフトがこのオプションを指定しないと動かないようです。

  • --verbose

    多少詳しくログを表示します。

  • --bbsmenu URL

    URLで指定したアドレスを板リストとみなし、HTMLのリンク中に出現する"5ch.net"の文字列を"2ch.net"に、"https://"を"http://"にそれぞれ置換します。

  • --bbscgi-header "header: value"

    5ch.netのbbs.cgiに接続要求する際、指定したheaderのリクエストヘッダの値をvalueに上書き (存在しない場合は追加) します。オプションを複数指定することで複数のヘッダを書き換えることができます。
    valueの部分に%HOST%もしくは%BOARD%もしくは %THREAD%という文字列が含まれている場合、%HOST%はリクエスト先URLのホスト名に、%BOARD%はリクエストボディから取得した掲示板の名前に、%THREAD%はリクエストボディから取得したスレッドのkeyにそれぞれ置き換えられます。

  • --gikofix

    ギコナビで5ch.netに書き込めない問題を解消します。bbs.cgiにPOSTする際のbody末尾の余計な改行を取り除きます。

MacのBathyScapheやThousandのように、システムのプロクシ設定を利用し独自のプロクシ設定が不可能な場合は、付属のproxy.pacのようなプロクシ設定ファイルを使うと良いかと思います。 最近のOSX(10.10だけ?)では、同じドメインのサーバに対して既にキープアライブ状態の接続があるとプロクシ経由での接続を行ってくれないらしく、そのような場合はproxy_yosemite.pacのようにプロクシ経由にするアドレスを増やしてみるといいかもしれません (究極的には全ての2ch.net/bbspink.com向けの接続をプロクシ経由にすれば解決するはず)。

なおOSX 10.11.5以降では、安全性のためにpacファイルに完全な(ドメイン名以降のファイルパスを含む)URLが渡されない仕様になったらしく、urlのマッチングを使用したpacファイルは機能しません。proxy_10.11.5.pacのように2ch.net/bbspink全体を対象にするか、各ブラウザが独自にプロクシ設定に対応することを期待する以外ないようです。

注意

read.cgi経由モードでは、既に直接datを取得したことのあるスレッドに対してこのプロクシ経由で差分取得を行う場合、(主に半角スペースの個数を厳密に再現できないために)不整合が起こる可能性があります。この場合、一度ログを削除して再取得を試みてください。API経由とread.cgi経由を切り替えて使うような場合も同様の問題が起こります。

-sオプションを指定した場合、使用するlibcurlがTLS/SSL対応でビルドされている必要があります。libcurlがバージョン1.1.0未満のOpenSSLもしくはバージョン2.9未満のLibreSSLを使う場合、スレッドセーフを保証するためにロック処理を行う関数を明示的に設定する必要がありますが、proxy2chはこれを行いません。これが原因でクラッシュが発生する可能性があるので、該当するバージョンのOpenSSL/LibreSSLをどうしても使わなければならない場合はこれを参考にロック処理を実装してください。

コンパイル方法

MacとLinux等Un*xでは、Makefileを使います。
Windows (MinGW/MSYS) の場合、Makefile.mingwを使います。

Macの場合、たぶんそのままコンパイルできるはずです。
その他Un*x系の場合、libcurlとlibcrypto(OpenSSL)もしくはGnuTLSが入っていなければ入れましょう。libcurlがSSL/TLS非対応だとAPIに接続できないので注意してください。
Windowsの場合、MinGW/MSYSだけではライブラリが不足しており、コンパイラが認識するよう各ライブラリ/ヘッダ類を適切にインストールする必要があります。以下にMinGWを用いてWin32向けのバイナリを生成する際に必要なファイルの入手先の例を示します。

  • libcurl
  • pthread (MinGWに含まれていない場合)
  • regex (MinGWに含まれていない場合)