みの雑多ブログ

勉強したことをアウトプットしたり、しなかったり

PHPではてなブログの記事一覧を取得して表示

はてなブログの記事一覧を取得した!けど「はてなブログAtomPub」だけでは、アイキャッチ画像が取得できなかった!のでメモ

環境

PHP 5.6
PHP 8.0.9 でも取得できることを確認済み

はてなブログAtomPubからURL取得

はてなブログ管理画面の 設定 > 詳細設定 > AtomPub のルートエンドポイントとAPIKeyを利用してBasic認証で取得
レスポンスはXMLで返ってくる

/* ----------------------------------------
 はてなブログAtomPubから最新ブログURLを取得 
 ------------------------------------------ */
$url = HATENA_ENDPOINT;
$userid = HATENA_USERID;
$apiKey = HATENA_API_KEY;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_USERPWD, "$userid:$apiKey");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);

$entryListData = curl_exec($ch);
curl_close($ch);

$resultList = [];

// 取得できなかった場合
if (! $entryListData) {
    return;
}

$result = new SimpleXMLELement($entryListData);

はてなブログoEmbed APIからデータ取得

/* ----------------------------------------
 はてなブログoEmbed APIから表示用データを取得 
 ------------------------------------------ */

for ($i = 0; $i < count($result->entry); $i++) {

    $param = '?url=' . $result->entry[$i]->link[1]['href']->__toString();

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://hatenablog.com/oembed' . $param);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);

    $resultData = curl_exec($ch);
    curl_close($ch);

    // 公開されていない記事や正しく取得できなかった場合は、スキップ
    if ($resultData === FALSE) continue;

    $entryData = json_decode($resultData, TRUE);

    // 適当に突っ込む
    $resultList[] = [
        'title' => $entryData['title'],
        'description' =>$entryData['description'],
        'published' => date('Y/n/j', strtotime($entryData['published'])),
        'url' => $entryData['url'],
        'image_url' => $entryData['image_url'],
    ];
}

出会ったエラー

はてなブログoEmbed APIのレスポンスが301 Moved Permanently

エンドポイントをhttp:// から https://に変更する

変更後のエンドポイント

https://hatenablog.com/oembed

参考記事

developer.hatena.ne.jp developer.hatena.ne.jp

上位互換はありそうだけど、PHPのバージョン上げて確認したい