LifeType 中文開發論壇

開發 => 外掛程式精華區 => 主題作者是: AlexD 於 十月 18, 2005, 12:56:10 下午



主題: [分享] 透過 XMLRPC 來管理PLog帳號和 Blog
作者: AlexD十月 18, 2005, 12:56:10 下午
之前在Mark兄的幫忙下, 寫了一些給 XMLRPC 呼叫來管理PLog 的帳號跟Blog 的功能, 現在與大家分享一下, 大概說明一下, 主要是提供[Add User], [Set Password], [Disable User], [Enable User],[Add Blog], [Disable Blog], [Enable Blog] 這幾個功能, 每個功能在呼叫時都必須傳入 Site Admin 的帳號和密碼, 確認是  Site Admin 才可以做這些事情, 我是直接拿 /plog/xmlrpc.php  這個程式來改的, 因為它已經將一些基本的工作都做好了, 在這個程式中  [config object][users object], [articles object][blog object] 都已經建好了, 在Function 中如果需要用到, 則直接利用 global $users, $articles, $blogsG; 這樣的語法就可以直接拿來用了, 蠻簡單的, 不過也是花了一些時間還有請教Mark兄才完成, 以下就是這些Code

// 新增 User
    function myaddUser($args){
        global $users;
        $adminname      = $args[0];  // Site Admin的帳號
        $adminpassword  = $args[1];  // Site Admin 的密碼
        $username       = $args[2];     //New User 帳號
        $userpassword   = $args[3];    //New User 密碼
        $email          = $args[4];          //New User EMail
        $aboutMyself    = $args[5];    //New User 的 AboutMyself
        $fullname       = $args[6];      //New User 的全名


        $erg = $users->getUserInfo(
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {
                        $newUserInfo=new UserInfo($username, $userpassword, $email, $aboutMyself, $fullname, 0, null, 0);
                        $UserID=$users->addUser($newUserInfo);
                        if ($UserID != -1) {
                                return sprintf( "%d", $UserID );
                        }
                        else {
                                return new IXR_Error(-1, 'Error where create a new user!');
                        }
                }
                else {
                        return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }



// 關閉 User
    function mydisableUser($args){
        global $users;
        $adminname      = $args[0];
        $adminpassword  = $args[1];
        $userID       = $args[2];           // 要關閉的 User 的ID

        $erg = $users->getUserInfo(
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {

                        $targetUser = $users->getUserInfoFromId (
                                $userID,
                                null
                        );

                        if ($targetUser != false) {                               
                                if(!($users->disableUser($userID))) {
                                    return new IXR_Error(-1, 'Error when disable the user!');
                                }
                                return true;
                        }
                        else {
                                return new IXR_Error(-1, 'This user doesn\'t exist!');
                        }
                }
                else {
                        return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }



//開啟 User
    function myenableUser($args){
        global $users;
        $adminname      = $args[0];
        $adminpassword  = $args[1];
        $userID       = $args[2];    //要開啟的User ID

        $erg = $users->getUserInfo(
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {

                        $targetUser = $users->getUserInfoFromId (
                                $userID,
                                null
                        );

                        if ($targetUser != false) {
                                $targetUser->setStatus(USER_STATUS_ACTIVE);
                                if(!($users->updateUser( $targetUser))) {
                                    return new IXR_Error(-1, 'Error when enable the user!');
                                }

                                return true;
                        }
                        else {
                                return new IXR_Error(-1, 'This user doesn\'t exist!');
                        }
                }
                else {
                        return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }


// 設定密碼
    function mysetPassword($args){
        global $users;
        $adminname      = $args[0];
        $adminpassword  = $args[1];
        $userID         = $args[2];        //要設定密碼的User ID
        $newpassword    = $args[3];   //新密碼

        $erg = $users->getUserInfo(
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {
                        $targetUser = $users->getUserInfoFromId (
                                $userID,
                                null
                        );

                        if ($targetUser != false) {
                                $targetUser->setPassword($newpassword);
                                if(!($users->updateUser( $targetUser))) {
                                    return new IXR_Error(-1, 'Error when update the user password!');
                                }
                                return true;
                        }
                        else {
                                 return new IXR_Error(-1, 'This user doesn\'t exist!');
                        }
                }
                else {
                        return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }


//新增 Blog
    function myaddBlog($args){
        global $users, $blogsG;
        $adminname   = $args[0];
        $adminpassword   = $args[1];
        $blog = $args[2];                 // New Blog 的名稱
        $owner = $args[3];              // New Blog 的Owner ID, 就是 User ID
        $about = $args[4];              // New Blog 的 About
        $erg = $users->getUserInfo( 
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {
                        $newBlogInfo=new BlogInfo($blog, $owner, $about, null, $id = -1 );
                        $newBlogId= $blogsG->addBlog($newBlogInfo);

                       // add a default category and a default post
                        $articlmyategories = new Articlmyategories();
                        $articlmyategory = new Articlmyategory( "General", "", $newBlogId, true );
                        $catId = $articlmyategories->addArticlmyategory( $articlmyategory );
                        $config =& Config::getConfig();
                        $locale =& Locales::getLocale( $config->getValue( "default_locale" ));
                        $articleTopic = $locale->tr( "register_default_article_topic" );
                        $articleText  = $locale->tr( "register_default_article_text" );
                        $article = new Article( $articleTopic,
                                    $articleText,
                                    Array( $catId ),
                                    $owner,
                                    $newBlogId,
                                    POST_STATUS_PUBLISHED,
                                    0,
                                    Array(),
                                    "welcome" );
                        $t = new Timestamp();
                        $article->setDateObjmyt( $t );
                        $articles = new Articles();
                        $articles->addArticle( $article );

                        if ($BlogID != -1) {
                                return sprintf( "%d", $newBlogId );
                        }
                        else {
                                return new IXR_Error(-1, 'Error when create a new blog!');
                        }
                }
                else {
                         return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }



//關閉 Blog
    function mydisableBlog($args){
        global $users, $blogsG;
        $adminname      = $args[0];
        $adminpassword  = $args[1];
        $blogID       = $args[2];   //要關閉的 Blog ID

        $erg = $users->getUserInfo(
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {
                        $targetBlog = $blogsG->getBlogInfo (
                                $blogID,
                                null
                        );

                        if ($targetBlog != false) {
                                if(!( $blogsG->disableBlog($blogID))) {
                                    return new IXR_Error(-1, 'Error when disable the blog!');
                                }
                                return true;
                        }
                        else {
                                return new IXR_Error(-1, 'This blog doesn\'t exist!');
                        }
                }
                else {
                        return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }



//開啟 Blog
    function myenableBlog($args){
        global $users, $blogsG;
        $adminname      = $args[0];
        $adminpassword  = $args[1];
        $blogID       = $args[2];  //要開啟的 BLog ID

        $erg = $users->getUserInfo(
            $adminname,
            $adminpassword
        );
        if ($erg != false)
        {
                if ($erg->isSiteAdmin()) {
                        $targetBlog = $blogsG->getBlogInfo (
                                $blogID,
                                null
                        );

                        if ($targetBlog != false) {
                                $targetBlog->setStatus(BLOG_STATUS_ACTIVE);
                                if(!($blogsG->updateBlog($targetBlog->getId(),$targetBlog))) {
                                    return new IXR_Error(-1, 'Error when enable the blog!');
                                }

                                return true;
                        }
                        else {
                                return new IXR_Error(-1, 'This blog doesn\'t exist!');
                        }
                }
                else {
                        return new IXR_Error(-1, 'Sorry! you are not the Site Admin.');
                }
        }
        else {
                return new IXR_Error(-1, 'You did not provide the corrmyt password');
        }
    }


在這個程式的最後一段, 再加上底下黑體的部份, 這樣就可以了

    if ($config->getValue("xmlrpc_api_enabled"))
    {
        $xmlrpc = new IXR_Server(
            array (
                "blogger.newPost"           => "newPost",
                "blogger.getUserInfo"       => "getUserInfo",
                "blogger.getPost"           => "getPost",
                "blogger.editPost"          => "editPost",
                "blogger.deletePost"        => "deletePost",
                "blogger.getRmyentPosts"    => "getRmyentPosts",
                "blogger.getUserInfo"       => "getUserInfo",

                "blogger.addUser"           => "myaddUser",
                "blogger.setPassword"       => "mysetPassword",
                "blogger.disableUser"       => "mydisableUser",
                "blogger.enableUser"       => "myenableUser",
                "blogger.addBlog"           => "myaddBlog",
                "blogger.disableBlog"       => "mydisableBlog",
                "blogger.enableBlog"       => "myenableBlog",


                "blogger.getUsersBlogs"     => "getUsersBlogs",
            "metaWeblog.newPost"        => "metaWeblogNewPost",
            "metaWeblog.editPost"       => "metaWeblogEditPost",
            "metaWeblog.getPost"        => "metaWeblogGetPost",
            "metaWeblog.getRmyentPosts" => "metaWeblogGetRmyentPosts",
            "metaWeblog.getCategories"  => "metaWeblogGetCategories",
            "metaWeblog.newMediaObjmyt" => "metaWeblogNewMediaObjmyt"
            )


補充說明,
1. 有關新增  Blog 的部份, 可以參考 pLog/class/action/admin/adminaddblogaction.class.php 這支程式
2. 有關加入新分類與文章的部分請參考 pLog/class/action/admin/adminaddblogaction.class.php
3. 原討論在 http://forum.lifetype.org.tw/index.php?topic=1255.0
4. 透過API 可以做很多事情, 但是還是要注意一下是否會跟原有設計概念有不一致的地方, 比方說密碼的長度要求, 或是新增一個 BLog 時, 也會要求給這個 Blog 一個分類和建立新的一篇文章等等
5. 如果需要寫 PHP 的 xmlrpc 的 Client, 可以參考  http://phpxmlrpc.sourceforge.net/, 下載下來解開後, 就可以拿裡面的 Sample 來改了, 我改了一個用來測試寫的程式對不對, 這邊也提供給大家參考(如下), 其中
       a. $f=new xmlrpcmsg('blogger.addUser'.... 對應的就是剛剛我們在程式最後一段加上去的給外面呼叫的 interface, 後面就是傳入的參數了, 一一對應上面 function 的參數
       b.  iconv("BIG5", "UTF-8",$HTTP_POST_VARS["aboutmyself"]) 是用來先將 BIG 5 轉成 UTF-8 的格式, 這樣傳入xmlrpc Server 端的程式時, 才不會有中文亂碼的問題


************************************************************************************

<?php
include("xmlrpc.inc");

if ($HTTP_POST_VARS["submit"]=="addUser")
{
    $f=new xmlrpcmsg('blogger.addUser',
    array(new xmlrpcval($HTTP_POST_VARS["adminname"], "string"),new xmlrpcval($HTTP_POST_VARS["adminpassword"], "string"),new xmlrpcval($HTTP_POST_VARS["username"], "string"),new xmlrpcval($HTTP_POST_VARS["userpassword"], "string"), new xmlrpcval($HTTP_POST_VARS["email"], "string"),new xmlrpcval(iconv("BIG5", "UTF-8",$HTTP_POST_VARS["aboutmyself"]), "string"),new xmlrpcval(iconv("BIG5", "UTF-8",$HTTP_POST_VARS["fullname"]), "string")));
    $c=new xmlrpc_client("/plog/plog-1.0.1/myAgent.php", "172.18.100.100", 80);
    $c->setDebug(0);
    $r=$c->send($f);
    $v=$r->value();
    if (!$r->faultCode())
    {
        print "New UserID ". $HTTP_POST_VARS["newusername"] . " is " .
        $v->scalarval() . "<BR>";
        print "<HR>I got this value back<BR><PRE>" .
        htmlentities($r->serialize()). "</PRE><HR>\n";
      }
    else
    {
        print "Fault: ";
        print "Code: " . $r->faultCode() .
        " Reason '" .$r->faultString()."'<BR>";
    }
}

print "<FORM  METHOD=\"POST\">
adminusername <INPUT NAME=\"adminname\" VALUE=\"${adminname}\">
<br>adminpassword <INPUT NAME=\"adminpassword\" VALUE=\"${adminpassword}\"><br><br>

username <INPUT NAME=\"username\" VALUE=\"${username}\"><br>
userpassword <INPUT NAME=\"userpassword\" VALUE=\"${userpassword}\"><br>
email <INPUT NAME=\"email\" VALUE=\"${email}\"><br>
aboutMyself <INPUT NAME=\"aboutmyself\" VALUE=\"${aboutmyself}\"><br>
full name <INPUT NAME=\"fullname\" VALUE=\"${fullname}\"><br><br>

<input type=\"submit\" value=\"addUser\" name=\"submit\">
</FORM><P>
enter a new user";
?>

************************************************************************************

6. 以上如果有不正確的地方還請各位先進不吝指教




主題: Re: [分享] 透過 XMLRPC 來管理PLog帳號和 Blog
作者: markwu十月 18, 2005, 07:25:03 下午
Hi Alex:

太謝謝您了!我把這篇文章移進精華區中。

這真的是經典的的 XMLRPC 擴充範例! (Y)

Mark


主題: Re: [分享] 透過 XMLRPC 來管理PLog帳號和 Blog
作者: AlexD十月 19, 2005, 08:18:59 上午
希望對有需要的人可以提供一些幫助   我只是貢獻小小的心力而已  :-)


主題: Re: [分享] 透過 XMLRPC 來管理PLog帳號和 Blog
作者: laughtosky十月 20, 2005, 05:47:49 下午
很有用~~
我慢慢x消化



主題: Re: [分享] 透過 XMLRPC 來管理PLog帳號和 Blog
作者: wangsan十一月 13, 2005, 01:29:27 下午
AlexD 兄:

很感謝您發表了這篇分享,這對我真是非常有用。
但是有些問題想請教,請能撥空說明一下,謝謝。

我是使用ASP.NET開發系統的,由於在系統內被要求必需有Blog的功能。
找來找去找到了這個pLog的程式,目前雖然已經架設起來了,但是一直在
煩腦如何將這個Blog與自己開發的系統作整合。今天無意發現了您所發表的文章,
這正是我所需要的。由於我對PHP只是懂得一點皮毛。(只會下載程式架設起來而已)

想請教的是:

1.是不是開啟在架好的blog目錄下的xmlrpc.php,然後將您所提供的幾個function,加入到該檔案裏面,
然後在該檔案底下的「$xmlrpc = new IXR_Server(......」內加入您所說的黑體的部份。

2.在ASP.NET中如何呼叫這些Function,來操作新增User...,等功能。

因為在您前一篇文章中您也提到,您也是要與ASP.NET開發的系統作整合的,所以才這問您。

謝謝
          


主題: Re: [分享] 透過 XMLRPC 來管理PLog帳號和 Blog
作者: AlexD十一月 14, 2005, 05:23:18 下午
我已經有回覆 PM 給您了,  但還是在這邊詳細說一下, 如果其它人也有需要, 可以參考一下,

您可以看一下 http://www.xml-rpc.net/, 這是給 ASP.NET 使用的 XML-RPC 的library,
它提供 XML-RPC client 和 XML-RPC Service 的 library, 我只有使用到 ASP.NET  來當 Client,
XML-RPC Service 就是 Copy 原來在架好的blog目錄下的xmlrpc.php 來改(Copy 成另外一個檔案"myAgent.php") ,
再加上我寫的程式, XML-RPC Server 端的部份就算完成了

然後, 為了避免開發時的複雜度, 我先用XML-RPC Server 所在的機器上,
寫個小小的範例在 PHP 上模擬  XML-RPC Client, 我有列在最後面,  你可以 Copy 那段到另外新的PHP 網頁, 
紅色的部份就是您可能要修改對應的地方
    $c=new xmlrpc_client("/plog/plog-1.0.1/myAgent.php", "172.18.100.100", 80);

而在它前一行主是要用來告知要呼叫遠端 Server  的那一個 interface還有要傳進去的參數, 參數的類型等等, 這個可以不需要修改,
這裡只有測試 blogger.addUser的功能是否正常而已,如果你想測試其他的功能, 可以在自行修改
   $f=new xmlrpcmsg('blogger.addUser',
    array(new xmlrpcval($HTTP_POST_VARS["adminname"], "string"),new xmlrpcval($HTTP_POST_VARS["adminpassword"], "string"),new xmlrpcval($HTTP_POST_VARS["username"], "string"),new xmlrpcval($HTTP_POST_VARS["userpassword"], "string"), new xmlrpcval($HTTP_POST_VARS["email"], "string"),new xmlrpcval(iconv("BIG5", "UTF-8",$HTTP_POST_VARS["aboutmyself"]), "string"),new xmlrpcval(iconv("BIG5", "UTF-8",$HTTP_POST_VARS["fullname"]), "string")));

測試如果OK,  您可以再由 ASP.NET  寫程式來取代上面這個 PHP Client 的程式, 參考  http://www.xml-rpc.net/ 的部份, 事實上,
這個也有範例程式, 您也可以拿一個 Client 的範例來改寫, 這樣可能會比較快

順便一提, 最好在XML-RPC Service的PHP 程式裡面去限制只有哪些 IP 可以連進來, 要不然如果放在 Public domain, 還是有可能會讓人入侵
如果還有問題, 歡迎提出來大家討論