pget 現行仕様
ふたば掲示板のスレッドHTMLを取得・変換してローカルに保存するモジュール。
エントリポイント
src/phplib/crawl/pget.php → cust_pget()
cust_pget() は USE_NEW_PGET 定数の値によって実装を切り替える。
| 定数値 | 使用実装 | ファイル |
|---|---|---|
未定義 または false |
旧実装 | pget_old.php → cust_pget_old() |
true |
新実装 | pget_new.php → cust_pget_new() → Pget クラス群 |
シグネチャ
cust_pget(
string $url, // 取得対象スレッドのURL
string $storeDir, // 保存先ディレクトリ(末尾スラッシュあり)
callable $getImageListFn = 'pgetDmyGetImageList', // 互換用・現在未使用
callable $getImageFn = 'pgetDmyGetImage', // 互換用・現在未使用
bool $convertOnly = false // true: ローカルgzから再変換のみ
): bool|string
ディレクトリ構成(保存先)
{storeDir}/
├── index.htm # 変換後HTML (_PGET_INDEX_PAGE_)
├── catalog.jpg # カタログサムネ (_PGET_CATALOG_)
├── img/ # 本体画像 (_PGET_IMG_DIR_)
├── thumb/ # サムネイル (_PGET_THUMB_DIR_)
└── other/ # その他リソース (_PGET_OTHER_DIR_)
├── index.htm.gz # 元HTML gz (_PGET_INDEX_PAGE_SRCGZ_)
└── crawl.json # クロール情報 (_PGET_CRAWL_INFO_)
旧実装(cust_pget_old)
処理フロー
HTML取得 / 読み込み
- 通常:
safe_file_get_contents($url)でスレッドHTMLを取得 $convertOnly=trueかつREBUILDLOG有効:other/index.htm.gzを展開して再利用
- 通常:
元HTMLをgz保存
gzencode($srcHtml, 1)→other/index.htm.gz
文字コード変換
- Shift_JIS(
getEncoding()) → UTF-8
- Shift_JIS(
HTML文字列の逐次変換(正規表現ベース)
ステップ 処理関数 対象 内容 baseタグ除去cnvNone<base>除去 リンク書き換え cnvLink<a href="…/src/…">img/ファイル名にローカル書き換え。ダウンロードリストに追加サムネ書き換え cnvThumb<img src="…/thumb/…">thumb/ファイル名にローカル書き換え。ダウンロードリストに追加/bin/参照除去preg_replace/bin/を含むタグ半角スペースに置換 フォーム削除 pgetRmTag<form>最初の1件を削除 スクリプト削除 pgetRmTag<script>全件削除 ナビリンク削除 preg_replace[ホーム][掲示板に戻る]除去 広告除去(
RMADLINK有効時)div.threをspan.threに置換してから<div>/<iframe>を全削除
URLオートリンク変換(
pgetUrlConverterConst→pgetUrlLinker)- 本文中の
http(s)://...を検出 - 画像URL(jpg/png/gif): ダウンロードして
<a>に置換 +[見る]スパン生成 - 非画像URL:
<a>ハイパーリンクに置換
- 本文中の
ふたばアップローダーリンク変換(
pgetOuterBoardsConst→pgetUpBoardReader)- 本文中の
f1234.jpg形式(うp)、fu1234.jpg形式(うp小)を検出 http://dec.2chan.net/up/src/{fname}からダウンロード →other/に保存- 成功:
<a href="other/fname">fname</a>[見る]に置換 - 失敗:
fname [<a href="…/up.htm">link</a>]に置換
- 本文中の
画像・サムネイルのダウンロード
- ステップ4で蓄積したURLリストを
safe_file_get_contentsでダウンロード img/またはthumb/に保存。既存ファイルはスキップ- サムネ取得時にカタログ画像(
/cat/)もあわせて取得試行
- ステップ4で蓄積したURLリストを
Lightbox適用(
USELIGHTBOX有効時)</head>の前に CSS/JS タグを挿入lbx/ディレクトリを{storeDir}/resource/にコピー
ヘッダ・フッタ挿入
header.txt/footer.txtの内容を</head>/</body>の直前に挿入contextmenu.jsの<script>タグを追加
添付ファイル一覧の生成
other/ディレクトリをスキャン(システムファイルを除く)- ファイルへのリンク一覧 HTML を
</form>直後に挿入
文字コード変換・保存
- UTF-8 → Shift_JIS(
getEncoding()) index.htmとして保存
- UTF-8 → Shift_JIS(
クロール情報の更新
crawl.jsonにリソースURL対応表・スレッドURLを保存
IMGDIR_SYNC(
IMGDIR_SYNC有効時)- スレッドに存在しない画像をローカルから削除
新実装(Pget クラス群)
クラス構成
| クラス | ファイル | 役割 |
|---|---|---|
Pget |
pget/Pget.php |
ファサード。処理全体の制御 |
ResourceDownloader |
pget/ResourceDownloader.php |
HTTP取得 |
HtmlParser |
pget/HtmlParser.php |
DOMベースのHTML解析・変換 |
ThreadStorage |
pget/ThreadStorage.php |
ファイル保存・読み込み |
LinkConverterInterface |
pget/LinkConverterInterface.php |
リンク変換戦略のインターフェース |
FutabaUploaderConverter |
pget/FutabaUploaderConverter.php |
ふたばアップローダー変換 |
GenericUrlConverter |
pget/GenericUrlConverter.php |
一般URLオートリンク変換 |
登録済みの LinkConverter
// うp: f1234.jpg 形式
new FutabaUploaderConverter($downloader, $storage, 'http://dec.2chan.net/up/', '/(f[0-9]{4,}(\.[_a-zA-Z0-9]+)?)/');
// うp小: fu1234.jpg 形式
new FutabaUploaderConverter($downloader, $storage, 'http://dec.2chan.net/up2/', '/(fu[0-9]{4,}(\.[_a-zA-Z0-9]+)?)/');
// 一般URL
new GenericUrlConverter($downloader, $storage);
処理フロー(Pget::execute())
- HTML取得 または gz読み込み(旧実装と同様)
- Shift_JIS → UTF-8 変換
HtmlParserでDOMツリーを構築- 既存クロール情報(
crawl.json)を読み込み extractAndRewriteImages():<a href="…/src/…">と<img src="…/thumb/…">をDOMベースで書き換え・ダウンロードリスト生成- 画像・サムネをダウンロード、カタログ画像を取得試行
- 各
LinkConverterでテキストノードを走査・変換 - 広告リンク・ナビリンク・mailto・不要タグをクリーンアップ
- クライアントスクリプトを
</head>前に注入 - Lightbox リソースコピー(
USELIGHTBOX有効時) - 添付ファイル一覧を body に追加
- UTF-8 → Shift_JIS 変換 →
index.htmとして保存 crawl.json更新- 画像キャッシュ同期(削除された画像をローカルから除去)
['html' => ..., 'info' => ...]を返す
旧実装との主な違い
| 観点 | 旧実装 | 新実装 |
|---|---|---|
| HTMLパース | 正規表現 + 手製パーサ | DOMDocument / DOMXPath |
| リンク変換戦略 | グローバル関数の配列 | LinkConverterInterface (Strategy パターン) |
| 依存性 | グローバル変数 ($pget_resouce) |
コンストラクタDI |
| 戻り値 | HTML文字列 または false |
['html'=>..., 'info'=>...] または false |
| テスト容易性 | 低い | 高い |