プログラムでおかえしできるかな

定年を過ぎて何かの役に立てないかなと始めた元SEのブログです

はてなブログのアイキャッチ画像のURLの取り方【Python】

このエントリーをはてなブックマークに追加

はてなブログアイキャッチ画像の URL の取り方を紹介します。

ポイントはブログカードです。
ブログカードにはアイキャッチ画像が載っています。
さらに良いことに、はてなでは「はてなブログ oEmbed API」でブログカードの情報を取得できるようにしてくれています。

ブログカード情報を使ってアイキャッチ画像の URL を取得しましょう。

アプリはお使いいただけます 下の記事で提供しているアプリを更新してアイキャッチ画像も取得できるようにしました。
よかったらお使いください。 アプリの取得は下の記事から可能です。
 📄『はてなブログのスターとブックマークの数を取得するアプリ【フリー】🔗
目次

◆ブログカードとは

はてなブログでもブログカードに対応しています。

「ブログカード」とは、ブログに掲載したい記事のタイトルや概要、アイキャッチ画像などを読みやすくまとめて表示する埋め込み形式です。 はてなブログ ヘルプ

▽こういうのですね。

アイキャッチ画像の取得になぜブログカードなのか

以前にこちら『はてなブログ、スター、ブックマーク用APIの使い方【Python】』の記事で紹介したように、はてなブログには、「はてなブログ - AtomPub」というのがあって、それを使えばブログの記事内で使用している画像の URL を取得することはできます。
しかし、それだと最初に出てくる画像を選択するとかアイキャッチと関係ない画像を選んでしまう可能性があります。

一方、ブログカードは、ブログでアイキャッチ画像と指定した画像を使うので確実にアイキャッチ画像の URL を取得できます。

はてなブログ oEmbed API - ブログカード

はてなブログのブログカードの情報を取得するには、「はてなブログ oEmbed API」を使用します。

はじめ、ブログカードにはアイキャッチ画像の情報がある前提でいたのですが、この仕様を見た時に、どうも、画像の情報らしきものが見えませんでした。

iframe タグの部分に画像の情報があるはずなのに見つかりません。

ダメもとで oEmbed API を使ってブログカードの情報を読んでみたところ、もっとわかりやすいところにありました。

はてなブログ」様様です。👏

◇oEmbedとは

Hatena Developer Center に次のように説明があります。

oEmbedは、Webサイトにさまざまなコンテンツを埋め込むための仕組みで、各Webサービスのプロパイダによって提供されます。現在、はてなでは、はてなブログの各記事をoEmbedを用いて埋め込むことが可能です。oEmbedの詳細についてはoembed.com(英語)をご覧ください。 Hatena Developer Center

oEmbed という国際的な仕様に基づいて提供されています。
oEmbed とは、埋め込み用コードを取得するための仕様です。
リクエストに対するレスポンスの中に iframe タグで記述された埋め込み用コードが含まれています。

※oEmbed についてはこちらのサイトが詳しいです:oEmbed APIの使い方まとめ!URLから埋め込みHTMLタグを作ろう!
Youtube, Instagram, Twitter など他のサービスでの使い方もわかります。

Pythonでブログカード情報を取得

ブログカードの情報は、 oEmbed を採用しているサービスにリクエストを送ることで取得できます。

これをPython で 行うには、Requests パッケージを使用してリクエストを出します。
リクエストは、指定されたエンドポイントに対し get() メソッドで行います。
このエンドポイントにいくつかのパラメータを加えてリクエストします。
結果は、JSON形式もしくはXML形式でデータを取得することができます。

はてなブログ oEmbed API」では認証を要求していないので認証は行っていません。

◇エンドポイントとパラメータ

  • エンドポイント
    • http://hatenablog.com/oembed
  • パラメータ
    • url:参照したい記事のパーマリンク 1 を指定
    • format:応答データの形式を指定( JSON もしくは XML
      デフォルトは JSON

◇リクエス

Python でのリクエストのサンプルコードです。
エンドポイント?url=記事のパーマリンク という文字列を作成して get します。

   import requests

    url = "https://juu7g.hatenablog.com/entry/life/yomiuri"
    endpoint = "http://hatenablog.com/oembed"
    arg = endpoint + f"?url={url}"
    r = requests.get(arg)

◇応答(レスポンス)

はてなのサンプル

{
    "author_name": "hatenablog",
    "width": "100%",
    "author_url": "http://blog.hatena.ne.jp/hatenablog/",
    "provider_url": "http://hatenablog.com",
    "version": "1.0",
    "provider_name": "Hatena Blog",
    "height": "190",
    "html": "<iframe src=\"http://staff.hatenablog.com/embed/2014/08/29/141633\" title=\"はてなブログの記事を紹介しやすくしました。URLを貼るだけで、コンパクトに整ったブログカードを貼り付けることができます - はてなブログ開発ブログ\" scrolling=\"no\" frameborder=\"0\" style=\"width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;\"><a href=\"http://staff.hatenablog.com/entry/2014/08/29/141633\">はてなブログの記事を紹介しやすくしました。URLを貼るだけで、コンパクトに整ったブログカードを貼り付けることができます - はてなブログ開発ブログ</a></iframe>",
    "url": "http://staff.hatenablog.com/entry/2014/08/29/141633",
    "title": "はてなブログの記事を紹介しやすくしました。URLを貼るだけで、コンパクトに整ったブログカードを貼り付けることができます",
    "type": "rich"
}

Hatena Developer Center

はてながサイトに示しているサンプルだとアイキャッチ画像の情報が含まれていませんが、実際にブログカードの情報を取得するとアイキャッチ画像の情報が含まれています。

▽実際に取得したサンプル

※取得したデータを基に掲載していますが、そのままだと不安なデータは「??????????」に変更してあります。また、長いところは言い換えてあります。ご了承ください。

{
    "blog_url": "https://juu7g.hatenablog.com/",
    "image_url": "https://cdn-ak.f.st-hatena.com/images/fotolife/??????????/20220704200844.png",
    "blog_title": "プログラムでおかえしできるかな",
    "provider_url": "https://hatenablog.com",
    "published": "2022-07-04 20:50:30",
    "height": "190",
    "author_name": "juu7g",
    "author_url": "https://blog.hatena.ne.jp/juu7g/",
    "url": "https://juu7g.hatenablog.com/entry/life/yomiuri",
    "html": "<iframe src=\"https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjuu7g.hatenablog.com%2Fentry%2Flife%2Fyomiuri\" title=\"何のためのオンライン? - 読売新聞オンライン読者会員 - プログラムでおかえしできるかな\" class=\"embed-card embed-blogcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;\"></iframe>",
    "type": "rich",
    "width": "100%",
    "description": "記事の要約",
    "title": "何のためのオンライン? - 読売新聞オンライン読者会員",
    "categories": [
        "暮らし",
        "シニア"
    ],
    "provider_name": "Hatena Blog",
    "version": "1.0"
}

見て気付いたと思いますが、image_url キーが存在しています。目からうろこです。👏

これを取得すれば、iframe タグの解析など必要ありません。
というか、解析してもアイキャッチ画像の情報は含まれていないようです。

◇コード

考え方はシンプルです。

エンドポイントに URL パラメータを指定して、get() して、応答を受け取って、JSON を解析して image_url の値を取得します。

    def get_hatena_eye_catch(self, url:str) -> str:
        """
        はてなブログカードからアイキャッチ画像のURLを取得
        Args:
            str:    記事のURL
        Returns:
            str:    記事のアイキャッチ画像のURL
        """
        eye = ""
        endpoint = f"https://hatenablog.com/oembed?url={url}"
        r = requests.get(endpoint)
        if r.status_code == 200:
            j = r.json()
            eye = j.get("image_url", "")     # 記事のアイキャッチ画像のURL
        return eye

◇必要なパッケージ

  • requests
    【インストール】pip install requests
    【インポート】 import requests

◇全体のソース

全体のソースはこちらから取得できます。
取得先:GitHub juu7g/Python-get-hatena-info

※全体というのは、「はてなブログのスターとブックマークの数を取得するアプリ」全体です。

◆さいごに

インターネットで検索して、はてなブログアイキャッチ画像の URL を取得するのは難しいように思っていました。

よく調べれば前例があるのかもしれませんが、ブログカードの情報から取得できるかもしれないという思いつきは、良かったと自負しています。

それでも Hatena Developer Center サイトの仕様を見て断念してもおかしくなかったと思います。
実は、仕様を見てもあまりピンとこなかったので、やってみたら棚から牡丹餅(たなからぼたもち)だったという偶然でした。

「エイやーは大事です」とCMでも言っています。

はてなの仕様が変わらないことを祈ります。

もちろん機能向上の仕様変更は歓迎です。

あわせて読みたい 📄はてなブログ、スター、ブックマーク用APIの使い方【Python】🔗

◇ご注意

本記事は次のバージョンの下で動作した内容を基に記述しています。

  • Python 3.8.5
  • Requests 2.25.1

ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。

◆参考

投稿:

  1. パーマリンクとはブログの場合、一つの記事を表す URL