tohokuaikiのチラシの裏

技術的ネタとか。

PEARのServices_Twitterのupdate_profile_imageでどハマリこいた件

Services_Twitter、使いやすいんですが、プロフィール画像の変更で大いにはまりました。

いやぁ、こんなの

<?php
$twitter = new Services_Twitter();
/* ここにOAuthのしょりごちょごちょ */
$twitter->account->update_profile_image(array('image' => $new_icon));

で余裕だぜ・・・とか思ってました。

それまでも、ツイート更新したり、ユーザー情報を持ってきたりできてたので。

ところが、これやってみるとResponseがこれですよ。

Could not authenticate with OAuth

むきーってなって、色々やってたら

500 Internal Server Error

ですよ。

TwitterのAPI仕様書とか見まくって、ほんでもわからなくって、ついなびからアイコン交換とかやってみて、交換できて「わー、おれがTwitterから嫌われているの?」とか思ったりして、試行錯誤したわけです。そんなことしてたら、「フジロック行きます!」のアイコンになっちゃって、「フジロック行くんですか!??」とかいわれたり。。。いや、行きませんから。。。。


困ってる人は他にも見つけられて
http://yamasan-diary.blogspot.com/2010/08/twitterupdateprofileimage-500.html
とか。

http://blog.cheki.net/archives/1613
では、HTTP_Request2::detectMimeType()のContent-Typeが画像対応して無いとダメよっていうから

<?php
        // images
        if (preg_match('/\.(jpe?g|png|gif)$/i', $filename, $m)){
            $type = strtolower($m[1]);
            if ($type == 'jpg') $type = 'jpeg';
            $info = 'image/'.$type;
        }

して加えたんだけど、ダメ。




ほんで、しょーがないなーって・・・でも、OAuthの部分をイチから書くのは面倒なので、

<?php
include_once 'HTTP/OAuth/Consumer/Request.php';
$req = new HTTP_Request2();

// Use the same instance of HTTP_Request2
$consumerRequest = new HTTP_OAuth_Consumer_Request;
$consumerRequest->accept($req);
$this->oauth->accept($consumerRequest);

$uri = 'http://api.twitter.com/1/account/update_profile_image.json';
$params = array();

$method = "POST";
$req->addUpload('image', $new_icon);
$response = $this->oauth->sendRequest($uri, $params, $method);

ってやったわけです。(Services_Twitter::sendOAuthRequest()からのほぼパクリ)
そしたら・・・。なんと、動くわけです。やたー。



どこが悪いのかなーって、ちろっとソース見ててなんとなく
pear/Services/Twitter.php

<?php
    protected function sendOAuthRequest($uri, $method, $params, $files)
    {
        include_once 'HTTP/OAuth/Consumer/Request.php';
        try {
            $request = clone $this->getRequest();

このcloneしてる部分があやしいなーって。思って
$request = new HTTP_Request
とかしてみたのですが、うまくいかず。


なんなんだろう?

ま、いいや。