pget 現行仕様

ふたば掲示板のスレッドHTMLを取得・変換してローカルに保存するモジュール。

エントリポイント

src/phplib/crawl/pget.php  →  cust_pget()

cust_pget()USE_NEW_PGET 定数の値によって実装を切り替える。

定数値 使用実装 ファイル
未定義 または false 旧実装 pget_old.phpcust_pget_old()
true 新実装 pget_new.phpcust_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

処理フロー

  1. HTML取得 / 読み込み

    • 通常: safe_file_get_contents($url) でスレッドHTMLを取得
    • $convertOnly=true かつ REBUILDLOG 有効: other/index.htm.gz を展開して再利用
  2. 元HTMLをgz保存

    • gzencode($srcHtml, 1)other/index.htm.gz
  3. 文字コード変換

    • Shift_JIS(getEncoding()) → UTF-8
  4. 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 [ホーム] [掲示板に戻る] 除去
  5. 広告除去RMADLINK 有効時)

    • div.threspan.thre に置換してから <div> / <iframe> を全削除
  6. URLオートリンク変換pgetUrlConverterConstpgetUrlLinker

    • 本文中の http(s)://... を検出
    • 画像URL(jpg/png/gif): ダウンロードして <a> に置換 + [見る] スパン生成
    • 非画像URL: <a> ハイパーリンクに置換
  7. ふたばアップローダーリンク変換pgetOuterBoardsConstpgetUpBoardReader

    • 本文中の 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>] に置換
  8. 画像・サムネイルのダウンロード

    • ステップ4で蓄積したURLリストを safe_file_get_contents でダウンロード
    • img/ または thumb/ に保存。既存ファイルはスキップ
    • サムネ取得時にカタログ画像(/cat/)もあわせて取得試行
  9. Lightbox適用USELIGHTBOX 有効時)

    • </head> の前に CSS/JS タグを挿入
    • lbx/ ディレクトリを {storeDir}/resource/ にコピー
  10. ヘッダ・フッタ挿入

    • header.txt / footer.txt の内容を </head> / </body> の直前に挿入
    • contextmenu.js<script> タグを追加
  11. 添付ファイル一覧の生成

    • other/ ディレクトリをスキャン(システムファイルを除く)
    • ファイルへのリンク一覧 HTML を </form> 直後に挿入
  12. 文字コード変換・保存

    • UTF-8 → Shift_JIS(getEncoding()
    • index.htm として保存
  13. クロール情報の更新

    • crawl.json にリソースURL対応表・スレッドURLを保存
  14. IMGDIR_SYNCIMGDIR_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()

  1. HTML取得 または gz読み込み(旧実装と同様)
  2. Shift_JIS → UTF-8 変換
  3. HtmlParser でDOMツリーを構築
  4. 既存クロール情報(crawl.json)を読み込み
  5. extractAndRewriteImages(): <a href="…/src/…"><img src="…/thumb/…"> をDOMベースで書き換え・ダウンロードリスト生成
  6. 画像・サムネをダウンロード、カタログ画像を取得試行
  7. LinkConverter でテキストノードを走査・変換
  8. 広告リンク・ナビリンク・mailto・不要タグをクリーンアップ
  9. クライアントスクリプトを </head> 前に注入
  10. Lightbox リソースコピー(USELIGHTBOX 有効時)
  11. 添付ファイル一覧を body に追加
  12. UTF-8 → Shift_JIS 変換 → index.htm として保存
  13. crawl.json 更新
  14. 画像キャッシュ同期(削除された画像をローカルから除去)
  15. ['html' => ..., 'info' => ...] を返す

旧実装との主な違い

観点 旧実装 新実装
HTMLパース 正規表現 + 手製パーサ DOMDocument / DOMXPath
リンク変換戦略 グローバル関数の配列 LinkConverterInterface (Strategy パターン)
依存性 グローバル変数 ($pget_resouce) コンストラクタDI
戻り値 HTML文字列 または false ['html'=>..., 'info'=>...] または false
テスト容易性 低い 高い