123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- --[[
- willSendRequestToBbsCgi 関数
- 5ch/bbspinkのbbs.cgiにPOSTリクエストが送られる直前にproxy2chから呼び出される
- 関数です。引数requestと同じ構造のtable型の変数を返すことで、proxy2chがbbs.cgi
- に対して送るリクエストヘッダ/ボディを自由に改変 (ヘッダの追加/削除含む) する
- ことができます。--bbscgi-headerオプションとは異なり、板ごとに動作を変更する
- ことも可能です。スクリプトは毎回読み込まれるため、proxy2chを起動し直さなくて
- も変更は反映されます。
- * 引数 request
- 次のような構造を持つtable型の変数です。送信される予定のリクエストヘッダ/
- ボディが格納されています。
- {
- "body" = "リクエストボディ",
- "headers" = {
- "リクエストヘッダ1" = "値1",
- "リクエストヘッダ2" = "値2",
- :
- }
- }
- この引数をそのまま返せば「何もしない」関数になります。
- 特定のヘッダを送信したくない場合は値をnilに設定して削除するか、あるいは空の
- 文字列""を代入します。ただし注意としてlibcurlはAcceptヘッダが存在しない場合
- はデフォルトの値 ("*/*") を送信するという挙動をするため、nilよりは空文字列
- を明示的に代入したほうが安全でしょう。
- * 引数 host
- リクエスト先のホスト名が格納されているstring型の変数です。
- * 引数 board
- リクエストボディのbbsフィールドの値に相当するstring型の変数です。
- * 引数 thread
- リクエストボディのkeyフィールドの値に相当するstring型の変数です。
- * 戻り値
- 引数requestと同じ構造を持つtable型の変数を返してください。requestそのもの
- を改変してもいいですし、新しいtableを1から作ってもいいです。
- リクエストボディを改変する場合、application/x-www-form-urlencodedの形式を
- 満たしている必要があります。
- このスクリプトの中からはproxy2chというグローバル変数を参照可能であり、いくつかの
- ユーティリティ関数や変数が proxy2ch.(関数名/変数名) の形でアクセスできます。
- proxy2ch.hmacSHA256(key, message) 関数
- HMAC-SHA256に基づいてメッセージダイジェストを算出します。
- * 引数 key
- HMAC算出用の鍵をstring型で渡します。
- * 引数 message
- ダイジェストを算出したいメッセージをstring型で渡します。
- * 戻り値
- 算出したメッセージダイジェストの値をstring型で返します。
- hex表記したもの、つまり0-9,a-fで構成される長さ64の文字列になります。
- proxy2ch.decodeURIComponent(input [, decodePlus]) 関数
- URLエンコードされた文字列をデコードします。
- * 引数 input
- デコードしたい文字列をstring型で渡します。
- * 引数 decodePlus (省略可能)
- input中に現れる"+"を" "に置き換えるかどうかをboolean型で渡します。
- application/x-www-form-urlencoded形式を想定しているため、この引数を省略した
- 場合はtrueが渡されたものとして動作します。
- * 戻り値
- デコード済み文字列をstring型で返します。
- proxy2ch.encodeURIComponent(input [, spaceAsPlus]) 関数
- 文字列をURLエンコードします。
- * 引数 input
- エンコードしたい文字列をstring型で渡します。
- * 引数 spaceAsPlus (省略可能)
- input中に現れる" "を"%20"ではなく"+"に置き換えるかどうかをboolean型で渡しま
- す。application/x-www-form-urlencoded形式を想定しているため、この引数を省略
- した場合はtrueが渡されたものとして動作します。
- * 戻り値
- エンコード済み文字列をstring型で返します。
- proxy2ch.convertShiftJISToUTF8(input) 関数
- Shift JISでエンコードされた文字列をUTF-8に変換します。
- * 引数 input
- UTF-8に変換したい文字列をstring型で渡します。
- * 戻り値
- UTF-8に変換された文字列をstring型で返します。
- 変換に失敗した場合はnilを返します。
- proxy2ch.monaKey string型変数
- 書き込み時に払い出されたMonaKey(仮称)の値を格納している変数です。
- 払い出し前の初期値は便宜上 "00000000-0000-0000-0000-000000000000" です。
- ]]
- function createTableFromBody(str)
- local t = {}
- for s in string.gmatch(str, "([^&]+)") do
- local idx = string.find(s, "=")
- local name = string.sub(s, 1, idx-1)
- local value = string.sub(s, idx+1)
- t[name] = value
- end
- return t
- end
- function createBodyFromTableWithOrder(tBody, order)
- order = order or {}
- local ret = ""
- for i, name in ipairs(order) do
- if tBody[name] ~= nil then
- if ret ~= "" then
- ret = ret .. "&"
- end
- ret = ret .. name .. "=" .. tBody[name]
- tBody[name] = nil
- end
- end
- for name, value in pairs(tBody) do
- if ret ~= "" then
- ret = ret .. "&"
- end
- ret = ret .. name .. "=" .. value
- end
- return ret
- end
- function willSendRequestToBbsCgi(request, host, board, thread)
- --リクエストヘッダのUser-Agentの値を変更する
- request.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"
- --リクエストヘッダのRefererの値を変更する
- request.headers["Referer"] = "https://" .. host .. "/test/read.cgi/" .. board .. "/" .. thread .. "/l50"
- --リクエストボディの末尾に"&oekaki_thread1="を追加する
- request.body = request.body .. "&oekaki_thread1="
- --リクエストボディをtableに変換する
- --"name1=value1&name=value2"形式のstringが{"name1" = "value1", "name2" = "value2"}形式のtableに変換される
- local tBody = createTableFromBody(request.body)
- --リクエストボディの各フィールドのURLエンコードを解除し、UTF-8に変換し、再度URLエンコードする
- for name, value in pairs(tBody) do
- tBody[name] = proxy2ch.encodeURIComponent(proxy2ch.convertShiftJISToUTF8(proxy2ch.decodeURIComponent(value)))
- end
- --tableからフィールドの順序を指定して新しいリクエストボディを生成する
- request.body = createBodyFromTableWithOrder(tBody, {"FROM", "mail", "MESSAGE", "bbs", "key", "time", "submit"})
- --Content-TypeヘッダのcharsetにUTF-8を指定しておく
- request.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8"
- return request
- end
|