ラベル Blogger の投稿を表示しています。 すべての投稿を表示
ラベル Blogger の投稿を表示しています。 すべての投稿を表示

☆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 に相談してみる手もありますが....自信がないので....
そもそも下記の内容もサンプルを少し変えただけであまりわかってませんし....
ログアウトとか探してみたのですが、見つかりません。終了時にやってくれていると良いのですが....

☆Ubuntuで使えるブログエディタ BloGTK

ちょっと前にUbuntuで使えるブログエディタ(KDEベース除く)を探していた際に行き着いたblogtkを紹介します。
環境はUbuntu 910 Karmic Koala、対象ブログサイトはBloggerです。
これがあればWeb Browserがいらないという訳にはいきませんが、ユーザが増えて開発が進むことを期待しています。

●特徴

機能は最小限といったところでしょうか。

■できること
  • ブログへの新規投稿(当然ですね)
  • ブログからの投稿の取得と再投稿(当然ですね)
  • ツールバーやメニューによるタグ挿入ベースの入力補助
  • 投稿時刻の変更
■できないこと
  • 画像のアップロード
  • ラベルの設定
  • WYSWYG編集
  • 表の編集
■バグ?
  • LANG=ja_JP.UTF-8で投稿のエディタが立ち上がらない
  • ステータスバーに表示されるメッセージ
    An Error occurred: enchant error for language: ja_JP.UTF-8
    
    端末から起動した場合に出てくるメッセージ
    Exception in thread Thread-1:
    Traceback (most recent call last):
      File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
        self.run()
      File "/usr/lib/python2.6/threading.py", line 477, in run
        self.__target(*self.__args, **self.__kwargs)
      File "/usr/bin/../share/blogtk2/lib/blogtk2/main.py", line 560, in sendPostToEditor
        newEditor.destroy(None)
    UnboundLocalError: local variable 'newEditor' referenced before assignment
    
    Traceback (most recent call last):
      File "/usr/bin/../share/blogtk2/lib/blogtk2/main.py", line 357, in update_progress_bar
        gobject.source_remove(self.timeout_handler_id)
    AttributeError: BloGTK instance has no attribute 'timeout_handler_id'
    
  • 多分上記の影響と思われますが、投稿を取得して再投稿すると投稿時刻が9時間進む
(ロケールとタイムゾーンは別もので、9時間進むのとロケールは関係ないです。)
(これで初めて知ったのですが、投稿を公開しても投稿日時が未来の日時になっていると"予定"扱いになるんですね。)

●導入

Karmicのリポジトリにあるバージョン(1.1-2ubuntu3)はBloggerに接続できませんでした。
仕方がないのでPPAから取得します。

sudo add-apt-repository ppa:jayreding/ppa  
sudo apt-get update
sudo apt-get install blogtk

●起動

コマンドは "blogtk2" です。ja_JP.UTF-8 のままだとメインと設定画面は立ち上がるのですが、編集画面が立ち上がりません
そこで /usr/share/applications/blogtk.desktop を開いて Exec= の行を編集します。

編集前
Exec=blogtk2
編集後
Exec=env LANG=C blogtk2

メニュー/ネットワーク/BloGTK 2.0 をクリックして起動します。

●設定

初回起動時はメイン画面と同時に設定画面が立ち上がります。
[Acount Name]と[Blog Address]を入力して[Autodetect Settings]ボタンを押すと
[Username]、[Password]以外は自動設定してくれるようです。
[Preferences]タブはフォントの設定しかありません。

起動直後 [Autodetect Settings]ボタン押下後 [Preferences]タブ

●投稿

設定が正しいか確認するため、とりあえず[Refresh]ボタンを押して既存の投稿が取得できるか調べます。
(スクリーンショットはLANG=ja_JP.UTF-8の状態で撮ったので[更新]になっています。)
取得できれば設定は問題ないと思います。
右下の"Welcome to BloGTK 2" と表示されている部分は投稿を選択するとプレビューが出ます。

あとは投稿を選択して[Edit Post]ボタンを押すか、[New Post]ボタンを押して"BloGTK Editor"を立ち上げます。
投稿時刻の設定ダイアログは[Edit]メニューの[Date and Time..]で起動できます。
ツールバー下段右端はリンク挿入用のボタンです。
Webへ反映する際は[Publish]を押下すればOKです。このとき右下の[Save As Draft?]にチェックを入れておけば下書きとして保存されます。

設定終了後 [Refresh]ボタン押下後
BloGTK Editorの[Main]タブ 投稿時刻設定用のダイアログ リンク挿入用のダイアログ
BloGTK Editorの[Extended]タブ
何も表示されません?
BloGTK Editorの[Preview]タブ
レイアウトはイマイチです

☆BloggerとPicasa ウェブ アルバム

Bloggerを使い始めたころに、Bloggerでアップした画像ファイルは容量制限が1Gで
Picasa ウェブ アルバムと共用という記述を読んだ記憶があります。

どうゆう仕組みなんだろうと、Picasa ウェブ アルバムにいってみました。
BloggerのWebインターフェースで画像をアップロードすると、
Picasa ウェブ アルバムに保存されるんですね。

向かって右端のブログのタイトルと同じ「ミドルスペックを低負荷で」アルバムの中に投稿画像が入ってました。
左端の「Blogger の画像」はレイアウトを弄っていたプロフィールの写真を設定したときに出来たようです。
真ん中の「Windows Live Writer」はBloggerにWindows Live Writerで投稿すると作成されるようです。
(Windows Live Writerのことはその内書いてみようと思ってます。)