本blogはGoogle AdSenseおよび各種アフィリエイト広告を含みます

Windows MobileのToday画面からはてなハイクに投稿

「タイムラインを見ずに、Windows Mobile端末でミニブログに投稿できたらなー」という需要は私を含めてそこそこあるらしく、手に持ってすぐ投稿できると確かに便利です。

似たようなものとして、手に持ってすぐウェブ検索できるQuicTodayという強力なTodayプラグインがあるため、これと連携してTwitterに投稿するゲートウェイサイト([Windows Mobile]QuicTodayからTwitterに投稿する試み: 旧式ひとりぶろぐ)や直接投稿するアプリケーション(Twitterにコマンドラインから投稿。 - tmytのらくがき)などが作られています。

残念ながらはてなハイク向けのそういった試みは見つからなかったので、今回はPython CE 2.5を導入してHatena Haiku APIからの投稿を試してみることにします。

Advanced/W-ZERO3[es]ことWS011SHではこんな風です。

はてなハイク(idページ)で検索」と書いてあるフォームに短文を入れると投稿できます(入力欄をふたつにしてキーワードへの投稿もできます)。投稿なのに「で検索」と書いてあるのはソフトに埋め込みの文字列なのでこれは仕方ない。

今回使ったコードは末尾に置いておきます。使う場合は最低限、user, password, browserの変数を環境に合わせて書き換える必要があります。平文なのでセキュリティは良くないですね。

投稿時のダイヤルアップがQuicTodayとうまく連携しないので、AutoConnectが無いと実用に耐えないと思う。

# -*- coding: utf-8 -*-

"""
コマンドライン引数に渡って来たクエリのプレフィクスによって
ブラウザに投げたりはてなハイクに投げたりするスクリプト。
警告ダイアログにcoreDllを呼ぶのでWindowsMobile専用。
QuicTodayに下記の設定変更が必要

	使用するブラウザ: python.exeのショートカットにスクリプトの位置を追記したもの

	検索エンジンに追記(1):
	名称        はてなハイク(id頁)
	URL         haiku##$1
	エンコード  shift_jis

	検索エンジンに追記(2):
	名称        はてなハイク(キーワード)
	URL         haiku#$1#$2
	エンコード  shift_jis

実行中エラーや投稿失敗の処理は入っていない。
"""

import urllib2

def postHaiku(keyword, status, source):
	server = u"http://h.hatena.ne.jp/"
	url = u"http://h.hatena.ne.jp/api/statuses/update.json"
	user = u"xxxx"
	password = u"xxxx"

	if status=="":
		return(u"status is blank.")

	passman = urllib2.HTTPPasswordMgrWithDefaultRealm()

	passman.add_password(u"API", server, user, password)
	authHandler = urllib2.HTTPBasicAuthHandler(passman)
	opener = urllib2.build_opener(authHandler)
	urllib2.install_opener(opener)

	req = urllib2.Request(url)
	postdata = u"keyword=" + urllib2.quote(keyword.encode("utf-8"))
	postdata += u"&status=" + urllib2.quote(status.encode("utf-8"))
	postdata += u"&source=" + urllib2.quote(source.encode("utf-8"))
	req.add_data(postdata)

	r = urllib2.urlopen(req)
	r.close

if __name__ == "__main__":
	import sys
	import re
	import ctypes
	import os.path

	# Win32の関数
	shell = ctypes.windll.coreDll.CreateProcessW
	mesbox = ctypes.windll.coreDll.MessageBoxW

	# コマンドライン引数が足りない場合
	if len(sys.argv) < 2:
		mesbox(0, u"please input command line and encoding by shift_jis.\n\
usage:\n\
(1) haiku#keyword#status\n\
(2) url\n", u"notice", None)
		sys.exit()

	# ファイルパス定義
	command = sys.argv[1].decode("mbcs")
	browser = u"\\Program Files\\Opera\\OperaLaunch.exe" 
	disconnect = ""
	#disconnect = u"\\Program files\\harddial\\harddial.exe" # 切断用ソフトのパスを書いておくと実行後ダイヤルアップを切断する

	#ハイク向けかどうか
	if command[0:6] != "haiku#":
		print "Forward to browser."
		shell(browser, command, None, None, 0, 0, None, None, None, None)
	else:
		print "Post to Hatena haiku."
		# "#"で分割した後、URLエンコードを復元する
		param = re.split(u"#", command)
		param = map( lambda x:urllib2.unquote(x).encode("raw_unicode_escape").decode("shift_jis"), param)
		ret = postHaiku(param[1], param[2], u"QuicToday")

		if ret != None:
			mesbox(0, ret, u"error", None)
		print "Done."
		if(disconnect != ""):
			shell(disconnect, "-off", None, None, 0, 0, None, None, None, None)
	sys.exit()