🖼️

OG画像(リンク共有の時に表示される画像)を取得するスクリプト作ってみた

2025/02/09に公開

OG画像とは?

https://zenn.dev/
↑こうやってリンク先のサイト情報が表示されている時に使われる画像のことをOG画像と言います。ちなみに、リンクを共有する時にこういうイイ感じの見た目で表示する仕組みをOGP(Ooen Graph Protcol)と言います。
https://kaikoku.blam.co.jp/client/digimaguild/knowledge/sns-pr/498

開発の動機

私はデータ管理ツールとしてNotionを採用していて、先日利用頻度の高いリンクをまとめて管理することにしたんです。その際、リンクと一緒に各サイトに合った画像を表示させて視覚的にわかりやすいようにしたいと考え、今回のスクリプト開発に至りました。

目標

  • 特定リンクのOG画像を指定したフォルダにダウンロードするスクリプトの作成。
  • ひとまず、自分がたまに個人利用するだけなのでCUIで問題ない。
  • 画像取得元のURLを入力値として変数化。

実際のコード

download_og_image.py
import requests
from bs4 import BeautifulSoup
import os
import urllib.parse

# 1. サイトのURLを標準入力で取得
target_url = input("サイトのURLを入力してください: ").strip()
if not target_url:
    print("URLが入力されませんでした。")
    exit(1)

# 2. サイトのHTMLを取得
response = requests.get(target_url)
html = response.text

# 3. BeautifulSoupでパースし、metaタグから og:image を探す
soup = BeautifulSoup(html, 'html.parser')
og_image_tag = soup.find('meta', property='og:image')

if og_image_tag and og_image_tag.get('content'):
    # OGP画像のURLが取得できた場合
    og_image_url = og_image_tag['content']
    print("OGP Image URL:", og_image_url)
    
    # 保存先ディレクトリの指定と作成
    save_directory = "Downloads"
    os.makedirs(save_directory, exist_ok=True)

    # URLからファイル名を抽出(パス部分の最後のテキスト)
    parsed_url = urllib.parse.urlparse(og_image_url)
    file_name = os.path.basename(parsed_url.path)
    if not file_name:
        file_name = "downloaded_image.jpg"
    
    file_path = os.path.join(save_directory, file_name)
    
    # 画像データのダウンロード
    try:
        response = requests.get(og_image_url, timeout=10)
        response.raise_for_status()  # HTTPエラーがあれば例外を発生させる
        
        # 画像データをファイルに保存
        with open(file_path, 'wb') as f:
            f.write(response.content)
        print(f"画像を {file_path} に保存しました。")
        
    except requests.exceptions.HTTPError as http_err:
        print(f"HTTPエラーが発生しました: {http_err}")
    except requests.exceptions.ConnectionError as conn_err:
        print(f"接続エラーが発生しました: {conn_err}")
    except requests.exceptions.Timeout as timeout_err:
        print(f"タイムアウトエラーが発生しました: {timeout_err}")
    except Exception as err:
        print(f"その他のエラーが発生しました: {err}")
        
else:
    print("OGP画像のURLが見つかりませんでした。")

シンプルなPythonコードで実装しました。
コンソールでpy download_og_image.pyを実行すると、OG画像を取得するサイトのURLを標準入力で求められます。URLを入力してENTERを押すと、カレントディレクトリ直下のDownloadsフォルダにOG画像がダウンロードされます(保存先フォルダは適宜調整してください)。

以上がこのスクリプトの処理の流れです。

Notion使ってて私と同じようにページのトップ画像にサイトのOG画像使いたいと思った方や、他にもOG画像を時々ダウンロードしたいという人に活用してもらえると幸いです。

Discussion