cybozuのスケジュールを取り出して、ical形式で書き出すperlのスクリプト。
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 $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();
後は、なんでかわかんないけど、消したはずのイベントが残るのと、繰り返し系のイベントの表示が重なっておかしくなることくらいかな。 使ってみる大分前に試してみて、あまりうまくいかなかったのでやめたのだけど、なんとかうまくいったみたいだよ。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とか調べたら、もうちょっとスマートなインポートの方法とかわかるかな?
|
Home > ProgramTool >