アメブロへ楽天APIなどの情報を自動で投稿する

アメブロへ楽天APIなどの情報を自動で投稿する

WebAPIアメブロへ楽天APIなどの情報を自動で投稿する

技術者ならではの発想なのかもしれませんが、楽天や Yahoo が提供している API を使って取得した情報を、頑張って整形して、ブログの記事をせっせと書いている人が多いことに気付いた数年前。これを全部自動化してしまえば効率いいのになって思い、プログラムを作成してヒッソリと運用してきました。

ただ、そんな小手先の運用が成功するわけもなく、これまでに楽天や Yahoo の API を使った完全自動化アフィリエイトでは、月に 4 万円を稼ぐのが精一杯でした。まあ、完全自動化で自分の時間を消費しないのであれば十分なのかもしれませんが、要するにブログ記事の内容や、狙えるキーワード選定までは自動化できていなかったのが大きな原因なのでしょう。まあ、ここまで自動化するのは難しいので、皆さん時間を掛けて頑張っているのでしょうけど・・・。

そんな昔から運用しているソースコードも PHP4.3 や 4.4 が主流だった頃のものであり、PHP5.3 が主流になりつつある今ではバッドノウハウも多くなってきたので、ここら辺で公開して、活用できる人に使ってもらえればいいかなっと思ってメモがてら残しておきます。

楽天市場商品検索API

まずは、楽天の API から商品情報を取得するクラス。このクラスには API のリクエスト URL を引数で渡す仕様としています。もっと効率のいい XML パーサーがあるし、そもそも API からのエラー処理を省いているのが良くないですね。

リクエスト URL は条件に合わせて 楽天ウェブサービス のサイトを参考に作成して下さい。

<?php

    class S_Rakuten {

        const CREDIT_RAKUTEN = '<!-- Rakuten Web Services Attribution Snippet FROM HERE --><a href="http://webservice.rakuten.co.jp/" target="_blank"><img src="http://webservice.rakuten.co.jp/img/credit/200709/credit_4936.gif" border="0" alt="楽天ウェブサービスセンター" title="楽天ウェブサービスセンター" width="49" height="36"/></a><!-- Rakuten Web Services Attribution Snippet TO HERE -->';

        private $cnt;
        private $arrItem;
        private $apiUrl;

        function __construct($apiUrl) {
            $this->cnt = 0;
            $this->arrItem = array();
            $this->apiUrl = $apiUrl;
        }

        function requestRest() {
            // REST
            $data = file_get_contents($this->apiUrl);
            $xml = @simplexml_load_string($data);

            if ($xml !== FALSE && !empty($xml)) {

                $items = $xml->Items->Item;
                $this->cnt = $xml->hits;

                if ($this->cnt > 0) {
                    foreach ($items as $item) {
                        $tmpItem = array();
                        $tmpItem["itemUrl"] = (string)$item->itemUrl;
                        $tmpItem["itemName"] = (string)$item->itemName;
                        $tmpItem["itemPrice"] = (string)$item->itemPrice;
                        $tmpItem["itemCaption"] = preg_replace('!{.*?}!is', '', (string)$item->itemCaption);
                        $tmpItem["affiliateUrl"] = (string)$item->affiliateUrl;
                        $tmpItem["mediumImageUrl"] = (string)$item->mediumImageUrls->imageUrl;
                        $tmpItem["smallImageUrl"] = (string)$item->smallImageUrl->imageUrl;
                        $tmpItem["shopName"] = (string)$item->shopName;
                        $tmpItem["reviewCount"] = (string)$item->reviewCount;
                        $tmpItem["reviewAverage"] = (string)$item->reviewAverage;
                        $tmpItem["postageFlag"] = (string)$item->postageFlag;
                        $tmpItem["pointRate"] = (string)$item->pointRate;
                        array_push($this->arrItem, $tmpItem);
                    }
                }
            }
        }

        function makeRankingTag() {

            $html = '';

            if (count($this->arrItem) > 0) {

                foreach ($this->arrItem as $l) {
                    if (!empty($l['mediumImageUrl'])) {
                        $body = [htmlを作成];
                    }
                }

                $html .= self::CREDIT_RAKUTEN;
            }

            return $html;
        }

        function getCount() {
            return $this->cnt;
        }

        function getItems() {
            return $this->arrItem;
        }
    }
?>

アメブロへAtom-XMLで投稿

上記のクラスで html に加工したデータを取得したら、それをアメーバブログに投稿します。ブログ記事の投稿を受け取るサービスは公開されていて、XML-PRC がまだまだ主流のブログサービスが多い中、アメブロの場合は Atom-XML を採用しています。下記の関数に、ブログの記事タイトルと本文、そしてブログの ID とパスワードを渡せば投稿ができます。

これは確か、アメブロのブログを参考にさせてもらったと記憶しています。そこに Curl のエラー処理をオリジナルで追加しました。

function ameba($title, $text, $user_id, $user_pass) {

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

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

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

    $ameHeader = "X-WSSE: " . $wsse;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $atomapi_url);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_HTTPHEADER,array($ameHeader));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, '[アメブロに対応したもの]');
    $res = curl_exec($ch);
    curl_close($ch);

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

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

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postURl[1]);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER,array($ameHeader));
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$rawdata);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    $res = curl_exec($ch);
    curl_close($ch);

    return $res;
}

自動投稿用の参考プログラム

これらを利用する php スクリプトを簡単に書いてみると、下記のような感じになります。ジャンルや値段範囲などの条件も追加できますが、キーワードだけでもランダムに発行するだけで自動化できちゃいます。

<?php

    $param = array(
        'applicationId' => RAKUTEN_API_DEV_ID,
        'affiliateId'   => RAKUTEN_API_AFF_ID,
        'keyword'       => $keyword,
        'genreId'       => $genreId,
        'minPrice'      => $minPrice,
        'maxPrice'      => $maxPrice,
        'format'        => 'xml',
        'hits'          => $hits,
        'sort'          => $sort,
    );

    $apiUrl = http://[楽天APIのURL]/? . http_build_query($param);

    $objRakuten = new S_Rakuten($apiUrl);
    $objRakuten->requestRest();
    $html = $objRakuten->makeRankingTag();

    $title = 'ブログ記事タイトル';
    $user_id = 'アメブロのID';
    $user_pass = 'アメブロのパスワード';

    $res = ameba($title, $html, $user_id, $user_pass);

    if ($res) {
        // 成功
    } else {
        // 失敗
    }
?>

サーバに設定するシェルスクリプト

最後に、このスクリプトを cron に登録して、後は放置でいいと思いますが、実際にこれでブログが流行る流行らないは別として、こういった手法を応用して、もっと画期的なものができるといいですね。

シェルは単純にこんな感じ。(動作確認していません)

$ vi hogehoge.sh

#!/bin/sh

BIN_DIR="/home/hogehoge/bin"
PHP="/usr/local/php"

${PHP} ${BIN_DIR}/hogehoge.php

あとは cron で 10 分間隔で実行。毎回、キーワードをランダムに取得するなど、いろいろ手を加えてみて下さい。

$ crontab -e

*/10 * * * * /home/hogehoge/bin/hogehoge.sh > /dev/null 2>&1

最終更新日:

関連記事

人気記事

新着情報