読者です 読者をやめる 読者になる 読者になる

忍び歩く男 - SLYWALKER

大阪のこっそりPHPer

「クックパッド」を愛用してる嫁に「ほっとレシピ」勧めたところ画像が欲しいと言われ・・・

phaさん作
ほっとレシピ

嫁に勧めてみたら、画像が欲しいと言われ・・・
ん〜どうしたものかと思ったところ

画像を盗って取ってくるヘルパーつくってみました

注意:

  • そのまま使うと超重いですw
  • これって直リンじゃ・・・(左様です)
  • サーバ環境によっては使えないかも

取ってくるにしても、定時にクロールさせてキャッシュさせとくってのがセオリーでしょうが、あえてお手軽に利用するために、ヘルパーにしてみました。

仕様:

  • 対象画像は、jpg,png
  • 基本的にそのページの一番大きい画像のURLを取得する
  • 横になが〜い画像、縦になが〜い画像は取得しない

こんな感じです。

/view/helpers/steal.php

<?php
class StealHelper extends AppHelper
{

    public $helpers = array('Html');

    function biggest($url)
    {
        $paesre_url = parse_url($url);
        // ページ全体を読み込む
    $str = file_get_contents($url);
        // とりあえず対象拡張子はjpeg,jpg,png
        preg_match_all("/\<img(.*)src=\"?([\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+$\,\%\#]+(jpg|jpeg|png))/i", $str, $match);

        $longest_side  = 0;
        $biggest_image = null;

        foreach ($match[2] as $src) {
            // 全部http://から始まるURLにする
            if (strpos($src, 'http://') === false) {
                if (strpos($src, '/') === 0) {
                    $url = $paesre_url['scheme'] . '://' . $paesre_url['host'] . $src;
                } else {
                    $url = $paesre_url['scheme'] . '://' . $paesre_url['host'] . dirname($paesre_url['path']) . '/' . $src;
                }
            } else {
                $url = $src;
            }
            // 画像のプロパティ取得
            $size = @getimagesize($url);
            if ($size) {
                $side = $size[0] + $size[1];
                $ratio = $size[0] / $size[1];

                // 横になが〜い画像、縦になが〜い画像は対象外
                if ($ratio > 0.3 && $ratio < 3) {
                    if ($longest_side < $side) {
                        $longest_side = $side;
                        $biggest_image = $url;
                    }
                }
            }
        }

        if ($biggest_image) {
            return $this->Html->image($biggest_image);
        }
        return null;
    }
}
?>

viewで以下のように

<?php echo $steal->biggest($page_url); ?>

ローカルで試してはみましたが、それっぽい画像が取れました。
しかし、はっきり言って役に立たないヘルパーです><
ajaxで後から読み込むようにしたらスマートかもしれません。