#はじめに
API経由でライブドアブログに画像を投稿する際、結構苦戦してしまったので備忘録を残しておきます。
#リソースURI
ライブドアブログでは、以下のリソースURIが用意されています。
(詳しくは http://help.blogpark.jp/archives/52288925.html を参照)
- http://MEMBER_PROVIDER.blogcms.jp/atom/BLOG_PROVIDER/BLOG_NAME/article (記事のコレクションURI)
- http://MEMBER_PROVIDER.blogcms.jp/atom/BLOG_PROVIDER/BLOG_NAME/article/ARTICLE_ID (記事のメンバURI)
- http://MEMBER_PROVIDER.blogcms.jp/atom/BLOG_PROVIDER/BLOG_NAME/category (カテゴリ文書URI)
- http://MEMBER_PROVIDER.blogcms.jp/atom/BLOG_PROVIDER/BLOG_NAME/image (画像のコレクションURI)
- http://MEMBER_PROVIDER.blogcms.jp/atom/BLOG_PROVIDER/BLOG_NAME/image/IMAGE_ID (画像のメンバURI)
画像をポストする際は、画像のコレクションURIをエンドポイントに指定します。
#使用したライブラリ
#WSSE認証のために使用
import datetime
import hashlib
import random
import base64
#HTTPリクエストのために使用
import urllib3
#コード
def create_wsse(USER_ID,API_KEY):
created = datetime.datetime.now().isoformat() + "Z"
b_nonce = hashlib.sha1(str(random.random()).encode()).digest()
b_digest = hashlib.sha1(b_nonce + created.encode() + API_KEY.encode()).digest()
s = 'UsernameToken Username="{0}", PasswordDigest="{1}", Nonce="{2}", Created="{3}"'
return s.format(USER_ID, base64.b64encode(b_digest).decode(), base64.b64encode(b_nonce).decode(), created)
def post_image(img_path,USER_ID,END_POINT,API_KEY):
http = urllib3.PoolManager()
with open(img_path, 'rb') as fp:
binary_data = fp.read()
r = http.request(
'POST',
END_POINT,
body=binary_data,
headers = {
'X-WSSE': create_wsse(USER_ID,API_KEY),
'Content-Type' : u'image/jpeg'
})
return r
WSSE認証の部分は http://thirotan.blog.jp/archives/1068967144.html を参考にさせて頂きました。
このpost_imageに画像のパス、ライブドアブログのユーザーID、エンドポイント、APIキーを入れれば画像をポストできます。
USER_ID = 'YOUR_USER_ID'
API_KEY = 'YOUR_API_KEY'
ENDPOINT_IMAGE = 'http://livedoor.blogcms.jp/atom/blog/{user_id}/image'.format(user_id=USER_ID)
req = post_image('path/to/img',USER_ID,ENDPOINT_IMAGE,API_KEY)
print(req.data.decode("utf-8"))