LivedoorブログへAtomPubとPHPで外部投稿


Livedoor blogへAtomPub APIを使うと簡単に外部から投稿ができるので試してみた。2013年12月18日には、Basic認証に対応したのでさらに簡単になったが、公式サイトではPHPでの書き方が無いので、ここに記述。

1.「HTTP_Request2」をインストール

今回は、PEAR の「HTTP_Request2」を使って通信を行うので事前にインストールが必要。

サーバーにあるか確認する

pear list

「HTTP_Request2」と記載が無ければ、インストール

pear install HTTP_Request2

*phpの「openssl」が必要なので、インストールされているかも確認要!

php -m

2. Livedoor からAPI Keyを入手

管理画面のブログの設定から入手

api-key

 

ルートエンドポイント: https://livedoor.blogcms.jp/atompub/ブログID

AtomPub用パスワード: 初めての場合は発行する

3. PHPのコードを書いていく

接続と基本的な投稿

カテゴリ1つを追加した上で、タイトルと記事を投稿するコードになる。

require_once 'HTTP/Request2.php';
$pwd = 'AtomPub用パスワード';
$id = 'ライブドアID';
$url= 'https://livedoor.blogcms.jp/atompub/ブログID/article';

$title = 'テスト';
$text = '<p>テスト投稿です。</p>';
$cat = 'カテゴリ';
$body =
  '<?xml version="1.0"?>'.
  '<entry xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom">'.
  '<title type="text/html" mode="escaped">'.$title.'</title>'.
  '<content type="application/xhtml+xml">'.$text.'</content>'.
  '<category term="'.$cat.'"/>'.
  '</entry>';
try{
  $req = new HTTP_Request2();
  $req->setUrl($url);
  $req->setConfig(array('ssl_verify_host' => false,
                        'ssl_verify_peer' => false
                     ));
  $req->setMethod(HTTP_Request2::METHOD_POST);
  $req->setAuth($id, $pwd);
  $req->setBody($body);
  $req->send();
} catch (HTTP_Request2_Exception $e) {
  die($e->getMessage());
} catch (Exception $e) {
  die($e->getMessage());
}

説明

$url= 'https://livedoor.blogcms.jp/atompub/ブログID/article';

ルートエンドポイントのURLの後に、/articleを追記したものが接続先URLになる。編集をしたい場合は、さらにこの後に記事IDが付くURLになる。

$titleは、htmlなどコードがないものとしてそのまま記述される(上記コードでは、タグ類はエスケープする)。

$textは、HTML形式にしておくとよい。イメージなど(<img src=”… )等コードをはりつける際に全体がHTML形式になっていないと文字部分が消えることがある。

$body =
  '<?xml version="1.0"?>'.
  '<entry xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom">'.
  '<title type="text/html" mode="escaped">'.$title.'</title>'.
  '<content type="application/xhtml+xml">'.$text.'</content>'.
  '<category term="'.$cat.'"/>'.
  '</entry>';

上記の部分はコピペで使ってもらえば問題なし!

'<category term="カテゴリ1"/>'.
'<category term="カテゴリ2"/>'

カテゴリを追加したい場合は、上記のように追記すればよい。

  $req = new HTTP_Request2();
  $req->setUrl($url);
  $req->setConfig(array('ssl_verify_host' => false, //* 下記参照
                        'ssl_verify_peer' => false //* 下記参照
                     ));
  $req->setMethod(HTTP_Request2::METHOD_POST); //新規はPOSTで、編集はPUTになる。
  $req->setAuth($id, $pwd);
  $req->setBody($body);
  $req->send();

この部分が接続になる。setConfigの部分は特に必要ないが、もし下記のエラーがでて接続できない場合は記述する。(ただし、100%回避できない。)

Unable to connect to ssl://livedoor.blogcms.jp:443. Error: stream_socket_client(): unable to connect to ssl://livedoor.blogcms.jp:443 (Unknown error) 
stream_socket_client(): Failed to enable crypto 
stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:func(144):reason(134)

以上。画像を記事に埋め込みたい場合は、次の画像追加編のコードを上記のコードより先に実行し、画像URLを上記コード本文内へ埋め込む事になる。

注意点

  • HTTP_Requestは、2をインストールする。1は更新が終了。
  • コンテンツ内のHTMLは、xml文法通り間違いの無い様に記述する。”Requested XML is invalid.”の元になる。例えば、<br/>とする(<br>ではエラーと成る。<img … />も同様)
  • 上記は2013/12/18リリースの新AtomPub APIです。Livedoor公式ページはこちら

LivedoorブログへAtomPubとPHPで外部投稿」への2件のフィードバック

  1. snm

    とても参考になりました

    できれば「続きを書く」の記事追記部分についても教えて頂きたいのですが、いかがでしょうか?

    返信
  2. 猫一 投稿作成者

    snmさん
    残念ながら、公式サイトでも記載されていますが、このAPIは現状では、「「続きを書く」及び「プライベート」部分の投稿・編集」についてサポートされていません。

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>