はてなフォトライフにアップロードできない
PCのクリーンインストール後、スクリプトを使って、thunarの右クリックメニューから画像をはてなフォトライフにアップロードする仕組みが動かなくなった。ログを見ると認証エラー。pearのバージョン違いかと思ったが手がかりはなし。
それではと、ひとさまの作ったスクリプトを試してみた。
PHPでWSSE認証のメモ - おぎろぐはてな
pearを使っていないシンプルなスクリプトだけどやはり認証エラー。
悩んだ挙句、はてなのサイトを見て発見。
APIキーの代わりに、はてなアカウントのパスワードを使用することもできます。パスワードによるWSSE認証は非推奨であり、2014年3月5日で終了する予定です。
ああ、そうですか。パスワード認証を使っていた上記のスクリプトをAPI_KEYを使うように書き換えてみたらちゃんと認証。自分の使っていたスクリプトも修正してみたら動いた。
たまたま仕様変更とPCの再インストールが重なったということでございました。
スクリプトは以下の通り。元々はどなたかのスクリプトを改造したもんだけど、オリジナルが不明。ごめんなさい。
#!/usr/bin/php <?php #美乳 error_reporting(E_ALL); require_once 'HTTP/Request.php'; $hatena_username = 'doroyamada'; $hatena_apikey="nanchara"; array_shift($argv); foreach($argv as $file){ upload_fotolife($file); } function upload_fotolife($file,$subject=""){ #フォトライフにapiでアップロード global $hatena_username,$hatena_apikey; $filenameinfo = pathinfo(strtolower($file)); switch($filenameinfo['extension']){ case "jpg": $mime = "jpeg"; break; case "png": $mime = "png"; break; case "gif": $mime = "gif"; break; default: return FALSE; } // WSSE Authentication $nonce = pack('H*', sha1(md5(time().rand()))); $created = date('Y-m-d\TH:i:s\Z'); $digest = base64_encode(pack('H*', sha1($nonce . $created . $hatena_apikey))); $wsse_text = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"'; $wsse_header = sprintf($wsse_text, $hatena_username, $digest, base64_encode($nonce), $created); $url = "http://f.hatena.ne.jp/atom/post"; //post $post_data = '<?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://purl.org/atom/ns#"> <title>'.$subject.'</title> <content mode="base64" type="image/'.$mime.'"> '. base64_encode(file_get_contents($file)) .' </content> </entry>'; $request = new HTTP_Request($url); $request->setMethod(HTTP_REQUEST_METHOD_POST); $request->addHeader('X-WSSE', $wsse_header); $request->setBody($post_data); if (PEAR::isError($request->sendRequest())) { die('request failed'); } $res_code = $request->getResponseCode(); $res_body = $request->getResponseBody(); file_put_contents(uniquetime()."fotolife.log",$res_body); sleep(1); preg_match('/type=\"text\/html\" href=\"([^\"]+)"\/>/',$res_body,$temp1); $url = $temp1[1]; system("firefox $url"); } function uniquetime(){ return dirname(__FILE__). "/log/".date('YmdHis'); } ?>