[PHP]如何用程式刊登文章到 Google Blogger/blogspot 部落格

How To Post To Blogger with PHP?

以下將說明如何用 PHP 程式去刊登文章到 Google 的 blogspot 部落格. 在程式中我們會用到 Zend Framework 函式庫 (library) 的功能, 然後透過 Google blogger 之 feeds 介面來刊登文章到 Google blogspot 部落格; 文章中我們也嘗試將為 class SimpleCRUD 範例程式新增一個函式以更方便文章刊登.

註1: 原始介紹 Blogger API 的網頁請見本文最底下所列之參考文件[1].

第一步: 取得 Zend Framework 函式庫 (library)

請到 Zend Google Data APIs client library 頁面去下載 Zend Framework 函式庫, 目前的版本是 Zend Gdata 1.10.8 .

以下範例下載的是 tar.gz 封裝, 假設我們要將整個函式庫放在 /usr/local/lib/ZendGdata/library/ 目錄裡:

mv ZendGdata-1.10.8.tar.gz /usr/local/lib/ZendGdata/library/
cd /usr/local/lib/ZendGdata/library/
tar zxvf ZendGdata-1.10.8.tar.gz
ln -s ZendGdata-1.10.8.tar.gz ZendGdata

第二步: 取得範例程式

可以在這裡下載到 範例程式 Blogger.php

第三步: 修改範例程式

我不喜歡原始範例程式的使用方法, 另外原始範例程式是展示了 列表 刊登 刪除 …等各種操作, 但是目前想要的只有刊登功能, 所以將整個原有程式做了小修改, 並且將它存成一個 PHP 檔案做為獨立的 PHP 函式庫來使用. 修改過後的檔案可以在這裡下載: blogger.func.php

我們需要在範例程式中設定 Zend Framework 函式庫的路徑, 如下:

<?php
    set_include_path('/usr/local/lib/ZendGdata/library/');

    //@ .....(略).....
?>

為了更方便刊登文章, 以下我們在原有的 class SimpleCRUD 範例程式中新增了一個函式 – selectCachedBlogIdByName() :

<?php
set_include_path('/usr/local/lib/ZendGdata/library/');

//@ .....(略).....

class SimpleCRUD
{
    /**
    * $blogID - Blog ID used for demo operations
    *
    * @var string
    */

    public $blogID= NULL;  //@ jjdai
    public $aBlogIdArr = array();  //@ jjdai

    //@ .....(略).....

    /**
    *  Select the cached BlogID by blog title.
    */

    //@ jjdai
    public function selectCachedBlogIdByName($sInName, $iInDebug=0)
    {
        if ( ! isset($this->aBlogIdArr[$sInName]) )
        {
            //@ Try to build the name-ID array
            $oQuery = new Zend_Gdata_Query('http://www.blogger.com/feeds/default/blogs');
            $oQuery->setMaxResults(10000);  //@ 如果你有太多本部落格的話, 需要這一行
            $oFeed = $this->gdClient->getFeed($oQuery);

            if ( 0 < $iInDebug )
            {
                echo "\$sInName=$sInName\n";
                $this->printFeed($oFeed);
            }

            $iI = 0;
            foreach ( $oFeed->entries as $oEntry )
            {
                //id text is of the form: tag:blogger.com,1999:user-blogID.blogs
                $aIdText = explode('-', $oFeed->entries[$iI]->id->text);

                $this->aBlogIdArr[$oEntry->title->text] = $aIdText[2];

                $iI++;
            }

            if ( 0 < $iInDebug )
            {
                var_dump($this->aBlogIdArr);
            }
        }

        if ( ! isset($this->aBlogIdArr[$sInName]) )
        {
            return FALSE;  //@ Something was worng.
        }

        $this->blogID = $this->aBlogIdArr[$sInName];

        return TRUE;
    } //@ selectCachedBlogIdByName()

    //@ .....(略).....

}  //@ SimpleCRUD class
?>

selectCachedBlogIdByName() 函式的第一個參數 $sInName 是給予某一本部落格的標題名稱; 第二個參數 $iInDebug 用於除錯, 當傳入數值大於 0 時會印出所有部落格本群的標題. 當第一次呼叫 selectCachedBlogIdByName() 函式時會去取得所有部落格本群的 BlogId 然後將它們暫存起來, 之後的 selectCachedBlogIdByName() 函式呼叫則直接從暫存的快取中取得, 不用再透過網路存取取得, 這對於有很多本部落格並且要刊登多篇文章的人來說可以增加不少刊登速度.

第四步: 使用 blogger.func.php 的新的範例程式

blogger.func.php 中只留下原有範例程式的 SimpleCRUD 類別 和 getInput() 函式, 使用 SimpleCRUD 類別的新的範例程式如下:

<?php
    require_once 'blogger.func.php';

    //@登入部落格, 給予帳號和密碼
    $oCrud = new SimpleCRUD('zhupiter@gmail.com', 'ThisIsThePassPara');

    //@ 假設部落格名稱是 'Zhupiter', 嘗試去選取該部落格
    $bRet = $oCrud->selectCachedBlogIdByName('Zhupiter', $iDebug);
    if ( FALSE == $bRet )
    {
        if ( 0 < $iDebug )
        {
            echo "沒有對應這個名稱 [Zhupiter] 的部落格.\n";
        }
        return 1;
    }

    //@ 設定文章標題和文章內容
    $sTitle   = '文章標題';
    $sContent = '這裡是文章內容, 可以含有 <strong>HTML</strong> 語法.';

    //@ 嘗試刊登文章到部落格
    $sPostId = $oCrud->createPost($sTitle, $sContent, FALSE);
    if ( 0 < $iDebug )
    {
        echo "\$sPostId=$sPostId\n";
    }

    return 0;
?>

特別要注意:
透過 Google blogger 之 feeds 介面用程式去刊登 Blogger 部落格時, 某一本 Blogger 部落格一天最多只能刊登 48 篇文章 (也就是每半小時一篇), 超過的話該帳號的 feeds 介面會被停用, 隸屬於該帳號的所有部落格本都會不能再用程式去刊登 Blogger 部落格!!


關鍵字: 刊登Blogger, 刊登blogspot, post Blogger, post blogspot, Publishing a blog post, Zend Framework, Google Blogger, blog feeds,Zend Google Data APIs client library

參考文件:
[1] Blogger APIs (Labs), Developer’s Guide: PHP

你喜歡這篇文章嗎? 馬上分享它:

無相關文章.

This entry was posted in PHP, 實作 and tagged , , , , . Bookmark the permalink.

6 Responses to [PHP]如何用程式刊登文章到 Google Blogger/blogspot 部落格

  1. momo says:

    您好:我照著您的方法!!但程序跑完!!沒有出現任何錯誤!!但blog還是沒有新增任何文章!!
    我摸不清楚到底哪邊出了問題!!是否可以請您撥空賜教!!
    謝謝!!

    • cctai says:

      你好,

      看看 selectCachedBlogIdByName() 函式的傳回數值是不是 TRUE,不是的話,那就表示遇到狀況了。

      請開啟 debug 模式,你就會看到一些運作的細節:
      在執行「$bRet = $oCrud->selectCachedBlogIdByName(‘Zhupiter’, $iDebug);」之前, 多加上這一行「$iDebug = 1;」,就可以啟用 selectCachedBlogIdByName() 函式的除錯模式,看看其運作狀況是不是你預期的。 (也可以直接將 selectCachedBlogIdByName() 函式 改成大於 0 的數字,例如: selectCachedBlogIdByName(‘Zhupiter’, 1) 即可)

      再不行的話,我的建議還是土法煉鋼,多印出一些訊息看看哪一步驟不是你預期的。

    • cctai says:

      一直想再回應但是都一直忘了。。。。。 :Q

      如果 blog 的標題 “非” 全部都是英文+數字的話,那 php 程式必須: (我假設該 blog 是採用 UTF-8 當做 charset)
      1. 存成 UTF-8 ,或;
      2. 存成 ACSII 格式的話要用 $sBlogTitle = iconv(“Big5″, “UTF-8″, $sBlogTitle) 轉成 UTF-8 才能用來當做selectCachedBlogIdByName() 函式的第一個參數。

      這樣才會比對得到相對應的那一本 blog。

      • momo says:

        您好!!感謝你的回覆!!感激不盡~~
        我已經測試成功了!!謝謝~~
        但目前有碰到一個問題!!
        如何將新增的文章加上標籤呢???
        Blogger API中有提供這個功能嗎??
        期待您的回覆!!

  2. Pingback: Blogger要怎麼發文啊 | a port of heart

Leave a Reply