☆BloGTK補完計画

先日の☆Ubuntu で使えるブログエディタ BloGTKの投稿で「できないこと」に挙げた"画像のアップロード"と"ラベルの設定"を何とかしない限りどうしてもWeb Browserでの作業が発生してしまいます。
BloggerのWeb Browserで行うラベルの設定は比較的操作しやすく、こちらはそれほど面倒ではないのですが、画像のアップロードは改善したいと感じます。

そこで、BloggerのAPIを見て画像アップの方法を探してみました。探しかたが足りないのかもしれませんが見つかりません。
Bloggerでアップした画像はPicasa ウェブ アルバムに保存されていることを思い出して、 Picasa Web Albums Data APIの方を調べてみました。
コマンドラインで画像をアップして、そのURLを取得するのは比較的簡単でしたので、以下に手順を示します。

●必要なもの

  • python-gdataパッケージ(BloGTK2.0を入れていればもう導入済みのはずです)
  • Googleアカウント(とりあえず一つはPicasaのアルバムがある状態を前提とします。)

●前準備

Pythonのスクリプトを2つ準備します。(テスト用の画像も必要です。)
get_albumid.py は画像をアップするアルバムのIDを見るため、
post_new_phots.py は画像の投稿に使用します。
2つとも実行権限をつけてPATHの通ったところにおきます。(たとえば ~/bin )

get_albumid.py
#!/usr/bin/python
import sys
import gdata.photos.service

args = sys.argv
args.pop(0)
email = args.pop(0)
password = args.pop(0)
username='default'

gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()

albums = gd_client.GetUserFeed(user=username)
for album in albums.entry:
  print 'id:[%s] title:[%s] number of photos: %s' % (album.gphoto_id.text, album.title.text, album.numphotos.text)
post_new_phots.py
#!/usr/bin/python
import sys
import gdata.photos.service
import gdata.media
#
args = sys.argv
args.pop(0)
email = args.pop(0)
password = args.pop(0)
album_id = args.pop(0)
username='default'
#
gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()
#
album_url = '/data/feed/api/user/%s/albumid/%s' % (username, album_id)
# print 'album_url:', album_url
for arg in args:
  #photo = gd_client.InsertPhoto(album_url, 'New Photo', arg, content_type='image/png')
  photo_name = arg.split('/')[-1]
  ext = arg.split('.')[-1]
  content_type = 'image/' + ext
  photo = gd_client.InsertPhotoSimple(album_url, photo_name, photo_name, arg, content_type=content_type)
  print '-' * 80
  print arg, photo.gphoto_id.text, photo.content.src
  for thumb in photo.media.thumbnail:
    print "\t%s %s %s" % (thumb.width, thumb.height, thumb.url)
  for thumb in photo.media.thumbnail:
    print '<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="%s"><img style="cursor:pointer; cursor:hand;width: %spx; height: %spx;" src="%s" border="0" alt="" id="BLOGGER_PHOTO_ID_%s" /></a>' % (photo.content.src, thumb.width, thumb.height, thumb.url, photo.gphoto_id.text)

●アルバムIDの取得

get_albumid.pyにGmailのメールアドレスとパスワードを指定して起動します。
下記のような要領です。
出力から画像をアップロード先のアルバムを選びます。

$ get_albumid.py hoge@gmail.com hogepassword
id:[9999999999999999991] title:[Blogger の画像] number of photos: 4
id:[9999999999999999992] title:[Windows Live Writer] number of photos: 4
id:[9999999999999999993] title:[ミドルスペックを低負荷で] number of photos: 44

●画像のアップロード

画像を実際にアップロードします。
post_new_phots.pyにGmailのメールアドレスとパスワード、アルバムID、ローカルに存在する画像ファイルのパス(複数可)を指定して起動します。
出力はやや冗長です。アップロード1ファイルごとに7行出力されると思います。自動で作成されるサムネイルの個数で変動するかもしれません。
ファイルへリダイレクトしておいて、[サムネイルを表示画像としたアップロード後のURLへのリンク]をCopy/Pasteして使うことを想定しています。
割と段純なので、少し知識があればお好みにカスタマイズするのは簡単だと思います。
1行目:[ローカルファイルのパス] [画像のID] [アップロード後のURL]
2行目~4行目[タブ][サムネイルの幅] [サムネイルの高さ] [サムネイルのURL]
5行目~7行目[サムネイルを表示画像としたアップロード後のURLへのリンク]
試してみたのはjpgとpngだけです。

実行例
$ ./post_new_phots.py hoge@gmail.com hogepassword 9999999999999999993 ../scrot_01.png  ../scrot_02.jpeg
--------------------------------------------------------------------------------
../scrot_01.png 5441426425664051714 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/
 72 60 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/s72/scrot_01.png
 144 119 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/s144/scrot_01.png
 288 238 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/s288/scrot_01.png
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/"><img style="cursor:pointer; cursor:hand;width: 72px; height: 60px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/s72/scrot_01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5441426425664051714" /></a>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/"><img style="cursor:pointer; cursor:hand;width: 144px; height: 119px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/s144/scrot_01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5441426425664051714" /></a>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/"><img style="cursor:pointer; cursor:hand;width: 288px; height: 238px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMqutk7GAju_WbosDBisglRrV2gZmVxyTeTdUoJSFJ856xZpowWQHPXzQ3Ko_blVBTUNesGV-gQfrMZgi56P3FCSNOU-aL6TxhUvpuPG0VrVBgNPfS9IvIjZjh_joue57sPpSvgxlbKooN/s288/scrot_01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5441426425664051714" /></a>
--------------------------------------------------------------------------------
../scrot_02.jpeg 5441426435389373794 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/
 72 60 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/s72/scrot_02.jpeg
 144 119 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/s144/scrot_02.jpeg
 288 238 https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/s288/scrot_02.jpeg
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/"><img style="cursor:pointer; cursor:hand;width: 72px; height: 60px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/s72/scrot_02.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5441426435389373794" /></a>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/"><img style="cursor:pointer; cursor:hand;width: 144px; height: 119px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/s144/scrot_02.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5441426435389373794" /></a>
<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/"><img style="cursor:pointer; cursor:hand;width: 288px; height: 238px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXXsjjP_Jeb0QZqVzPSXA23nreT5yxxu83yE5jqr_Rm0LpBbZzZxy4nOuFC7Lv5eqqQ-hNabQMI7s4XvFhub-WW8OnrDDXCppxksNlfG-zdSfFKh20QD5WT0yKeSVYS2KJUZUuFtwC2NZO/s288/scrot_02.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5441426435389373794" /></a>
実行例の出力を貼り付けてみたもの

●その他

Blogger以外のユーザでも、上記の画像アップロードは有効な手段だとおもいます。(どうしてもGoogleのアカウントを作りたくないという人もいるかもしれませんが。)
GTKの知識やPyGTKの知識があればBloGTK本体に組み込みたいのですが、あいにくありませんし、自分的にはこれで十分かなと思ってます。
英語が達者なら Jay Reding - jay@jayreding.com に相談してみる手もありますが....自信がないので....
そもそも下記の内容もサンプルを少し変えただけであまりわかってませんし....
ログアウトとか探してみたのですが、見つかりません。終了時にやってくれていると良いのですが....

0 件のコメント:

コメントを投稿