2012/09/03

PHPでアメブロに新規投稿する(関数)

PHPからアメブロに投稿する必要があって、メール投稿が簡単そうだからと試してみたけど、やっぱり携帯じゃないとダメっぽい。

ということで調べてみると、どうやらAtomを使って投稿できるらしい。
いくつか調べて、動かないソースもいくつかあったので、2012年9月3日時点で動く(動作確認済み)のものを。


参考元: http://blog.livedoor.jp/j_yuze/archives/51523327.html

<?php

define('AMEBA_USER','userID');//アメブロログインユーザーID
define('AMEBA_PASS','password');//アメブロログインパスワード


function post_ameblo($title,$body){
 $atom="http://atomblog.ameba.jp/servlet/_atom/blog";
 $created = date('Y-m-d\TH:i:s\Z');
 $nonce = sha1(md5(time()));

 $header  = 'X-WSSE: ';
 $header .= 'UsernameToken Username="'.AMEBA_USER.'", ';
 $header .= 'PasswordDigest="'.base64_encode(pack('H*', sha1($nonce.$created.strtolower(md5(AMEBA_PASS))))).'", ';
 $header .= 'Nonce="'.base64_encode($nonce).'", ';
 $header .= 'Created="'.$created.'"';
 
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $atom);
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $res = curl_exec($ch);
 curl_close($ch);
 
 
 preg_match('/rel="service.post" type="application\/x\.atom\+xml" href="(.*?)"/',$res,$url);
 
 if(empty($url[1])){
  trigger_error(__FUNCTION__.': can\'t get post url.');
  return false;
 }
 
 $data  = '<?xml version="1.0" encoding="utf-8"?>'."\n";
 $data .= '<entry xmlns="http://purl.org/atom/ns#" ';
 $data .= 'xmlns:app="http://www.w3.org/2007/app#" ';
 $data .= 'xmlns:mt="http://www.movabletype.org/atom/ns#">'."\n";
 $data .= '<title>'.htmlspecialchars($title).'</title>'."\n";
 $data .= '<content type="application/xhtml+xml">'."\n";
 $data .= '<![CDATA['.$body.']]>'."\n";
 $data .= '</content>'."\n";
 $data .= '</entry>'."\n";

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url[1]);
 curl_setopt($ch, CURLOPT_HEADER, false);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $res = curl_exec($ch);
 curl_close($ch);
 
 return $res;
}
?>

使うときは以下。(返り値は投稿後のリターンXML)
<?php
post_ameblo('記事タイトル','記事本文');
?>


でも、これだと記事のカテゴリ(アメブロでいう「テーマ」)は選択できない
これはまだ未解決なので、もしご存知な方がいればコメントにて教えていただけると助かります。