「Titanium-Web-Proxy 3 (2023/12/06)」
さて、プロキシーソフト。
Titanium.Web.Proxy (以下 TWP)の
の具体的なコードを解説します。
TWPの具体的な「Web改変」は
この二行です。
ここで 「プロキシーサーバーは、レスポンスの前にフックを入れる」 と宣言している。
B.
そしてこっちがフックの関数。
このSessionEventArgs eが、
Httpのヘッダー&ボディーを持っているので。
eのボディーを取得して、改変して、入れ替える。
以下、フィルター記述の一例:
まずはテキスト/バイナリの判定関数から。
/*
TWPは汎用プロキシーなので。
ブラウザに届けられるあらゆるデータ、
画像/音楽/ムービーなどのバイナリデータも入ってくる。
バイナリはスルーする為、まずはテキスト系かどうかを判定する。
*/
bool isText(string content_type)
{
if (content_type.Contains("javascript")) return true;
if (content_type.Contains("text")) return true;
if (content_type.Contains("/json")) return true;
return false;
}
TWPは汎用プロキシーなので。
ブラウザに届けられるあらゆるデータ、
画像/音楽/ムービーなどのバイナリデータも入ってくる。
バイナリはスルーする為、まずはテキスト系かどうかを判定する。
*/
bool isText(string content_type)
{
if (content_type.Contains("javascript")) return true;
if (content_type.Contains("text")) return true;
if (content_type.Contains("/json")) return true;
return false;
}
次に、特定のリンクを消す関数
/*
A<a href="example.ng.com">text<a>B
→ "AB"
のように、特定のドメインに張ったaリンクを消す。
*/
string A_Killer(string body)
{
//反応させたいNGワード。
string ng = "ng";
//ヒットしたら置き換えるワード
string replace = "hit";
//正規表現。「 ~ の間に【ng】を含むワードを検索」
string expression = string.Format("<a.*{0}.*/a>", ng);
//正規表現にヒットしたら置き換える
return System.Text.RegularExpressions.Regex.Replace(body, expression, replace);
}
A<a href="example.ng.com">text<a>B
→ "AB"
のように、特定のドメインに張ったaリンクを消す。
*/
string A_Killer(string body)
{
//反応させたいNGワード。
string ng = "ng";
//ヒットしたら置き換えるワード
string replace = "hit";
//正規表現。「 ~ の間に【ng】を含むワードを検索」
string expression = string.Format("<a.*{0}.*/a>", ng);
//正規表現にヒットしたら置き換える
return System.Text.RegularExpressions.Regex.Replace(body, expression, replace);
}
※あくまで、デモンストレーション用の一例。
実際にこれで運用したら結構
問題も出るので、各自で工夫してください。
それらを組み合わせて、具体的な
onResponseを記述する。
private async Task onResponse(SessionListItem item, SessionEventArgs e)
{
var r = e.HttpClient.Response;
//ステータスコード。200(成功)以外だったらそのまま
{
int success = 200;
if (r.StatusCode != success) return false;
}
//テキスト以外は弾く。そしてbodyの取得
string body;
var content_type = r.ContentType;
{
if (content_type == null) return false;
content_type = content_type.Trim().ToLower();
if (!isText(content_type)) return false;
if (!r.HasBody) return false;
body = await e.GetResponseBodyAsString();
if (body == null) return false;
}
//リンクキラー
body = A_killer(body);
e.SetResponseBodyString(body);
}
{
var r = e.HttpClient.Response;
//ステータスコード。200(成功)以外だったらそのまま
{
int success = 200;
if (r.StatusCode != success) return false;
}
//テキスト以外は弾く。そしてbodyの取得
string body;
var content_type = r.ContentType;
{
if (content_type == null) return false;
content_type = content_type.Trim().ToLower();
if (!isText(content_type)) return false;
if (!r.HasBody) return false;
body = await e.GetResponseBodyAsString();
if (body == null) return false;
}
//リンクキラー
body = A_killer(body);
e.SetResponseBodyString(body);
}
なんだかんだ言って、やってる事自体は
string body;
body = 改変(body)
ただテキストを書き換えてるだけなので、
そこまで難しい内容ではありません。
・この内容でTWPをビルド。
・TWP.exeを立ち上げる。
・インターネット設定で 「localhost:TWPのポート」に接続すると、
データがTWP経由でブラウザに届けられるようになり
NGワードを含む<a>リンクが除去されるようになります。
TWPは全てのデータを経由するので、
記述さえすれば
「ありとあらゆるWeb改変フィルター」を実装する事ができます。
次回、より高度なフィルター。
特定のサイト向けの Javascript / Jsonを使った
NGフィルターを紹介。