DATE : 2010/08/24 (Tue)
Google Developer Day 2010のDevQuizで出題された「2-legged OAuth」を解いた際に使用したソースコードです。一部、xxxxと伏せてある部分があります。言語にはPythonを使用しました。
OAuthでのアクセスを実現するために、oauth2モジュールを使用しました。
どのような署名を求めていたのかが失敗時のレスポンスのbodyに書かれていたため、その内容とOAuth 1.0のRFCとをにらめっこした結果、なんとか解けました。
#!/usr/bin/env python import oauth2 as oauth import time import urllib2 uri = 'http://gdd-2010-quiz-japan.appspot.com/oauth/xxxxxxxxxxxxxxxxxxxxx' params = { 'oauth_timestamp': int(time.time()), 'oauth_nonce': oauth.generate_nonce(), 'hello': 'world' } consumer = oauth.Consumer( key = 'xxxxxxxxxxxxxxxxxxxxxxxx', secret = 'xxxxxxxxxxxxxxxxxxxxxxxx') params['oauth_consumer_key'] = consumer.key request = oauth.Request(method = 'POST', url = uri, parameters = params) signature_method = oauth.SignatureMethod_HMAC_SHA1() request.sign_request(signature_method, consumer, None) header = request.to_header('devquiz') http_request = urllib2.Request(uri, 'hello=world', header) try: response = urllib2.urlopen(http_request) except urllib2.HTTPError, e: print e.read() print response.info()
DATE : 2009/11/05 (Thu)
※ 本記事は、北陸アンカンファレンス2009で発表した内容を文章にまとめたものです。
はじめに
本記事では、Windows上でiTunesをスクリプトから操作できるように、以下の情報を提供します。
- スクリプトからiTunesに対してどのような操作ができるのか
- iTunesをスクリプトから操作するために必要となるもの
- スクリプトの例
- 「iTunes COM Interface Documentation」の見方
- スクリプトを書く上での注意事項
なお本記事の対象はWindowsで、対応する「iTunes COM Interface Documentation」のバージョンは8.1.0.52 です。MacOSに関しては扱いません。なおMacOSではOSA(Open Scripting Architecture)に対応したスクリプト言語からiTunesを操作できるようです。
スクリプトからiTunesに対してどのような操作ができるのか
以下の操作が、スクリプトから可能です。
- プレイヤーの状態の取得(再生中か否か、選択しているトラックなど)
- プレイヤーの操作(再生開始、停止、スキップなど)
- (音楽、ビデオなどにかかわらず)ライブラリの編集(トラックの情報の編集、プレイリストの作成など)
- Podcastの購読・更新
アプリケーション関係やGenius関係以外はだいたい操作できると思います。
iTunesをスクリプトから操作するために必要となるもの。
iTunesをスクリプトから操作するには、以下のものが必要です。
- iTunes
- スクリプトの実行環境
- iTunes COM for Windows SDK
COM(Component Object Model)にアクセス可能であれば、スクリプトの言語は問いません。
iTunes COM for Windows SDKは、以下の手順で入手できます(Apple IDが必要です)。
- Apple Developer Connectionにログインする。
- 「Downloads」を開く。
- 「Developer Tools」を開く。
- 「iTunes COM for Windows SDK」をダウンロード。
スクリプトの例
ここでは、ライブラリ内の曲の情報をコンソールに出力する例を示します。
以下の手順で、ライブラリから曲の情報を取り出します。
- iTunesのCOMオブジェクトを取得する。
- iTunesからライブラリを取得する。
- ライブラリ内の1曲ごとに
- 曲の情報を1行に出力する。
この手順をPython(Python 2.6)で表現すると以下のようになります(;´∀`)Pythonなのは、ただ単に自分がいつも使っている言語だからです。なおPythonでCOMを取得するには、Pythonの実行環境にくわえて「Python for Windows extensions」も必要です。
# iTunesのCOMオブジェクトを取得する。 import win32com.client itunes = win32com.client.Dispatch("iTunes.Application") # iTunesからライブラリを取得する。 musicLibrary = itunes.LibraryPlaylist # ライブラリ中の1曲ごとに for aTrack in musicLibrary.Tracks: # 曲の情報を1行に出力する。 print "%s, %s, %s" % (aTrack.Artist, aTrack.Name, aTrack.Album)
上記のスクリプトで最も重要なのは以下の部分です。
itunes = win32com.client.Dispatch("iTunes.Application")
(※ 以下では、「itunes」変数を、iTunesから初めに取得したCOMオブジェクトが入っている変数とします)
この部分は、iTunesからCOMを取り出す処理を行っています。つまりここからすべてが始まると言えます。「win32com.client.Dispatch」の部分はスクリプト言語によって変わりますが、「iTunes.Application」の部分はどのスクリプト言語であっても変わりません。
さて、iTunesからCOMを取り出す部分がすべての始まりだと言うことはわかりました。それでは、それから様々な操作を行うには、どのようにすればよいのでしょうか。その答えが「iTunes COM Interface Documentation」に書かれています。
「iTunes COM Interface Documentation」の見方
iTunes COM Interface Documentationを開くと、まず目に飛び込んでくるのがインタフェースやクラスの一覧です。
この中にある、「IiTunes」が、iTunesから初めに取得できるCOMオブジェクトとなります。つまり、まず「IiTunes」インタフェースからドキュメントを読んでいくと、スクリプトを使ってiTunesで何ができるのかわかります。
ところが、このiTunes COM Interface DocumentationはC言語向けに書かれており、スクリプトから使用する場合には若干理解しづらい書き方がされています。例えば、プレイリストを表すオブジェクトを生成する、IiTunesインタフェースのCreatePlaylistメソッドは以下のように記述されています。
HRESULT CreatePlaylist ([in] BSTR playlistName, [out, retval] IITPlaylist **iPlaylist)
スクリプトから使う際には、以下のように読むと使い方が理解しやすくなります。(ただし、スクリプトによっては以下のような理解では使えないものもあるかもしれません。しかし少なくとも、VBAやJScript、Ruby、Pythonでは以下のように理解しても問題はありません)。
- 「HRESULT」は無視する。
- 「CreatePlaylist」はメソッド名。
- 「[in]」はメソッドの引数。
- 「BSTR」は文字列型。
- 「[out, retval]」はメソッドの戻り値。
- 「IITPlaylist」はIITPlaylistインタフェース
つまり、プレイリストを生成するには以下のようにメソッド呼び出しを行います。
createdPlaylist = itunes.CreatePlaylist("New Playlist Name")
なお「BSTR」は文字列型を表しています。他にも「VARIANT_BOOL」や「long」、「DATE」などの型があります。このあたりは、スクリプト言語のどの型に相当するのかその名前から想像が付くと思います。
トラックのコレクションを表すIITTrackCollectionなどのxxxxCollectionインタフェースにも注意が必要です(例えば、「itunes.LibraryPlaylist.Tracks」で取得できるオブジェクトはIITTrackCollectionインタフェースを持っています)。言語によっては、これらxxxxCollectionインタフェースがそのスクリプト言語内でのコレクションにマッピングされることがあります。スクリプト言語内のコレクションにマッピングされた場合、xxxxCollectionインタフェースの、指定したインデックスの要素を返す「Item」プロパティは読み替えが必要です。具体的には次のようになります。
# ライブラリから初めの1曲を取り出すコード例 # IITTackCollectionがコレクションオブジェクトにマッピングされる言語の場合、 # このコードはうまく動作しない aFirstTrack = itunes.LibraryPlaylist.Tracks.Item(1) # 以下のように読み替えなければならない aFirstTrack = itunes.LibraryPlaylist.Tracks[0]
スクリプトを書く上での注意事項
iTunesのCOMでは、インデックスが「1」から始まる点に注意が必要です。
ところが、処理系によってはそのスクリプト言語内のコレクションにマッピングする際に、インデックスを補正して0始まりに修正する場合があります(例えばこれまでのコード例のように、Pythonでは0始まりとして扱えます)。それはそれで便利なのですが、気をつけなければならない点があります。コレクションにマッピングされる「Item」プロパティはインデックスが0始まりとして扱えますが、それ以外は1始まりとして扱わなければなりません。例えば、IITTrackCollectionには「ItemByPlayOrder」という指定したインデックスで再生順にトラックを返すメソッドがあります。このメソッドはItemプロパティとは異なり、コレクションにマッピングされる対象外のためインデックスは1始まりとなります。具体的には次のようになります。
# ライブラリから初めの1曲を取り出すコード例 # IITTackCollectionがコレクションオブジェクトにマッピングされる言語の場合、 # このコードはうまく動作するが aFirstTrack = itunes.LibraryPlaylist.Tracks[0] # 次のコードはうまく動作しない aFirstTrack = itunes.LibraryPlaylist.Tracks.ItemByPlayOrder(0) # コレクションにマッピングされないプロパティは、インデックスが1から始まる aFirstTrack = itunes.LibraryPlaylist.Tracks.ItemByPlayOrder(1)
つまり、コレクションへのマッピングの際にインデックスを0始まりに補正するスクリプト処理系でメソッドの引数にインデックスを渡す必要がある場合は、インデックスが1始まりであることを念頭に置いて処理しなければなりません。
最後に
以上、iTunesをスクリプトから操作する方法について簡単に説明してきました。iTunes自体のUIはとても良くできており、手動での操作でもかなりのことができます。ところが再生回数の変更やレートの一括変更など、細かいところではスクリプトの得意とする面もあります。またiTunes外からiTunesを操作するアプリケーションも数多く存在します。そう言った面では、アイディア次第でiTunesをさらに面白く活用することも可能ではないかと思います。
謝辞
北陸アンカンファレンス2009にて、本セッションを聞きに来てくださった方々、つたない説明ながらも熱心にお聞きくださり、誠にありがとうございました。
DATE : 2009/02/15 (Sun)
Skype 4.0以上ではsecondaryオプションを付けることで、Skypeがすでに立ち上がっている状態でもさらにSkypeを追加して起動できます。しかし「Skypeがすでに立ち上がっている状態」というのが曲者で、単純に次のようなバッチスクリプトを書いてもSkypeは1つ目のものしか起動しません。なお、本記事ではSkypeは「C:\Program Files\Skype」にインストールされているものとします。その他のフォルダにインストールされている場合は、SKYPE_EXE_DIR変数を、Skype.exeのあるフォルダに書き換えてください。
setlocal set SKYPE_EXE_DIR="C:\Program Files\Skype\Phone" start /d %SKYPE_EXE_DIR% Skype.exe start /d %SKYPE_EXE_DIR% Skype.exe /secondary endlocal
そこで、1つ目のSkypeを起動したあとにスクリプトの実行をしばらく待機させて、1つ目のSkypeが起動しきってから2つ目のSkypeを立ち上げるようにしました。ただし、指定した時間分待機するようなコマンドはコマンドプロンプトには存在しません。そこで代わりにpingコマンドを使用しました。
setlocal set SKYPE_EXE_DIR="C:\Program Files\Skype\Phone" set PAUSE_SEC=60 start /d %SKYPE_EXE_DIR% Skype.exe REM 1つ目のSkypeの起動を待つため待機 ping -n %PAUSE_SEC% localhost start /d %SKYPE_EXE_DIR% Skype.exe /secondary endlocal
このバッチスクリプトをスタートアップに入れておけば、Windowsの起動時にSkypeを同時に2つ立ち上げることができます。なお、上のバッチファイルでは1つ目のSkypeを立ち上げた後に60秒待機してから2つ目のSkypeの起動を行っています。お使いの環境によっては、それが長すぎたり短すぎたりすることもあるので、PAUSE_SEC変数の部分をほどよい秒数に調節してください。
参考文献
DATE : 2008/09/19 (Fri)
Twitter を使用して早1ヶ月以上が経ちました。初めはインスタントメッセンジャー(以下、IM)経由で使用していたのですが、Twitter 側の障害により、Web のインタフェースを使わなければならない状況になってしまいました。
Web のインタフェースも使い心地は悪くないのですが、IM を使っていた頃と違って、フォロー数、被フォロー数が常に目に入るようになってしまいました。いくら気にしないように心がけていても、やはり数字の増減は気になってしまいます。
ということで、フォロー数、被フォロー数をウェブのインタフェースで非表示にする Firefox 3 用のユーザスタイルシートを書いてみました。IM が完全に復活するまでの暫定的なものなので、フォロー、被フォローへのリンクも丸ごと非表示にします。
なお、ユーザスタイルシート中の your_name の部分は、Twitter での自分のユーザ名に置き換えてください。
更新履歴
- 2008/09/19
- Twitter のデザイン変更で「設定」→「デザイン」の部分に表示されてしまう問題に対処。
- 2008/07/25
- 「ダイレクトメッセージ」ページでの非表示化が抜けていたのを修正。
- 2008/06/29
- 「お気に入り」ページでの非表示化が抜けていたのを修正。
- 2008/06/25
- 公開。
Firefox 3 用ユーザスタイルシート
/* Version : 2008/09/19 */ @-moz-document url-prefix(http://twitter.com/your_name), /* 自分のユーザ名を含むページ */ url-prefix(https://twitter.com/your_name), url-prefix(http://twitter.com/home), url-prefix(http://twitter.com/replies), url-prefix(http://twitter.com/account), url-prefix(http://twitter.com/public_timeline), url-prefix(http://twitter.com/favorites), url-prefix(http://twitter.com/direct_messages), url-prefix(https://twitter.com/home), url-prefix(https://twitter.com/replies), url-prefix(https://twitter.com/account), url-prefix(https://twitter.com/public_timeline), url-prefix(https://twitter.com/favorites), url-prefix(https://twitter.com/direct_messages) { a[href$="/followers"], a[href$="/friends"], #following_count, #followingcount, #follower_count, #followers_count { display : none; } }
DATE : 2008/07/19 (Sat)
Pidginから Twitter を利用する際に便利な機能を提供する pidgin-twitter プラグインがyaz さんによって公開されています。このプラグインを、Windows でビルドしてみました。本記事では、ビルドの方法をメモしておきます。なお、対象とする pidgin-twitter プラグインのバージョンは 0.7、Pidgin のバージョンは 2.4.3 です。
なお、Windows 版のバイナリはnosuke さんが公開されています。
Pidgin のビルド環境を整える
pidgin-twitter プラグインのビルドには、Pidgin を Windows でビルドできる環境が必要です。
Pidgin をビルドする環境を整えるには、Windows/Pidginをビルドしてみる/ビルド手順/pidgin-2.4.3 や Pidgin for Windows Build Instructions が参考になります。特に、後者のページは、必要となるライブラリへのリンクがあるので重宝します。
まずは、上記のページを見て Pidgin をビルドする直前まで準備を進めます。
Pidgin 公式の GTK+ パッケージと、最新版の GTK+ パッケージを入手する
このまま Pidgin のビルドを行いたいところですが、pidgin-twitter プラグインが対象とする GLib のバージョンは 2.14.0 以上となっており、上記のページで使用する GTK+ 2.6.10 は GLib のバージョンが古いため使用できません。
そこで、Pidgin for Windows Build Instructions - Install Pidgin's build dependencies - GTK+ から入手できる GTK+ 2.6.10 パッケージに加えて、GTK+ Download for Windows から、GLib や GTK+ など、「Dev」と書かれたパッケージをすべて入手します(本記事執筆時点の GLib のバージョンは 2.16.3、GTK+ のバージョンは 2.12.9 でした。他のパッケージのバージョンは省略します)。「Dev」と書かれたパッケージがない場合は、「Binaries」と書かれたものを入手します。ここで入手したパッケージは、Windows/Pidginをビルドしてみる/ビルド手順/pidgin-2.4.3 にあるように、win32-dev 以下に gtk_2_0 として配置してください(すでに GTK+ 2.6.10 を配置している場合は、配置した GTK+ 2.6.10 を削除するか、名前を適当に変えてください)。GLib や GTK+ などに依存するライブラリを配置する際に、同名のファイルを上書きするかどうか問われることがありますが、とりあえずサイズの大きな方を残しておけば問題ありませんでした。
なお、GTK+ Download for Windows から入手できる zlib 1.2.3 には、zlib1.dll は付属しているものの、libz.a などは付属していません。Pidgin をビルドする際には libz.a が必要となるため、libz 関係のファイルは Pidgin for Windows Build Instructions - Install Pidgin's build dependencies - GTK+ から入手できる GTK+ 2.6.10 パッケージに付属するものを使用します。GTK+ 2.6.10 のパッケージを解凍すると、gtk_2_0 フォルダが出てきます。gtk_2_0\lib 以下の、ファイル名の先頭が libz ファイル全てを win32-dev\gtk_2_0\lib フォルダにコピーします。
GetText for Windows を入手する
Pidgin 公式の GTK+ パッケージ(GTK+ 2.6.10)と GTK+ Download for Windowsから入手した最新の GTK+ パッケージ(GTK+ 2.12.9)比較すると、前者には GNU GetText のコマンド類が含まれていますが、後者には含まれていません。
そこで、GnuWin32 プロジェクトが提供する GetText for Windows を入手します。「Complete package, except sources」を選び、GetText for Windows をインストールします。インストール先にあるフォルダ(bin、libなど)をすべて、win32-dev\gtk_2_0 にコピーします。
MinGW の gcc が使用されるかどうか確認する
Pidgin のビルドには、MinGW の gcc を使用します。以下のコマンドを実行して、gcc に MinGW のものが使用されるかどうか確認してください。(「$」はプロンプトです)
$ which gcc
MinGW をインストールしたパスが結果に含まれていれば、MinGW の gcc が使用されます。Cygwin の gcc が使用されている場合は、Cygwin の gcc をアンインストールしてください。
(;^ω^)Cygwin の gcc を使用すると、Pidgin のビルドの途中で「undefined reference to `__errno'」というエラーが発生してビルドが失敗してしまいます。
pidgin-2.4.3\pidgin\plugins\perl\common\Makefile.mingw を修正する
以上で Pidgin をビルドできる環境は整いましたが、pidgin-2.4.3/pidgin/plugins/perl/common/Makefile.mingw に間違いがあるため、ビルドは失敗します。pidgin-2.4.3\pidgin\plugins\perl\common\Makefile.mingw を開き、18行目から始まる「INCLUDE_PATHS」マクロに「-I$(GTK_TOP)/include/cairo」を追加します。以下に、追加後の「INCLUDE_PATHS」マクロを示します。
INCLUDE_PATHS = -I. \ -I$(PIDGIN_TREE_TOP) \ -I$(PURPLE_TOP) \ -I$(PURPLE_TOP)/win32 \ -I$(PIDGIN_TOP) \ -I$(PIDGIN_TOP)/win32 \ -I$(GTK_TOP)/include \ -I$(GTK_TOP)/include/atk-1.0 \ -I$(GTK_TOP)/include/glib-2.0 \ -I$(GTK_TOP)/include/gtk-2.0 \ -I$(GTK_TOP)/include/pango-1.0 \ -I$(GTK_TOP)/include/cairo \ -I$(GTK_TOP)/lib/glib-2.0/include \ -I$(GTK_TOP)/lib/gtk-2.0/include \ -I$(PERL_LIB_TOP)/CORE
Pidgin をビルドする
以上で、Pidgin 2.4.3 を GTK+ 2.12.9 でビルドする環境が整いました。
正しくビルドできるかどうか、pidgin-2.4.3 にカレントディレクトリを移動して実際にビルドして確かめておきます。
$ make -f Makefile.mingw install
pidgin-twitter プラグインをビルドする
pidgin-twitter プラグインは、C で書かれています。C で書かれたプラグインのビルドには、Basic C Plugin How-To - Compile, Install, and Load the Hello, World! Plugin の文書が役に立ちます。
pidgin-2.4.3\pidgin\plugins\Makefile.mingw を修正する
C で書かれたプラグインを Windows 環境でビルドするには、pidgin-2.4.3\pidgin\plugins\Makefile.mingw という Makefile を使用します。ところが、pidgin-twitter プラグインをビルドするのに必要なライブラリ libxml2 が、この Makefile.mingw には設定されていません。
そこで、pidgin-2.4.3\pidgin\plugins\Makefile.mingw を開き、
- 21行目から始まる「INCLUDE_PATHS」マクロに「-I../../../win32-dev/libxml2-2.6.30/include」
- 36行目から始まる「LIB_PATHS」マクロに「-L../../../win32-dev/libxml2-2.6.30/lib」
- 43行目から始まる「LIBS」マクロに「-lxml2」
を追加します。
pidgin-twitter プラグインのビルド
まず、pidgin-twitter プラグインのパッケージの中から、pidgin-twitter.c, pidgin-twitter.h を pidgin-2.4.3\pidgin\plugins にコピーします。
カレントディレクトリを pidgin-2.4.3/pidgin/plugins に移して、プラグインのビルドを行います。
$ make -f Makefile.mingw pidgin-twitter.dll
これで、pidgin-2.4.3\pidgin\plugins に pdgin-twitter.dll ができているはずです。あとはこれを、マシンにインストールされている Pidgin の プラグインフォルダに入れればインストールは完了です。
更新履歴
- 2008/07/19 pidgin-twitter プラグイン 0.7 に合わせて修正。
- 2008/05/09 公開