このページへ検索して辿り着かれた方はご存じの通り、アメブロのAtomAPIが仕様変更しました。

私の作ったプログラムも動かなくなってしまい、どうしたものか途方に暮れていた時、

http://ameblo.jp/miumiu3tek/entry-11712246664.html

の記事へ辿り着きました。

この記事を読んでも解決せず、ブログの管理人様へ教えを請うべく直接メールを送りました。管理人様は、お忙しい 中、丁寧に教えて下さいました。

皆さんもお困りだと思いますので、管理人様に許可を頂いた上で、動くコードを公開します。

是非参考にして下さい。

HTTP_Requestのインストール

以下のコードを利用するには、HTTP_Requestが必要です。他ページでは、PEARがどうのこうのって書いてますが、このパッケージだけあれば動きます。

http://pear.php.net/package/HTTP_Request/download

よりダウンロードして解凍すると、「HTTP_Request-***」 というフォルダーが出現しますが、フォルダー名を「HTTP」にして、以下のコードファイルをアップロードするフォルダーへアップロードして下さい。

新規でブログに投稿するコード

<?php
//文字コードはutf8で保存!

ame_toko(“<アメブロID>”,”<アメブロパス>”);

function ame_toko($id,$pass){

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

$user_id  = $id;
$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.'”‘;

$pear_path = realpath(“HTTP/Request.php”);
require_once($pear_path);
$hr = new HTTP_Request($atomapi_url);
$hr -> addHeader( ‘X-WSSE’,$wsse );
$hr -> sendRequest();
$res = $hr -> getResponseBody();

preg_match(‘/rel=”service.post” type=”application\/x\.atom\+xml” href=”(.*?)”/’,$res,$postURl);

$title = “テスト”;

$text =<<<EOD

テスト投稿です<br />
<br />
テストですよ。<br />

EOD;

$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);

$hr = new HTTP_Request($postURl[1]);
$hr->addHeader(‘X-WSSE’,$wsse );
$hr->addRawPostData($rawdata);
$hr->addHeader(‘Content-Type’, ‘application/x.atom+xml’);
$hr->setMethod(HTTP_REQUEST_METHOD_POST);
$hr->sendRequest();
$c = $hr -> getResponseCode();
$hr->clearPostData();

header(‘Content-Type: text/html; charset=UTF-8’);
print(“201が返ってきたら成功:$c”);

}

?>

既に投稿されている最新記事を、編集するコード

<?php
//文字コードはutf8で保存!

ame_toko(“<アメブロID>”,”<アメブロパス>”);

function ame_toko($id,$pass){

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

$user_id  = $id;
$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.'”‘;

$pear_path = realpath(“HTTP/Request.php”);
require_once($pear_path);
$hr = new HTTP_Request($atomapi_url);
$hr -> addHeader( ‘X-WSSE’,$wsse );
$hr -> sendRequest();
$res = $hr -> getResponseBody();

preg_match(‘/rel=”service.post” type=”application\/x\.atom\+xml” href=”(.*?)”/’,$res,$postURl);

//フィード取得
$hr = new HTTP_Request($postURl[1]);
$hr -> addHeader( ‘X-WSSE’,$wsse );
$hr -> sendRequest();
$hr -> getResponseCode();
$res = $hr -> getResponseBody();

if(!$res){return;}

$xml =new SimpleXMLElement($res);

if($xml->entry){
foreach($xml->entry as $entry){

$entry_dat = $entry;
$title     = $entry_dat->title;
$time      = $entry_dat->issued;
$edit_url  = $entry_dat->link[1][‘href’];
$content   = $entry_dat->content;

break;

}

}

$text =<<<EOD
<p>
編集済み
</p>
EOD
.
$content;

$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>
<issued>%s</issued>
</entry>
‘,$title,$text,$time);

$hr = new HTTP_Request($edit_url);
$hr->addHeader(‘X-WSSE’,$wsse );
$hr->addRawPostData($rawdata);
$hr->addHeader(‘Content-Type’, ‘application/x.atom+xml’);
$hr->setMethod(‘PUT’);
$hr->sendRequest();

$c = $hr -> getResponseCode();
$hr->clearPostData();

header(‘Content-Type: text/html; charset=UTF-8’);
print(“200が返ってきたら成功:$c”);

}

?>

スポンサー

お問い合わせ

この記事についてご質問があれば、お問い合わせ下さい。

お名前(必須)
お名前フリガナ(必須)
メールアドレス(必須)
メールアドレス確認(必須)
お問い合わせ記事URL
お問い合わせ内容(必須)