サイボウズLive apiをphpで使う方法

2011年12月25日

ネットで使える無料のコラボレーションツールの「サイボウズlive」が先日、apiを発表しました。Oauth認証を使ってログインする仕様なのですが、サンプルコードにphpはなかったので公開しておきます。

サイボウズLive apiで出来ること

webアプリケーションでは、データの読み込みと新着情報を既読に変更する機能に限定されています。
ですので、現時点でサイボウズLive apiでは、新着情報や過去の掲示板情報などを「読み込み」「再整理」して提示するという部分にフォーカスするマッシュアップサイトを作ることができます。

データのアクセスレベルから詳細をみることができます。

サイボウズlive apiのディベロッパーに登録する

まずは、サイボウズlive apiにディベロッパーとして登録する必要があります。ディベロッパー登録ページで登録して下さい。

ConsumerKeyとConsumerSecretはあとで使いますので控えておいて下さい。また、コールバックurlはアクセストークンを取得するファイル名を絶対パスで指定して下さい。以下では、login.phpがそれに当たります。

ログイン処理(login_cy.php)

まずはログイン処理です。ここでは、pearのHTTP_OAuth、HTTP_Request2、Net_URL2を利用していますので、未インストールの場合はインストールして下さい。

$ pear install Net_URL2-0.3.0
$ pear install HTTP_Request2-0.5.1
$ pear install HTTP_OAuth-0.1.6

レンタルサーバなんかで pear コマンドが使えない場合はそれぞれをダウンロードしてきて解凍してFTPでサーバに置いて下さい。(Net_URL2HTTP_Request2HTTP_OAuth

以下、ログインをするためのコードです。1つのページでリクエストトークンとアクセストークンの両方を取得するようにしています。なお、カスタマーキーとシークレットキー、コールバック先のURL(********で表示している場所)は自分の環境に置き換えて下さい。

login_cy.php

<?php
// *********************************************************
// cybozuliveへログイン
// *********************************************************

// require HTTP_OAuth
require_once('HTTP/OAuth/Consumer.php');

/* cybozuliveの認証情報を格納するためにセッションを開始 */
session_start();

/* Consumer key from cybozulive */
$consumer_key = '*********************';
/* Consumer Secret from cybozulive */
$consumer_secret = '*********************';
/* cybozuliveからの Callback url  */
$callback_url = 'http://************/login.php';

/* Set up placeholder */
$content = '';

try {
    // -- init HTTP_OAuth_Consumer
    $oauth = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
    // ssl通信を可能に
    $http_request = new HTTP_Request2();
    $http_request->setConfig('ssl_verify_peer', false);
    $consumer_request = new HTTP_OAuth_Consumer_Request;
    $consumer_request->accept($http_request);
    $oauth->accept($consumer_request);

    if (!empty($_REQUEST['oauth_token']) && $_SESSION['oauth_state'] === 'start') {
        // -- cybozuliveから認証後に戻ってきた場合 (callback処理)
        $_SESSION['oauth_state'] = 'returned';

        if (empty($_SESSION['oauth_access_token']) || empty($_SESSION['oauth_access_token_secret'])) {
            // -- access_tokenが未取得の場合
            /* request tokenをセット */
            $oauth->setToken($_SESSION['oauth_request_token']);
            $oauth->setTokenSecret($_SESSION['oauth_request_token_secret']);

            /* cybozuliveから戻ってきた oauth_verifierをセット */
            $oauth_verifier = $_REQUEST['oauth_verifier'];

            /* Access token をリクエスト */
            $oauth->getAccessToken('https://api.cybozulive.com/oauth/token', $oauth_verifier);

            /* Acces tokenを保存 (実際のアプリケーションではこれをDB等に保存しておきます。) */
            $_SESSION['oauth_access_token'] = $oauth->getToken();
            $_SESSION['oauth_access_token_secret'] = $oauth->getTokenSecret();
        }

    }

	if (!empty($_SESSION['oauth_access_token']) && !empty($_SESSION['oauth_access_token_secret'])) {
		
		// -- 認証済みの場合は遷移
		header('Location:index.php');
    } else {

        // -- 初回呼び出し時
        /* cybozuliveからrequest_tokenの取得 */
        $oauth->getRequestToken('https://api.cybozulive.com/oauth/initiate', $callback_url);

        /* tokenをセッションに保存 */
        $_SESSION['oauth_request_token'] = $oauth->getToken();
        $_SESSION['oauth_request_token_secret'] = $oauth->getTokenSecret();
        /* ステータスをstartにセット */
        $_SESSION['oauth_state'] = "start";

        /* authorization URL を取得 */
        $request_link = $oauth->getAuthorizeURL('https://api.cybozulive.com/oauth/authorize');

		// headerでログイン画面へジャンプ
		header("HTTP/1.0 307 Temporary redirect");
        header("Location: " . $request_link);
    }

} catch (Exception $e) {
    $content = $e->getMessage();
}
?>

 
細かく注釈つけてるので大丈夫だと思いますが、ログイン処理はlogin_cy.phpで行って、ログインが完了したらheaderでindex.phpに遷移するようにしています。
 
 

表示処理(index.php)

ここでは、取得したアクセストークンをパラメータに放りこんでデータを要求します。ちなみにこの例では、scape(データ要求先)はhttps://api.cybozulive.com/api/notification/V2?unconfirmed=true(ユーザーが確認していない情報のみを取得する)で設定していますが、scapeによって様々な情報を獲得することができます。詳しくはサイボウズLive apiのドキュメントをご参照下さい。
 
なお、ログインできていなかったら(セッションに必要なデータがなかったら)戻ってログイン処理をやり直すようにしています。

index.php

// *********************************************************
// cybozuliveへログインできてるか確認
// *********************************************************

// require HTTP_OAuth
require_once('HTTP/OAuth/Consumer.php');

/* Consumer key from cybozulive */
$consumer_key = '*********************';
/* Consumer Secret from cybozulive */
$consumer_secret = '*********************';

try {
    // -- init HTTP_OAuth_Consumer
    $oauth = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
    // ssl通信を可能に
    $http_request = new HTTP_Request2();
    $http_request->setConfig('ssl_verify_peer', false);
    $consumer_request = new HTTP_OAuth_Consumer_Request;
    $consumer_request->accept($http_request);
    $oauth->accept($consumer_request);

    if (!empty($_REQUEST['oauth_token']) && $_SESSION['oauth_state'] === 'start') {
		// -- cybozuliveから認証後に戻ってきた場合 (callback処理)		
		header('Location:login_cy.php');
    }

	if (!empty($_SESSION['oauth_access_token']) && !empty($_SESSION['oauth_access_token_secret'])) {
		
		// -- 認証済みの場合は遷移
		/* access_tokenをセット */
        $oauth->setToken($_SESSION['oauth_access_token']);
        $oauth->setTokenSecret($_SESSION['oauth_access_token_secret']);

        /* ユーザ情報を取得するリクエストを発行. */
		$result = $oauth->sendRequest('https://api.cybozulive.com/api/notification/V2', array("unconfirmed"=>"true"), 'GET');

        /* データを取得 */
		$cybozu = $result->getBody();
		$cybozulive = simplexml_load_string($cybozu);
		$c_count = 0;
		foreach ($cybozulive->entry as $child) {
			$c_count += 1;
		}

    } else {
        // -- 初回呼び出し時
        header('Location:login_cy.php');
    }

} catch (Exception $e) {
    $content = $e->getMessage();
}

これで、$c_countに新着情報の数、$cybozuliveにsimplexml_loadで解析済みのフィード情報が入りました。print_rなどで中身を確認しながらいれこんでいけばいいと思います。
それでは、楽しいサイボウズLive apiライフを!

slackチームに参加下さい

ng-onsenui2.slack.com

OnsenUI2(Angular2)について知見を共有する場です。Angular2に限ってOnsenUI2を議論できる場がなかったのでつくりました。これから使い始めるという方はぜひご参加ください。
https://ng-onsenui2.herokuapp.com/

Ionic2.slack.com

日本語情報が少ないのでこちらで知見を共有できればと思います。お陰様で参加者100名を超えました。ありがとうございます。
https://ionic2-ja.herokuapp.com