【PHP】OGP画像の取得方法3選()の話
OGP画像の取得方法
やり方はいろいろありますが、やはり速いのが一番。
自分がやっている方法と、その他いろいろ紹介したい。
file_get_contentsなどでHTMLを取得するのは共通なので省略。
1、置換で取得
$subject = array('','','');
$pattern = array('#\r\n|\n|\r#','#^.+?og:image["\'].*?content=["\']#','#["\'].+?$#');
$ogpimg = preg_replace($pattern, $subject, $html);
次の流れです。
・改行コードを全て削除
・先頭から「og:image” content=”」までを削除
・「”」から最後までを削除
これでOGPのURLだけが残ります。
「og:image”」の後の空白が複数あったりするサイトもあったので、
それに対応するべくこうなりました。
多分、これが一番成功率が高いのではと思います。
とりあえず、これで困ったことは無い。
2、正規表現マッチで取得
preg_match('#og:image["\'].*?content=["\'](.*?)["\']#', $html, $result);
$ogpimg = $result[1];
次の流れです。
・「og:image” content=”xxxxxxxx”」をマッチ
・「content」の中身を取得
このやり方が最もスマートだと思います。
人に見せるコードならこちらだろう。
3、DOMで取得
「ogp 画像取得 PHP」でググってください()
※こんな重たい処理をやるのは馬鹿馬鹿しいので非推奨。
置換とマッチはどっちが速いか?
置換 | マッチ |
0.000185966 | 0.00007010 |
0.000188112 | 0.00000310 |
0.000188828 | 0.00000310 |
うん、マッチですね…
OGPを全部取得したい場合
<?php
$match = preg_match_all( '#<meta property=["\']og:([^"\']+)["\'] content=["\']([^"\']+)["\'].*?>#', $html, $result );
if($match > 0){
$count = count($result[1]);
for( $i = 0; $i < $count; $i++ ) {
$opg[$result[1][$i]] = $result[2][$i];
}
}
$title = $opg['title'];
$url = $opg['url'];
$site_name = $opg['site_name'];
$image = $opg['image'];
$description = $opg['description'];
?>
「og:」の項目を全て取得します。
外部リンク用のカードを作るなら全部取得したい。
まとめ
何にせよ「file_get_contents」や「cURL」でHTMLを取得してから加工。
どうしてもその「丸ごと読み込む」という処理が入るので重くなります。
RSSで取得して、サムネもついでに!となると負荷がとんでもない。
サイトによっては使う画像もメチャクチャなので注意。
また、ogp画像はサイズが大きいことが多いです。
ダウンロードして使う場合はサイズダウンや圧縮が必須。
そこがまた面倒くさいところです。
よくあるエラー
・URLがメッチャ長い
→「VARCHAR(255)」では足りません。
・普通じゃない拡張子
→画像加工する場合は対処必須
・パラーメーターがついている
→末尾の「jpg」で判断しないように
そんなところで、取得してからが勝負なところです。
結局、1個1個取得して加工することになるので「file_get_contents」でゆっくりやっていい。
レンサバ会社から怒られないよう気を付けよう。