scrapshot.php の仕様
役割
scrapshot.php は、指定されたURLのスレッドを取得・更新するための中心的なスクリプトです。主な役割は以下の通りです。
- ユーザーによる手動でのスレッド取得・更新: ユーザーがブラウザ経由で直接スレッドのURLを指定して実行します。
- 親FTBucketからの更新要求の受付: 親子関係にある別のFTBucketインスタンスから、特定のスレッドを更新するよう要求を受け付けます。
1. ユーザーによる手動更新時の挙動
これは scrapshot.php の最も基本的な使われ方です。
- URLの指定: ユーザーはブラウザのブックマークレットやフォームから、ふたばのスレッドURL(例:
http://.../res/12345.htm)を指定してscrapshot.phpにアクセスします。 - 各種チェック:
- ブラックリスト: アクセス元のIPがブラックリストに登録されていないか確認します。
- URL形式: 指定されたURLが
config.phpのURLREGXで許可された形式か検証します。 - 手動更新設定:
config.phpのMANUALUPDATEがfalseの場合、新規取得は許可されますが、既存スレッドの更新は行われません(cronでの自動更新を想定)。 - クールタイム:
COOLTIMEで設定された秒数が経過していない場合、連続更新とみなされ処理を中断します。
- スレッドの取得・更新:
phplib/crawl.phpのexecDownload()関数を呼び出し、スレッドのHTMLと関連ファイル(画像など)をダウンロードします。- ダウンロードに失敗した場合、
config.phpのSUBSCRIBESに設定された他のFTBucketインスタンスからの取得を試みます。
- メタ情報の更新:
updateInfo()関数が呼び出され、以下の情報が更新されます。user_update: ユーザーが手動更新した時刻を記録します。alluserid:STOCKLIST機能が有効な場合、スレッドを「ストック」したユーザーのIDを記録します。
saveInfo()でメタ情報が保存されます。
- 後処理:
- 上限超過の削除 (
removeSurplus): 保存スレッド数がLIMITCAPを超えた場合や、ディスク空き容量がDISKFREELIMITを下回った場合、最も古いスレッドから順に削除します。 - 自動タグ付け (
getAutotag): 板名などのタグを自動で付与します。 - インデックス更新: 全文検索、画像検索、ファイルハッシュなどのデータベースを更新します。
- 上限超過の削除 (
- 結果表示: 処理結果(成功またはエラー)を示すHTMLページをユーザーに返します。
2. 親FTBucketからの更新要求時の挙動
親子関係にあるFTBucketでは、親が子に対してスレッドの更新を要求することがあります。この際の挙動は少し特殊です。
特殊なURL形式でのアクセス: 親FTBucketは、子FTBucketに対して以下のような形式のURLでアクセスします。
http://[子のURL]/scrapshot.php?rooturl=http://[子のURL]/cont/may.2chan.net_b_res_12345.htmrooturlパラメータに、ふたばのURLではなく、子FTBucket内のコンテンツへのパスが含まれているのが特徴です。URLの正規化:
scrapshot.phpは、このような特殊なURLを検知すると、それを元のふたばのURL(http://may.2chan.net/b/res/12345.htm)に変換します。これにより、内部的には通常の手動更新と同じように扱えるようになります。// /home/ui/oldhome/ui/git/ftbucket/src/scrapshot.php foreach( $subscribes as $surety ){ if(strpos( $GETURL, $surety ) === 0){ $dst = preg_replace("/\/[^\/]*$/i","",$GETURL); //dirname $dst = preg_replace("/^.*\//i","",$dst); //basename $dst = "http://" . str_replace("_","/",$dst) . ".htm"; //tourl $GETURL = $dst; break; } }スレッドの取得・更新: 正規化されたURLを使って、親FTBucketから差分を取得します。この処理は
phplib/crawl.phpのgetFromRemoteSub()関数内で実行され、最終的にphplib/crawl/pullthread.phpの_remote_root_pull()や_try_remote_zip_pull()によって、必要なファイルのみが親から子へ転送されます。メタ情報の更新と後処理: この後の流れは、ユーザーによる手動更新とほぼ同じです。メタ情報が更新され、各種インデックスが再構築されます。
まとめ
scrapshot.php は、ユーザーからのリクエストと、他のFTBucketからのリクエストの両方を処理する多機能なエンドポイントです。
- ユーザーからの更新は、主にふたばから直接データを取得するトリガーとなります。
- 親子間の更新は、
rooturlの形式を工夫することで実現されており、親から子への効率的なデータ同期を可能にしています。
どちらのケースでも、処理の最後にはメタ情報の更新、上限管理、インデックスの再構築といった共通の後処理が実行され、システム全体の一貫性を保つ設計になっています。