Last-modified: 2012-05-14 (月) 02:24:13
Pukiwiki/更新の度にツイートしたい

概要

当サイト(Pukiwiki)を更新するたびに、タイトルと更新ページの短縮URLをツイートする機能を追加してみます。
短縮URLは、Services_ShortURLを使用し、bit.lyにて作成します。
ツイートは、twitteroauthを使用します。
ツイート機能の実現には、PHP+OAuthでTwitter - SDN Projectが参考になります。

手順1 実行環境準備

Services_ShortURLのインストールやtwitteroauthのダウンロード、各種登録などを行います。
公式サイトのDependenciesに記載がありませんでしたが、Services_ShortURLを動かすにはPHPでcurlが有効にしておく必要があるようです。curlが無効のときは動作せず、有効にしたら動作しました。無効ならば、PHPをコンパイルし直してください。

  1. Services_ShortURLをインストールします。
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
      8
    
    -
    |
    |
    !
     
     
    -
    !
    
    # Services_ShortURLに必要なものが不足している場合は、先に入れます
    # 先に「pear install Services_ShortURL-0.1.0」を実行してみて、エラーになったものを入れていきます
    # 私の場合は、以下のものが不足していました
    pear install Net_URL2-0.3.1
    pear install HTTP_Request2-0.5.2
     
    # Services_ShortURLをインストール
    pear install Services_ShortURL-0.1.0
  2. twitteroauthをダウンロードします。
    https://github.com/abraham/twitteroauth
  3. 解凍して出来たtwitteroauthフォルダ(中身はOAuth.phpとtwitteroauth.php)を任意の場所へアップロードします。
    私は、<Pukiwikiルート>/lib以下にしました。
  4. 短縮URLにBit.lyを使用するので、アカウントを取得します。
    WS000000.PNG
  5. アカウントが取得できたら、以下のURLへアクセスしてAPI Keyを控えます。
    http://bit.ly/a/your_api_key
  6. OAuth認証でツイートするために、登録を行います。
    http://dev.twitter.com/apps/
    WS000001.PNG
  7. アプリケーション名や説明、サイトURLなど適宜設定します。
    今回は、Pukiwiki上から実行するので、[アプリケーションの種類]は、「ブラウザアプリケーション」にしました。
    また、[標準のアクセスタイプ]は、ツイートするので「Read & Write」にしました。
  8. 登録したアプリの詳細画面へ移動します。
    ここに[Consumer key]と、[Consumer secret]値が記載されているので、控えます。
  9. 次に[My Access Token]を選択した先のページにて、[Access Token]、[Access Token Secret]を控えます。
    WS000002.PNG
  10. 以上で準備完了です。

手順2 コード追加

更新処理を行う<Pukiwikiルート>/lib/file.phpのpage_writeに追加する形で実現します。

  1. <Pukiwikiルート>/lib/file.phpを開きます。
    以下の関数を追加します。先ほど控えたAPI Keyなどを設定します。
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
    
    <?php // [$head $title $url]というフォーマットでツイートします
    // [$head $title]部分が100文字に収まるようにトリムします
    // $urlはbit.lyを使用して短縮します
    // 引数は全てUTF-8を想定しています
    function announce_tweet($head, $title, $url)
    {
        require_once('Services/ShortURL.php');
        require_once('twitteroauth/twitteroauth.php');
        
        // [$head $title]部分
        $msg = mb_substr("{$head} {$title}", 0, 100, 'UTF-8');
        
        // $urlが空でなければ、URLを短縮
        if (!empty($url))
        {
            Services_ShortURL::setServiceOptions('Bitly', array(
                'login'  => '<bit.lyのユーザー名>',
                'apiKey' => '<bit.lyのAPI Key>'
            ));
            $api = Services_ShortURL::factory('Bitly');
            $msg .= ' ' . $api->shorten(rawurlencode($url));
        }
        
        $consumer_key = "<twitterへ登録したアプリのConsumer key>";
        $consumer_secret = "<twitterへ登録したアプリのConsumer secret>";
        $access_token = "<twitterへ登録したアプリのMy Access Token>";
        $access_token_secret = "<twitterへ登録したアプリのAccess Token Secret>";
        // OAuthオブジェクト生成
        $to = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
        // ツイート
        $req = $to->OAuthRequest('https://twitter.com/statuses/update.xml', 'POST', array(
            'status' => $msg
        ));
    } ?>
  2. page_writeに追加した関数を呼び出すコードを追加します。
    Pukiwiki UTF-8版を使用していますが、file.phpのエンコーディングはShift_JISでした。
    なので、このファイル内で文字列を定義すると、Shift_JISエンコードの文字列となるようです。
    しかし、mb_check_encodingで確認すると、$pageにはUTF-8エンコードで、ページタイトルが入っていました。
    今回追加した部分に関しては、UTF-8で統一することにしたので、announce_tweetに渡す文字列を、あらかじめShift_JISからUTF-8へ変換しています。
    また、当サイトは閲覧用と更新用でサブドメインを分けており、ツイートするサブドメインは常に閲覧用のものにしたいので、小賢しいことをして$guest_urlを作成しています。
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
    
    <?php // Put a data(wiki text) into a physical file(diff, backup, text)
    function page_write($page, $postdata, $notimestamp = FALSE)
    {
        global $trackback;
     
        if (PKWK_READONLY) return; // Do nothing
     
        $postdata = make_str_rules($postdata);
     
        // Create and write diff
        $oldpostdata = is_page($page) ? join('', get_source($page)) : '';
        $diffdata    = do_diff($oldpostdata, $postdata);
        file_write(DIFF_DIR, $page, $diffdata);
     
        // Create backup
        make_backup($page, $postdata == ''); // Is $postdata null?
     
        // Create wiki text
        file_write(DATA_DIR, $page, $postdata, $notimestamp);
     
        if ($trackback) {
            // TrackBack Ping
            $_diff = explode("\n", $diffdata);
            $plus  = join("\n", preg_replace('/^\+/', '', preg_grep('/^\+/', $_diff)));
            $minus = join("\n", preg_replace('/^-/',  '', preg_grep('/^-/',  $_diff)));
            tb_send($page, $plus, $minus);
        }
     
        links_update($page);
        
        // 更新情報をツイート
        $head = mb_convert_encoding('更新しました。#vok ', 'UTF-8', 'SJIS');
        $guest_url = mb_convert_encoding('http://vok.paburica.com/index.php?', 'UTF-8', 'SJIS') . rawurlencode($page);
        announce_tweet($head, $page, $guest_url);
    } ?>
  3. file.phpをアップロードします。
  4. 実際にページの更新を行い、ツイートされるか、URLはアクセス可能かなどを確認します。
    日本語を含むURL、半角スペースを含むURLなどでも確認したほうが無難です。

検証時の環境

参考