前回(アメブロのAtomAPIが倒せない)の記事から数カ月。。
アクセス解析見てもやっぱり同じように困ってる人がいるみたい。

というわけで、久しぶりに調べ直した。
前回のソースと違う部分をピックアップ。
やっぱりWSSE認証がポイントでした。これさえ通ればあとはすんなり。


$nonce = sha1(md5(time()));


ランダム文字生成だから何でもいいとは思うけど。


$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.strtolower(md5($password)))));


ここが全然逆だった。
大文字にするんじゃなくて小文字にする。


あとはgetで記事情報を取得し、その結果からpostするURLをとって記事を投げるみたい。

今回使用したソース。
<?php
require_once 'cURL.php';

$atomapi_url = "http://atomblog.ameba.jp/servlet/_atom/blog";

$user_id = "USERID";
$password = "PASS";

$created = date('Y-m-d\TH:i:s\Z');
$nonce = sha1(md5(time()));
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.strtolower(md5($password)))));

$wsse =
    'UsernameToken Username="'.$user_id.'", '.
    'PasswordDigest="'.$pass_digest.'", '.
    'Nonce="'.base64_encode($nonce).'", '.
    'Created="'.$created.'"';

$headers = array("X-WSSE" => $wsse);

$curl = new Curl();
$curl->headers = $headers;
$res = $curl->get($atomapi_url);

//投稿するURLを取得
$xml = simplexml_load_string($res->body);
$postUrl = (string) $xml->link[0]->attributes()->href;

//記事作成。タグも使える。
$title = "テスト";
$text = '<b>テスト投稿</b>';

$rawdata = sprintf('
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://purl.org/atom/ns#"
xmlns:app="http://www.w3.org/2007/app#"
xmlns:mt="http://www.movabletype.org/atom/ns#">
<title>%s</title>
<content type="application/xhtml+xml">
<![CDATA[%s]]>
</content>
</entry>
',$title,$text);

$curl = new Curl();
$headers = array(
              "X-WSSE" => $wsse,
              "Content-Type" => "application/x.atom+xml",
              );
$curl->headers = $headers;
$curl->options = array("POSTFIELDS" => $rawdata);
$res = $curl->post($postUrl);


参考にさせていただいたサイトはこちら。
http://senpai4.blog29.fc2.com/blog-entry-452.html