Prowl APIでiPhoneに通知を送る

# -*- coding: utf-8 -*-
from urllib import urlencode

apikey = u'0000000000000000000000000000000000000000000'

data = urlencode({
    u'apikey': apikey,
    u'application': u'アプリケーション名',
    u'event': u'イベント名',
    u'description': u'イベントの説明',
    u'priority': u'1'
})

import urllib
urllib.urlopen("https://prowl.weks.net/publicapi/add/", data)

今後の展開

CraftLaunchEX関係で言えば、とりあえず、はてなアンテナとかGMailとかチェックしたい。ついでにGMailと連携する感じでRTMモード的なのもあると良いかもなぁ。
LauncherEXのサブモード用にBalloo!とかスレッドビューとか天気予報とか。天気予報はサブモードじゃなくてもいいんだけど。
LauncherEXのリスト作成時のフックにfenrirのpathデータを読み込むHackとか。あれって単なるテキストデータっぽいから、fenrirと共有するなり、LauncherEX単体でfenrir形式のpathデータを作成するなりすれば意外と良い感じかも。
ちょっとした表示系のスクリプトで言えば、駅名入力したら駅の時刻表。1~12の数字を入力して3時間分ぐらいのTV番組表。Wikipedia検索。
オプションの設定用GUI。公式で作ってくれれば一番だけど、その場合勝手オプションは対応してくれないだろうからoptionテーブルに乗ってるオプションを動的に検出して設定できるGUIが欲しい。
……これだけ書いておけば、どれか他の人が作ってくれるんじゃね?(他力本願

とりあえず最新版の0.992で動かないスクリプトは無いような感じ。実行ファイルのサイズが凄いことになっててびっくりした。Pythonのライブラリとか全部スタティックリンクしたって事だろうか?IronPython?興味は尽きないけど、何が出来て何が出来ないかは、まだこれから。
ちなみに、時々目にする旧CraftLaunchのアクティブ化はトグルオプションはLauncherEXにひっそり実装されてます。config.pyのアクティブ化ホットキーをclmode_lex.ToggleActive()に変更してください。設定例は以下の通り。

# ココをコメント化(もしくは削除)SetHotKeyHandler( ord(' '), MODKEY_CTRL, ActivateSelf ) # Ctrl-Space

def ToggleActive():
    clmode_lex.ToggleActive()
SetHotKeyHandler( ord(' '), MODKEY_WIN, ToggleActive ) # Ctrl-Space

ちゃんと出たら動作確認ぐらいはします。はてなアンテナ用のも出来たら最新にしたい。なにげにアレは便利だったんだ。
最近はiPhoneの開発に興味が移りがち。でも本業が忙しくてなかなかきちんとしたモノにまとめられないのです。

tracによるプロジェクト管理

今更ながらlinuxでサイト構築にはまってみた。結構おもしろい。とりあえずSubversiontracをインストールしたので、CraftLaunchEXスクリプト関連はtracの管理に移行しようと思う。ブランク開きすぎて何やろうとしてたのかも忘れてしまったりしているのが一番の問題だけど、配布サイトのアクセスログを眺めるにLauncherEXにはまだ若干の需要があるみたいだ。そうそう、DesktopSearchとの連携とかGoogleAPI絡みのモードとかイロイロ考えてたんだよなぁ。

とりあえず、配布サイトのリンクもそのうちすり替わると思うけど、一足先にここでURLを公開。
CraftLaunchEX Scripts

発着信。呼の取得

発呼するにはPlaceCall(user_handle)。新しい呼を返す。公衆回線網(PSTN)に発信する場合は番号を指定可能な模様だが未確認。保留されていない呼がある場合には新しい発信はできないことに注意。

    oSkype.PlaceCall(user.Handle)

カンマ区切りで複数指定すると会議通話を作成できる。UI上では最大9人まで指定できそうだけど、Helpファイルだと昔の制限のまま4件までとなっている。実装がParamArrayじゃなくてOptionalになっているっぽいので、PlaceCall(String())とやった場合には動かない。PlaceCallの上限については、友人をテストに巻き込むのも悪い気がして未確認。

発着信を行って呼のステータスが変化した場合はCallStatusイベントが発生する。
一般的な発信呼のステータスの遷移は、clsRouting, clsRinging, clsInProgress, clsFinished。大体一般的なCTIアプリケーションに準じる形になってると思う。HoldのステータスはclsRemoteHoldとclsLocalHold。clsOnHoldも定義されているけど、いつOnHoldになるのか不明。互換性のため残されているのかも。相手先がOfflineの場合clsFailed、着信拒否はclsRefused。ほかにボイスメール系はステータスが別に用意されている。
着信呼はclsRingingから始まる。CallStatusイベントで発信呼と着信呼を区別するにはCall.Typeを参照する。発着信、P2PとPSTNの掛け合わせで4種類のTypeが存在する。着信呼に対しては各メソッドの実行で応答、着信拒否、転送等が行える。

Private Sub skypeObject_CallStatus(ByVal pCall As SKYPE4COMLib.Call, ByVal Status As SKYPE4COMLib.TCallStatus) Handles skypeObject.CallStatus
    'Away時は着信を音声テストに転送するサンプル
    If pCall.Status = SKYPE4COMLib.TCallStatus.clsRinging And _
        pCall.Type = SKYPE4COMLib.TCallType.cltIncomingP2P Then

        dim handle as string = "echo123"
        If skypeObject.CurrentUser.OnlineStatus = _
            SKYPE4COMLib.TOnlineStatus.olsAway Then

            pCall.Transfer(handle)
        End If
    End If
End Sub

あまり重要ではないかもしれないが、呼が転送されたときに被転送側ではCallStatusイベントを確認出来なかった。

Skype.ActiveCallsから現在接続されている呼が取得できるようになる。

    Dim call as SKYPE4COMLib.Call
    dim handle as string, name as string 
    for each call in oSkype.ActiveCalls
        '現在アクティブな呼
        handle = call.PartnerHandle
        name = call.PartnerDisplayName
    next

呼の通話相手はcall.PartnerHandleからハンドルを取得できる。User Objectは呼から直接取れない(コンタクトリストにない相手とも通話できるから)。
会議通話の場合、会議通話が終わるまで使用した呼はDisposeしない作りになっているらしく、会議通話中にFinished、Refused、Failedになった呼はActiveCallsのCollectionからは削除されない。これはSkypeの実装に由来するのか、SKYPE4COMの実装がそうなっているからなのかは未確認。終了した呼の情報を使用できるようにSkype本体の実装がそうなっている可能性も否定できないが、基本的に終了した呼は再利用できないし、呼の履歴はskype.Callsが保持しているはず。
会議通話用にskype.Conferenceがあるのだが、テストした限り値が入ってなさそうに思える。Object自体は常に存在するらしくアクセスしてもエラーにはならないが、UIからの場合とコードからの場合と共に、会議通話を作成してもConference.IDは常に0に設定されていた。