スキップしてメイン コンテンツに移動

rubyでblogspotに投稿する

概要


 
htmlファイルをblogspotに投稿するrubyスクリプトを紹介する.コマンドラインから投稿できるため,ローカルマシンでの投稿記事の一元管理,投稿の自動化,emacsからの投稿など,様々な応用が効く.


 
blogspotへの投稿には,blogger.comでサポートされているATOM-APIを用いる.


ATOMとは


 
ATOMとは,XMLのフォーマットや,Web上でコンテンツを通信する際に使用するプロトコルなどの総称である.サービスの利用者は,ATOM-APIを使用して,コンテンツ配信などを実現することができる.


前準備


 
以下のサイトから,rubygemsのライブラリgdata-ruby-utilをダウンロードし,インストールする.これは,Google Data APIを使用するために利用する.



http://code.google.com/p/gdata-ruby-util/

コード


 
以下に,rubyのコードを示す.



#!/usr/bin/env ruby

$LOAD_PATH.delete(".")
# $LOAD_PATH.push('/path/to/BloggerAPI/gdata/gdata-1.0.0/lib')

require 'rubygems'
require "rexml/document"
require 'time'
require 'gdata'

class MyBlogger

def initialize(ary)
@ary = ary
@client = GData::Client::Blogger.new
end
def base(account, pass, url)
doc = txt_to_xml
# get token
@client.clientlogin(account, pass)
@client.prepare_headers
@client.post(url, doc)
end

def txt_to_xml
title = @ary[0].chomp
# content = @ary[2..@ary.size].join("").strip.gsub("\n","
# ")

t = @ary[1].chomp
if '' == t
time = Time.now.iso8601
else
t[10] = 'T'
time = t + ':00+09:00'
end

content = @ary[2..@ary.size].join("").strip
return make_doc(title, time, content)
end

def make_doc(title, n, content)

# n = Time.now.iso8601
# n = '2010-06-05T12:00:31+09:00'

doc = REXML::Document.new()
doc << REXML::XMLDecl.new(version="1.0", encoding="utf-8" )
entry = doc.add_element("entry", {"xmlns" => "http://www.w3.org/2005/Atom"})
entry.add_element("published").add_text(n.to_s)
entry.add_element("title", {'type'=>'text'}).add_text(title)

con = entry.add_element("content", {'type'=>'html'})
con.add_text(content)

return doc
end

end

txt_ary = ARGF.readlines

# この url は 自分の Blogger URL トップページソース内
# link rel='self' type='application/atom+xml' で始まる行のリンク先
url = 'http://your_blogger_name.blogspot.com/feeds/posts/default'

# Blogger のアカウントとパスワード
account = 'your_account@gmail.com'
pass = 'your_password'

m = MyBlogger.new(txt_ary)
res = m.base(account, pass, url)

if res.status_code == 201
p 'OK'
end

 
次の部分に,利用するbloggerのアカウント名を入力する.



url = 'http://[your_blogger_name].blogspot.com/feeds/posts/default'

 
次の部分に,利用するアカウント名とパスワードを入力する.



account = '[your_account]@gmail.com'
pass = '[your_password]'

スクリプトの使用法


 
以下では,簡単のため,上記スクリプトをblogger.rbというファイル名で保存したものとして話を進める.


 
htmlファイルを投稿するには,ファイルを第一引数としてスクリプトに与える.次は,test.htmlを投稿する例である.



$ blogger.rb test.html

 
標準入力から受け取ることも可能である.



$ blogger.rb < test.html

 
htmlファイルの書式を以下に示す.



blog-title
yyyy-mm-dd hh:mm
html contents ...
...
...

 
1行目はブログのタイトルを記述する.2行目は投稿日時を記入する.3行目以降には,投稿する文書をhtml形式で記入する.


参考資料


Blogger API から Postしてみる


gdata-ruby-util Project Hosting on Google Code

このブログの人気の投稿

TeXマクロプログラミング

2012.03.30 更新 スライド化しました.   新しいマクロ定義 以下に例を示す. \dev\hoge{ほげ}    これにより,\hogeが「ほげ」に変換される.引数を使うには,以下のように記述する. \dev\hour#1{今は#1時です}   別の方法 上に示した処理は,以下のようにも記述できる. \newcommand{\hoge}{ほげ} \newcommand{\hour}[1]{今は#1時です}   defとnewcommand違い defとnewcommandが異なる箇所として,以下が上げられる. 定義命令を定義している処理系 マクロを多重定義した場合の動作 引数のとり方  まず,定義されている処理系が異なる.defはtexで定義されており,newcommandは,latexで定義されている.  次に,多重定義した際の動作が異なる.defでは,新しい定義で上書きする.一方,newcommandではエラーを出力する.  最後に,defでは,引数のとり方としてパターンマッチングを利用できる.例えば,以下のマクロ定義があるとする. \def\Hatchr(#1,#2)(#3,#4)#5 これにより,以下に示すインターフェイスを実現する. \Hatchr(3,4)(7,8){hoge}   マクロの複製 以下の処理では,\hogeの内容を\fugaに複製する. \let\fuga\hoge   マクロの初期化 以下のコードで,\hogeを初期化する. \let\fuga\relax  ここで,\relaxは初期化のために利用する空の定義である.   マクロに文字を追加し再定義 defによる定義は,マクロの多重展開をおこなわない.例えば,以下のコードを考える. \def\hoge{ほげ} \def\hoge{\hogeふぇふぇ}  この後,\hogeを利用すると「\hogeふぇふぇ」と展開される.つまり,一度だけしかマクロは展開されない.  マクロを展開してから定義する際には,以下の記述を用いる. \edef\hoge{\hogeふぇふぇ}  これに

beamerでしおりを付ける

しおり   しおりとは,acroreadなどでpdfを表示する際に,ウィンドウの左側に表示される目次のようなものである.このしおりを使うことで,文章の構成を大まかに把握したり,特定の項目に移動することが簡単にできる.   beamerには,標準でしおりを付ける機能が備わっている.以降では,しおりを付ける方法について述べる. しおりをつける   beamerでしおりを付けるには,次のコマンドをtexの文章中に記述する. section{} subsection{} subsubsection{}   カッコの中に記述する文字列が,しおりの項目名に使用される.また,section,subsection,subsubsectionを使い分けることで,階層化をすることも可能. 文字化け対策   しおりは,標準の仕様ではUnicodeのみがサポートされている.EUCを使う場合は,そのままではしおりの日本語が文字化けする.このため,Unicodeを用いない際には,何らかの対策が必要である.   以下では,EUCを利用する人のための対処策を述べる.ここで,dviからpdfを生成する際の方法によって,対処の仕方が異なることに注意する.具体的には,(1)dvipdfmxを用いる場合と,(2)dvipsおよびps2pdfを用いる場合で,対処の仕方が異なる.以降,それぞれについて述べる. dvipdfmxを用いる場合   次のコードをプリアンブルに記述しておくことで解決できる.これにより,しおりの部分の文字列が,自動でUnicodeに変換される. \ifnum 42146=\euc"A4A2 \AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}\else \AtBeginDvi{\special{pdf:tounicode 90ms-RKSJ-UCS2}}\fi   ただし,実行にはEUC-UCS2というファイルが必要.texをインストールする際に,標準でシステムに入る場合はこのままコンパイルできるが,無ければコンパイルできない.私がこれまで経験したなかでは,Vine 5.0, Mac OSXには含まれているが,Debian lennyには入っていなかった.   システムにEUC-UCS2が無い場合,以下のようなサイトから取ってくる.取って

ssh-agentの管理を自動化する

ssh-start.sh ssh-agentの管理を自動化するスクリプトssh-start.shを紹介する. 詳細 ssh-agentを使うことで,sshでリモートログインする際に,パスワードの入力を省略できる. ssh-agentを利用するためには,ソケットのパスとプロセスIDを環境変数に登録する必要がある.環境変数に登録すべき情報は,ssh-agentの起動時に,以下のように標準出力に出力される. $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-XTqIvn4918/agent.4918; export SSH_AUTH_SOCK; SSH_AGENT_PID=4919; export SSH_AGENT_PID; echo Agent pid 4919; 上記のように,ssh-agentの出力はシェルコマンドとなっており,実行すれば環境変数がセットされる.このため,多くの解説記事では,次のようにevalを用いる方法が述べられている. $ eval `ssh-agent` Agent pid 4919 しかし,この方法は,同じssh-agentのプロセスを複数のシェルから利用することはできない.上記コマンドを他のシェル上でも実行すれば,動作はするが,次の点で優れた手法とは言えない. ssh-agentのプロセスを複数起動する (本来は1個で充分). 起動毎に秘密鍵の登録,およびパスフレーズの入力が必要となる. 上記の問題は解決するには,1個のssh-agentを複数のシェルから再利用すればよい.例えば2個のターミナルから1個のssh-agentプロセスを利用するには,次のようにする. # terminal 1 $ ssh-agent > ~/tmp.sh $ source ~/tmp.sh Agent pid 4919 # terminal 2 $ source ~/tmp.sh Agent pid 4919 こうすることで,2個のターミナルから同一プロセスのssh-agentを利用できる. 以上の処理を自動化したものが,ここで紹介するスクリプトである. 使い方 環境変数を扱かうため,通常のスクリプトのようには利用できない.このため,sourceコマンドや.(ドット)コマンドで実行する. $ source /path/to/dir/s