公開と同時につぶやくよ(TwitterAPI叩いてみた)

注意! この記事の内容は、2010年のTwitterAPIのBasic認証廃止に伴い、現在利用できません

POSTモジュールの例

スーパー地味どころか使い所無いですが、エントリーを公開するついでにツイート(笑)するPOSTモジュールを書いてみました。いや、深夜に隣の部屋が盛り上がり始めて睡眠妨害されたもんで、つい。

拡張機能の開発 | a-blog cms - Web制作者のためのCMS のような、開発系の情報もちょろっと出始めているの小出ししてみる次第。

処理の順序

  1. タイトルとリンクを取得して、Tweet文字列を作成
  2. TinyURLにリンクを投げて短縮
  3. TwitterAPIを、PEARのHTTP_Requestで叩く
  4. 本来のエントリー公開処理

PHPを準備する

下のコードを、/php/ACMS/POST/Entry/OpenTweet.phpとして作成します。IDとパスワードは、ぼちぼち書き換えてください。

<?php

require_once ACMS_LIB_DIR.'POST/Entry/Open.php';

class ACMS_POST_Entry_OpenTweet extends ACMS_POST_Entry_Open
{
    function post()
    {
        $twitId = 'あなたのID';
        $twitPw = 'あなたのパスワード';

        $bid    = $_POST['bid'];
        $cid    = $_POST['cid'];
        $eid    = $_POST['eid'];

        /**
         * 遠回しにエントリータイトルを取得します。
         * submitする時点で{entry_title}とかの変数を忍ばせて送った方が良いです。
         * テンプレートの編集を手抜くために今回はこれで。
         */
        $DB     = DB::singleton(dsn());
        $SQL    = SQL::newSelect('entry');
        $SQL->addSelect('entry_title');
        $SQL->addWhereOpr('entry_blog_id', $bid);
        $SQL->addWhereOpr('entry_id', $eid);
        $title  = $DB->query($SQL->get(dsn()), 'one');

        /**
         * リンクを組み立てて更にtinyUrlに投げて短縮します。
         */
        $url    = acmsLink(array('bid'=>$bid, 'cid'=>$cid, 'eid'=>$eid));
        $tiny   = file_get_contents('http://tinyurl.com/api-create.php?url='.$url);

        $tweet  = "NewEntry! $title - $tiny";
        //die($tweet);

        // ここで結果を確認しても良いけど、とりあえず無視。
        $res = $this->entryTweet($twitId, $twitPw, $tweet);

        // 親のpostメソッドを起動して公開処理に戻る。
        return parent::post();
    }

    function entryTweet($id, $pw, $tweet)
    {
        $param = '?status='.rawurlencode($tweet);

        require_once LIB_DIR.'PEAR/HTTP/Request.php';
        $REQ = new HTTP_Request('http://twitter.com/statuses/update.xml'.$param);
        $REQ->setMethod(HTTP_REQUEST_METHOD_POST);
        $REQ->setBasicAuth($id, $pw);
        $res = $REQ->sendRequest();

        if ( !PEAR::isError($res) ) {
            return $REQ->getResponseBody();
        } else {
            return false;
        }
    }
}
?>

設置方法

/themes/system/entry/action.htmlを編集します。本来のACMS_POST_Entry_OpenモジュールをOpenTweetにしちゃってください。

<!-- ▼これを  -->
<input type="submit" name="ACMS_POST_Entry_Open" value="公開" />

<!-- ▼こんな感じに -->
<input type="submit" name="ACMS_POST_Entry_OpenTweet" value="公開してつぶやく" />

使用方法

いきなりエントリーを公開しちゃうと、このモジュールの出番がありません。既に作成してある非公開エントリーを、先ほど用意した"公開してつぶやく"ボタンで公開してください

継承してオーバーライド

これが何のサンプルかと言いますと、a-blog cmsのプログラムは現状すべてionCubeで暗号化されているため、既存の処理に割り込む余地が無いようにみえます。

PHP4対応だからこその荒技ですが、継承してメソッド上書きすれば、かなり部分で乗っ取りが可能です。追加したい処理を挟んだ上で、最後にきっちりparnet::post()してあげれば親のpostメソッドが起動して、本来の処理もきちんと完了します。

ファイルの配置とクラス名が対応しているので、素直に元のファイルを読んで、素直に継承するクラスを指定すれば大抵OKです。

物好きさんがいらっしゃいましたら、ぜひハックしてみてください。