本サイト/記事は移転しました。

約10秒後にリダイレクトします。

はてなフォトライフにアップロードできない

 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');
	
}
?>