PR

再挑戦!!livedoorブログに画像をAPIでアップロードしようと思ったリベンジ

インフラ技術

前回から、livedoorブログを何とか手間なく使用しようとして悪銭苦戦している記事を書いています。

ついに解決か!!

chatGPTに思い切って聞いてみました。

しかも腹を割って、素直にできないんです、うぇーんという感じで。

ま、事実は、

pythonで記述しているため、pythonでアップロード方法を知りたい。
ただ、その前にサムネイルの画像をアップロード、サムネイルとして登録ということができるかが知りたい。
そのため、サンプルコードを教えてほしい。

という感じなんですが。

前回、pythonの環境をセットアップしたので、pythonを使ってみてという感じのキーワードを追加してみました。

pythonで実際に動かすことになるため、まだセットアップできていない場合は以下記事を参考にしてみてください。

chatGPTの答えに、お試しのコードが返ってきたので、試してみました。

コード内容と説明

返ってきたコードは以下のでした。

<>を自身の情報に変えて実行してみましょう。

コード内容

import requests
from requests.auth import HTTPBasicAuth
import xml.etree.ElementTree as ET

# 設定
BLOG_NAME = "<ブログ名>"
API_ROOT = f"<AtomPub APIのルートエンドポイント>"
API_USER = "<livedoorブログのログインユーザ>"
API_PASS = "<AtomPub APIのAtomPub用パスワード>"

def upload_image(image_path: str):
    url = f"{API_ROOT}/image"
    headers = {
        # Content-Type は画像の種類に応じて変える(例: image/jpeg)
        "Content-Type": "image/jpeg",
    }
    with open(image_path, "rb") as f:
        image_data = f.read()
    resp = requests.post(url, headers=headers, data=image_data, auth=HTTPBasicAuth(API_USER, API_PASS))
    if resp.status_code != 201 and resp.status_code != 200:
        print("Error:", resp.status_code, resp.text)
        return None
    # レスポンス XML をパース
    root = ET.fromstring(resp.content)
    # たとえば <link> 要素、または <uri> 要素を探すなど
    # 返ってくる形式は実際に確認する必要あり
    print(ET.tostring(root, encoding="utf-8").decode("utf-8"))
    return root

# テスト呼び出し
upload_image(r"<アップロード用ファイルのフルパス>")

各変更するポイントは以下から確認できます

<ブログ名>

<AtomPub APIのルートエンドポイント><AtomPub APIのAtomPub用パスワード>

<livedoorブログのログインユーザ>

ログインするときに使用するユーザですね。
複数のブログを利用している場合も、ログインIDは一つだと思います。
ログイン後複数のブログを確認できると思いますので。

<アップロード用ファイルのフルパス>

アップロードしたい画像の配置先ですね。
PC上の設定をフォルダのパスと画像で記載すればよいでしょう。

パスの部分を選択すれば、パスが表示されるので、「パス」と「\」と「ファイル名」をくっつけてあげましょう。

こんな感じになるので、
 C:\image\test.jpg
こんな感じになります。

補足

ちなみに、AtomPub APIの情報は以下から確認できます。
ログイン後、「ブログ設定」から「API Key」

さっそく実行

pythonのコードを書き換えたら実行してみましょう。

ブログの画像を見たところ上がってそうでした。

やっとこれで解決しました。

ファイルの名前が「no title」となっているので、そこはこれからいろいろとchatGPTと相談しながら解決していこうと思います。

タイトルとURLをコピーしました