Home‎ > ‎ProgramTool‎ > ‎

Cybozu2ical

cybozuのスケジュールを取り出して、ical形式で書き出すperlのスクリプト。
私は、GoogleCalendarに読み込ませてます。

http://code.as-is.net/public/wiki/Cybozu2ICal.ja_JP

100118_19_02
自分の会社の環境が、サイボウズガルーン2になってしまったので、そのまま使えなくなりました。
というわけで、かなりいい加減ですが、cybozu2icalの代わりになるスクリプトをかいてみました。
ただし、ruby。

081117_11_24
吐き出しまでは、うまくいっている。(手動でアップロードすれば、問題なく反映される)
でも、URL指定でGoogleCalendar に読み込ませると文字化ける。
しばらくほってたのだが、まぁ、化けるということは文字コード絡みなのだろうと
.htaccess 作って下記の指定をいれたら、化けなくなったみたいだ。

AddType "text/calendar; charset=UTF-8" .ics

但し、同じURLはキャッシュされるみたいなので、疑似的にパラメタをつけて読み込んでみた。
まぇから思っているが、どんな周期で読み込みをしているのが、イマイチわからない。

cybouz7で使えるようになってた


081110_13_03
なんか、アップデートされてて 7対応していたので試してみる。
しばらく "500 Can't call method "request" on an undefined value"
ってのが、出続けてて、理由がわかんなかったのだが、

Crypt::SSLeay 入れるの忘れてた。 orz
デバッグの問題切り分け能力落ちてないか?

後は、ApiCalendar.pm my $ua         = LWP::UserAgent->new; の下に
$ua ->credentials("「http://を除いたurl:ポートナンバー 例 www.xxx.xxx.jp:443」", "area", "id", "password");
書き加えるだけ。

cybouz7になって使えなくなったぽ

080323_01_43
なので、いじってみることにしたのだが、
家のマシンでやろうと思ったら、Leopardいれたときに環境まっさらにしたもんで、
CPANのモジュールが全然入ってないことに気がついた。

CPANインストールの続きは Perl で。



さて、一応CPANはいったので、続けることにする。
DateTimeがないっておこられる、ので入れる
cpan > install DateTime
全部 yesにしたら、/usr/bin/make install 1 -- NOT OK ってでやがった。(自分の設定ミスだった。)
でも、なんか入ってるみたいなので無視。
今度は、 Data/ICal がないっておこられる。
cpan > install  Data::ICal
死ぬほど依存モジュールがあるみたいだが、全部リターン。
ようやく動くようになったみたいだ。
config.yaml を自分のところ用にセットして試す。
当然、下にあるような特殊事情によりエラー。
で、下記のをいれこんだんだが、なんかミスってすんなりいかなかったが、何とか次の段階へ。

500エラーではじかれてる、よくわからんかったが、SSLで接続するにはさらにモジュールが必要だったようだ。
ベーシック認証はとおったっぽかったので、コレで大丈夫かと思ってた。
どっかで、Net::SSLeay 入れろと書いてあったので試してみるが、エラーが出る。
他のページで、Crypt::SSLeay 入れろと書いてあったので、こっちもやってみる。こっちは、いけた。
cpan > install Crypt::SSLeay
カレンダーデータが書き換わってるっぽいので、45行目あたり書き換え。
my $res = $this->{ua}->post($this->{url} . '?page=PersonalScheduleExport', {
なんとか、ログインまではいけたようだ。
ところが、我が社のサイボウズ、3:00〜4:00まではメンテナンスなんだ。がーん。またしても中断。

080323_16_07
再開したんだけども、csvのフォーマットも完全にかわってるぽいよ。
なんで、こんなもんまでかえる。やる気がなくなってきた。

まぁ、練習のつもりでもうちょっといじってみるか。
そうそう、以下も必要になる。多分、他にもいるんじゃないか?
cpan > install Text::CSV
まず、直接取得ができない。一旦ログインしてから、改めてフォームでパラメタをポストしてやらないと取得できないようなのだ。
というわけで、まずセッションcookieが必要になるので、ua 作った後で設定しておく。

my $cookie_jar ||= HTTP::Cookies->new(file => "クッキー格納ファイル", autosave => 1);
$param{ua}->cookie_jar($cookie_jar);

後、取得のためのフォームなんだが、このページ埋め込まれているjavascriptで生成されるinput hiddenの key を一緒に渡してやらないとエラーになる。ので、ログインした後のこの画面からkeyを拾ってくる。
で、もう一度リクエストを発行して、CSVをとってくる。
$content =~ m/formkey.value = ¥"(.*?)¥"/;
my $keyword = $1;
$res = $this->{ua}->post($this->{url} . '/schedule.csv?', {
Page    => 'PersonalScheduleExport',
"SetDate.Year" =>2008,
"SetDate.Month" => 1,
"SetDate.Day" => 1,
"EndDate.Year" => 2008,
"EndDate.Month" => 1,
"EndDate.Day" => 31,
ItemName => "1",
csrf_ticket =>$keyword ,
Export =>"書き出す",
});
confess 'Failed to access Cybozu Office 6: ' . $res->status_line
unless $res->is_success;
$content = $res->content;
こんだけ、元の my $content = $res->content; の後に書き足してやる感じ。
(とりあえず、パラメタの日付は、アテでいれてある。)
これで、ようやくデータの取得まではできたわけ。
データフォーマットの変更箇所に対する対処は、サイボウズ6のフォーマットみながらやった方が
ましな気がするので、今日は、ここまで。

しかしまぁ、こんなに面倒な思いするとはおもってなかったよ。

ver 0.20

サイボウズがSSL下になったため、取得できてない筈なんですけど
その他、Googleカレンダーで化けるようになったこともあり、
設定変更ついでにupdateしておきました。
前回に引き続き、何が変わっているのかよくわかってないですが。
ソースへの変更は ver0.11のときから変わってません。

ver 0.12

何が変わっているのかよくわかってないですが、バージョン上がっていたので入れ替えてみました。

verが0.11になってた

で、いれかえ

ベーシック認証のは相変わらず必要。
でも、前に書いていた不具合っぽいのはなくなっているみたい。

calendar.pm に変更を加える

19,20行目

$param{ua} ||= LWP::UserAgent->new();
$param{ua} ->credentials("「http://を除いたurl:ポートナンバー 例 www.xxx.xxx.jp:80」", "area", "id", "password");
bless ¥%param, $class;

後は、なんでかわかんないけど、消したはずのイベントが残るのと、繰り返し系のイベントの表示が重なっておかしくなることくらいかな。

使ってみる

大分前に試してみて、あまりうまくいかなかったのでやめたのだけど、なんとかうまくいったみたいだよ。
cybozu2ical自体のverも0.02から0.04になってたし。
ただ、そのままじゃうまくいかなくって、

まず、うちの特殊事情として
・Basic認証対応の追加

後、これもよくわかんねのだけど、
DateTime->new した時、時間が24を超えてちゃ駄目よって起こられるのね。別に24時を超えるイベントはないのだけど。
とりあえず、丸めちゃってもあまり問題なさげ?なので、
・24超えたら0にしておくみたいの入れてごまかし

何故か?読み込むとJSTのはずがUTC?かなんかになっちゃうので
・出力のicalの書式を後で置換
多分、もちっとスマートな方法がありそう。
具体的には、EVENTの
DTSTART: とDTENDを下記に置換
DTSTART;TZID=Asia/Tokyo:
DTEND;TZID=Asia/Tokyo:

後は、これを実行して適当なwebサーバにあげるcron書いておしまい。
APIとか調べたら、もうちょっとスマートなインポートの方法とかわかるかな?


Comments