CakePHP で簡単に Twitter にツイートできるコンポーネント TsubuyakiComponent

CakePHP で簡単に Twitter にツイートできるコンポーネント TsubuyakiComponent というのを作成しました。TsubuyakiComponent を使うには Consuming OAuth-enabled APIs with CakePHP なども必要です。

本記事では TsubuyakiComponent の具体的な使い方や仕様についてまとめています。始めて使う方は本記事を参考に実装してみてください。

TsubuyakiComponent

定数に Twitter の API キーなどを入力してください。Google の API キーは URL の短縮に使用するものです。このキーが入力されていなくても URL の短縮はなされます。URL の短縮は投稿の際の文字数が多い時に行われます。URL も含めて140文字以内で収まる場合は 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class TsubuyakiComponent extends Component
{
    const
        TWITTER_CONSUMER_KEY = '',
        TWITTER_CONSUMER_SECRET = '',
        TWITTER_ACCESS_TOKEN = '',
        TWITTER_ACCESS_TOKEN_SECRET = '',
        GOOGLE_APIKEY = '';
 
    public function twitter_post($head_text, $message, $url)
    {
        App::import('Vendor', 'OAuth', array('file' => 'OAuth/OAuthClient.php'));
        $consumer = new OAuthClient(self::TWITTER_CONSUMER_KEY, self::TWITTER_CONSUMER_SECRET);
        $post_message = $this->shorten_message($head_text, $message, $url);
        return $consumer->post(self::TWITTER_ACCESS_TOKEN, self::TWITTER_ACCESS_TOKEN_SECRET, 'http://twitter.com/statuses/update.xml', Array('status' => $post_message)); 
    }
 
    private function shorten_message($head_text, $message, $url, $max_str = 140)
    {
        $head_num = mb_strlen($head_text);
        $title_num = mb_strlen($message);
        $url_num = mb_strlen($url);
        if(($head_num + $title_num + $url_num) < $max_str) {
            $tweet_text = $head_text . $message . ' ' . $url;
        } else {
            $shorten_url = $this->shorten_url($url);
            $url_num = mb_strlen($shorten_url);
            if(($head_num + $title_num + $url_num) < $max_str) {
                $tweet_text = $head_text . $message . ' ' . $shorten_url;
            } else {
                $max_limit = $max_str - $head_num - $url_num - 4;
                $tweet_text = $head_text . mb_substr($message, 0, $max_limit) . '... ' . $shorten_url;
            }
        }
        return $tweet_text;
    }
 
    private function shorten_url($url)
    {
        $curl = curl_init();
        if(self::GOOGLE_APIKEY === '') {
            $urlparam = '';
        } else {
            $urlparam = '?key=' . $this->setting['GOOGLE_APIKEY'];
        }
        curl_setopt($curl, CURLOPT_URL, 'https://www.googleapis.com/urlshortener/v1/url' . $urlparam);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, '{"longUrl":"' . $url . '"}');
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($curl);
        curl_close($curl);
        $json = json_decode($res);
        return $json->id;
    }
}

使い方

下記のようにコンポーネントを呼び出して、使いたい部分で以下のようにコンポーネントの twitter_post() を呼び出せば良いです。第一引数には先頭の文字「ブログを書きました」などです。第二引数にはメッセージ、ブログを投稿する場合はブログのタイトルがここに挿入されます。第3引数は URL です。

1
2
3
4
5
6
7
8
9
class TestController extends AppController
{
    public $components = Array('Tsubuyaki');
 
    public function index()
    {
        $this->Tsubuyaki->twitter_post('New blog post: ', 'This issue is according to our specification.', 'http://weble.org');
    }
}

おわりに

使い方で分からない事があれば質問してください。今後は Facebook への投稿機能も実装予定です。

コメント

コメントは受け付けていません。