0

GUIから起動してないTerminalからDBUSを使う

LinuxのcrontabやserviceからSkype APIが使えるようになった
https://github.com/shokai/skype-ruby


問題

Skype gemで使っているruby-dbusは環境変数DBUS_SESSION_BUS_ADDRESSを使ってSkypeアプリと通信させてくれるのだが、GUIから起動したTerminalでないとDBUS_SESSION_BUS_ADDRESSが設定されていない。
つまりcronやserviceから起動したプロセスはDBUSが使えなかった


解決方法

~/.dbus/session-bus/ にテキストファイルでDBUS_SESSION_BUS_ADDRESSが書いてあった

kde – Run a dbus program in crontab , how to know about the SESSION id? – Unix & Linux Stack Exchange

DBUSに接続する前に環境変数DBUS_SESSION_BUS_ADDRESSが無かったらファイルから読んで設定するようにした。


Virtual Box

Skype APIは起動済みのSkypeアプリと通信するものなので、Skype botを作るにはSkypeを常に起動しておかなければならない。
家のMacMiniにVirtual BoxにUbuntu12.04入れてその中でSkype起動して運用している。

0

CUIでSkype Chatできるコマンド作った

v0.2.1以降のskype gemに付いている。現在v0.2.2になった。
あまり便利ではないのでおすすめできない。

% gem install skype
% skype-chat

起動するとチャットを選ばされるので、選ぶ。

どの辺が便利でないかというと、そもそもSkype APIはそのマシンでGUIで起動済みのSkypeと通信しているわけなので、あえてCUIでチャットする必要が無い。

ただskype gemのサンプルコードとして有用だと思ったのでつけておいた次第。

これがそのskype-chatコマンド。あの恐ろしいSkype APIがとても綺麗に使えているでしょう。
https://github.com/shokai/skype-ruby/blob/master/bin/skype-chat
本当はreadlineとか使った方がいいんだけどgemに依存が増えてしまうのでこの程度で止めておく。まともなチャットツールにするならこれを元に改造すればいいと思う。

Skype gemはコストの高いAPIは内部で自動的にキャッシュしてくれて便利です。
MacとLinuxに対応しているから、botとか作るのに活用してください。

windows対応はpull request募集中です。

0

Skypeのrubygemをアップデートした

前:Skype API Rubyラッパーのgem作った

gem install skype
https://github.com/shokai/skype-ruby

今v0.2.1になった。

主にrb-appscript廃止と、Chat APIとCall APIのラッパーを作った。

SkypeのAPIは建てまし続けた旅館のようになっていて、素直にラッパーを作ると逆に意味不明になると思ったので俺が欲しい機能を俺が欲しい形式で使えるようにしていく方針。

もちろんSkype.execにSkype APIの文字列を渡せば全機能が使えるようになっているので問題ない。


rb-appscript廃止

新しいmacbook airにrb-appscriptインストールしようとしたらCarbon関係のネイティブがビルドできなくてインストールできなかったのでやめた。
開発停止しているらしいし。
/usr/bin/osascriptに-eでapplescript渡して実行することにした。


Chat APIのラッパー

Skypeはchatを選択するときにIDで指定するんだけど、IDは同じチャットでも人によっては違うIDに見えていたり時間経過で変化してしまっていて、botを作る時に使い勝手が悪かった。

こうなった。
require 'skype'

chat = Skype.chats.find{|c| c.members.include? "shokaishokai" and c.topic =~ /testchat/ }

chat.post "hello chat!!" # 投稿

chat.messages.each do |m|
puts m
end
chatはmessageを受信イベントで受け取れるようにしようか考えている。


Call APIのラッパー

たとえば相手が通話に出た瞬間に切るのはこうやる
require 'skype'

call = Skype.call "shokaishokai"

while !call.talking?
puts call.status
sleep 1
end

call.hangup if call.talking?

0

Gyazz.comの更新をSkypeに通知

作った https://github.com/shokai/gyazzchecker-skype

MongoDB + MacOSX + Skype + Ruby1.8.7で動く。
Skype APIを使うためMac固定なのと、rb-skypemacというgemがRuby1.9系で動かないので1.8.7で。
cronではSkype APIが動かないのでMacのLaunchAgentにインストールするスクリプトを付けておいた。


http://gyazz.comという増井先生がwikiがあり、アウトラインエディタ機能とシンプルな賢い記法で大変便利。

RSSもあるのだが(http://gyazz.com/wiki名/rss.xml にある)
みんなにもっとwikiを見て欲しいのでSkypeチャットに更新通知を投げるツールを作った。
5分ごとに更新があったページのdiffを投げてる。



https://github.com/shokai/gyazzchecker-skype

MongoDB + MacOSX + Skype + Ruby1.8.7で動く。
Skype APIを使うためMac固定なのと、rb-skypemacというgemがRuby1.9系で動かないので1.8.7で。
cronではSkype APIが動かないのでMacのLaunchAgentにインストールするスクリプトを付けておいた。

0

githubのリポジトリ数が100超えた

去年のゴールデンウィークの増井研合宿でgithubの使い方を山プルギス氏に教えてもらってから18ヶ月、ついに公開リポジトリ数が100個に達した。


ぜんぜんgithub上で他人のプロジェクトに首を突っ込んだりしていなかったので、100個のうちほぼ全てが自分で開始したプロジェクトという事になる。だいたい週1つのペースでリポジトリが増えていったわけか


100個目のプロジェクトは、notify-lightだった。
これは家の電灯が点いているかどうかを明るさのセンサーで監視して、Skypeのshokai_botというアカウントが俺に通知してくれるシステム。便利である。防犯的な意味で。
60行ぐらいのRubyスクリプト1ファイルだけで実装されている。


botからSkypeのグループチャットでこういうのが来る。


センサーを使うのもSkypeへの通知も、すでに便利なツールが作ってあって全部HTTPでできる。
ruby notify-light.rb -light http://localhost:8783/ -skype http://localhost:8787/
という風に実行すればセンサーを定期的に監視してSkypeに送信できる。


■しくみ
CdSという明るさが検出できるセンサーをArduino等に適当に接続し、シリアル通信してMacやLinuxに送る。
serial-http-gatewayというプロジェクトを以前作ってあるので、これを使うとシリアルポートから受信したデータを溜めてjson形式で吐き出すHTTPサーバーが作れる。


読んだjsonにはタイムスタンプとセンサーの値(明るさが)入っているので、一定時間内の平均値を計算してノイズを消し、Skypeに通知する。

Skypeへの通知は先日作ったskype-chat-gatewayというのを使っている。
1年ぐらい前にskype-socket-gatewayというのを作ったけどwindows用だったのでもう使わなくなったし、socketよりもhttpから使えたほうが便利なのと、chat_idという概念がわかりにくいので1チャット1プロセス1portが対応するように作りなおした。
また、MacとLinuxでSkype APIを使う仕組みが違うので、それぞれ別々に実装した。

Linux版はまだちょっと微妙なんだけど、Mac版は出来がよくてWebブラウザからSkype Chatができるサーバーとかも付いているので便利です。