数年前から”2ちゃんねる まとめサイト”、”コピペブログ”という言葉を聞くようになりました。
しかし、コピペ作業は量が多くなると思ってた以上に手間や時間が掛かります。
今回はLaravelフレームワークのilluminateコンポーネントを使って、
2ch.scのスレの内容を取得してみます。(デモページ有り)
一度にスレッドデータが取得出来るので、
レスごとにコピーアンドペーストする作業が省けるようになります。
2ちゃんねる専用ブラウザを使うより柔軟なところは、レスに自動的にcss classを定義したり、
自分の好きなタグに加工出来るところです。
(実際に記事を書く時はwysiwygエディタをお使いだと思います)
Demoページ
( *2ch.scのスレURLを入力する必要があるのでPCで見てください)
タイトルでは「Laravelで..」となっていますが、Lumenでも問題ありません。
また、illuminateパッケージを導入すれば他のフレームワークや素のPHPでも可能です。
- スレのページを取得
- スレに関係のないhtmlタグの取り除き
- 取得したタグの置換
- htmlタグの除去(htmlタグで取得したくない場合)
- スレ取得(完成)
* 最後に処理を一つにまとめる為、所々private関数を使っています
file_get_contents関数を使って2chのスレッドをまるごと取得します。
2chのはSJISフォーマットなので、UTF-8に変換します。
また、2ch.scのhtmlページは"\n"の改行コードが入っており、
それをキーにしてhtmlタグを配列に変換しています。
// 元となるスレのページを取得
private function getThread($url)
{
// スレを取得
$raw_contents = file_get_contents($url);
// SJISからUTF-8に変換
$content = mb_convert_encoding($raw_contents, "UTF-8", "SJIS");
// 改行文字をベースに配列にする
return explode("\n", $content);
}
1でスレのhtmlを取得しましたが、そのままだとmetaタグやscriptタグなど
関係のないタグも沢山含まれているので、不要なタグを取り除きます。
ここでは、1の関数を読み込み、illuminateのfilter関数を使って処理をしています。
// スレに関係のない不要なhtmlタグを取り除く
private function threadHandler($url)
{
// 先ほどのスレを取得した関数を呼び出す
return collect($this->getThread($url))
->filter(function ($item) {
// <dd>タグが含まれていない配列を除去
return str_contains($item, '<dd>');
}
)->toArray();
}
次のページに続く