1. 程式人生 > >PHP+新浪微博開放平臺+新浪雲平臺(SAE)開發微博應用——PHP SDK中Demo程式簡析

PHP+新浪微博開放平臺+新浪雲平臺(SAE)開發微博應用——PHP SDK中Demo程式簡析

PHP SDK中Demo程式簡析

接下來,需要逐步學會編寫PHP程式碼完成相應的功能了。即使將來你用的不是PHP,也不妨瞭解一下,將微博開發中的一些機理深入一些後再作打算。

不會PHP還能做出剛才的應用,是件值得驕傲的事。我們已經解決了整個開發過程的大事。不過,稍微驕傲一下就行了。不懂PHP至少不能作為榮耀的事。

言歸正傳,我們通過PHP SDK中Demo程式的剖析,來初步瞭解一個PHP微博應用的程式碼結構。

1、PHP SDK中的程式碼

在PHP SDK中提供的幾個PHP檔案如下圖所示。


將程式碼部署到SAE後,執行應用首先執行的是index.php。

index.php中的程式碼是:

<?php
session_start();
//if( isset($_SESSION['last_key']) )header("Location: weibolist.php");
include_once( 'config.php' );    
include_once( 'weibooauth.php' );
$o = new WeiboOAuth( WB_AKEY , WB_SKEY  );
$keys = $o->getRequestToken();
$aurl = $o->getAuthorizeURL($keys['oauth_token'] ,false , $_SERVER['SCRIPT_URI'].'/callback.php');
$_SESSION['keys'] = $keys;
?>
<a href="<?=$aurl?>">UseOauth to login</a>

啟動session後,先將config.php檔案包含進來。

config.php檔案中的程式碼是:

<?php
define( "WB_AKEY" , '2101372524' );
define( "WB_SKEY" ,'fa9f5111e317a942b895532b1f73837b' );
?>
config.php的作用就是將建立微博應用中得到的AppKey和App Secret值分別由WB_AKEY和WB_SKEY儲存。正如index.php中隨後的程式碼所示:
$o = new WeiboOAuth( WB_AKEY , WB_SKEY  );

WB_AKEY和WB_SKEY被用於建立一個WeiboOAuth物件。開發的第三方應用,使用的是OAuth授權,關於OAuth授權的流程在新浪微博開放平臺裡有很清晰完整的介紹。

接著,用

$keys = $o->getRequestToken();

獲取未授權的Request Token,然後請求使用者授權Token

 $_SESSION['keys'] = $keys;

$aurl = $o->getAuthorizeURL($keys['oauth_token'] ,false , 'http://localhost/callback.php');

注意到程式碼中的“http://localhost/callback.php”,是一個稱作為回撥的頁面,隨著index.php中設定的連結:

<a href="<?=$aurl?>">UseOauth to login</a>

由使用者點選,認證過程由callback.php頁面完成。

callback.php中的程式碼是:

<?php
session_start();
include_once( 'config.php' );
include_once( 'weibooauth.php' );
$o = new WeiboOAuth( WB_AKEY , WB_SKEY , $_SESSION['keys']['oauth_token'], $_SESSION['keys']['oauth_token_secret'] );
$last_key = $o->getAccessToken(  $_REQUEST['oauth_verifier'] ) ;
$_SESSION['last_key'] = $last_key;
?>
授權完成,<a href="weibolist.php">進入你的微博列表頁面</a>

這部分程式碼不再詳述,在搞清OAuth授權之前,這些程式碼可以暫時不求甚解(不過終究要明白,不管以後是不是用PHP開發),直接使用,上面的幾個檔案也不必修改。另外,上面幾個檔案中涉及到向session中寫入值,這是為以後頁面中的會話而設定的。

最後,“進入你的微博列表頁面”連結將引向執行weibolist.php。

weibolist.php是我們的應用執行的時最關心的程式碼。下面分段簡述:

<?php
session_start();
include_once( 'config.php' );
include_once( 'weibooauth.php' );
$c = new WeiboClient( WB_AKEY , WB_SKEY ,$_SESSION['last_key']['oauth_token'] ,$_SESSION['last_key']['oauth_token_secret'] );
$ms  =$c->home_timeline(); // done
$me = $c->verify_credentials();
?>

例項化WeiboClient物件後,用$c->home_timeline();獲取了當前登入使用者及其所關注使用者的最新微博,存入$ms,用$c->verify_credentials();驗證當前微博使用者身份的合法性,並將使用者資訊存入$me。

下面是換頭像的表單:

<h2><?=$me['name']?> 你好~ 要換頭像麼?</h2>
<form action="weibolist.php" >
  <inputtype="text" name="avatar" style="width:300px"value="頭像url" /> 
  <inputtype="submit" />
</form>
傳送新微博的表單
<h2>傳送新微博</h2>
<form action="weibolist.php" >
  <inputtype="text" name="text" style="width:300px" /> 
  <inputtype="submit" />
</form>

傳送圖片微博的表單:

<h2>傳送圖片微博</h2>
<form action="weibolist.php" >
   <inputtype="text" name="text" style="width:300px" value="文字內容"/>
   <inputtype="text" name="pic" style="width:300px"value="圖片url" /> 
   <inputtype="submit" />
</form>

處理表單請求的仍然是weibolist.php,下面是處理程式碼:

<?php
if( isset($_REQUEST['text']) ||isset($_REQUEST['avatar']) )
{
  if(isset($_REQUEST['pic']) )
         $rr= $c ->upload( $_REQUEST['text'] , $_REQUEST['pic'] );
  elseif(isset($_REQUEST['avatar']  ) )
         $rr= $c->update_avatar( $_REQUEST['avatar'] );
  else
         $rr= $c->update( $_REQUEST['text'] );  
         echo"<p>傳送完成</p>" ;
}
?>

$c ->upload( $_REQUEST['text'] ,$_REQUEST['pic'] )傳送了帶圖片的微博;

$c->update_avatar( $_REQUEST['avatar']);修改了頭像;

$c->update( $_REQUEST['text'] );傳送的是純文字的微博。

這些工作都是通過WeiboClient物件$c完成的。

下面的程式碼通過foreach迴圈將取到的當前登入使用者及其所關注使用者的最新微博逐條地顯示出來。

<?php if( is_array( $ms ) ): ?>
<?php foreach( $ms as $item ): ?>
  <divstyle="padding:10px;margin:5px;border:1px solid #ccc">
    <?=$item['text'];?>
  </div>
<?php endforeach; ?>
<?php endif; ?>

顯示微博時,僅顯示了每條微博的文字部分。這樣的微博你願意看嗎?不知道是哪位好友發的,看不到好友的情況,看不到微博中給人深刻映像的圖片……

別怨天尤人了,一切掌握在自己手中,我們先嚐試著將Demo擴充一下,以求更多體驗。

2、擴充Demo

新浪微博開放平臺提供了API文件(http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2),目前用的是第2版(V2)。這個文件提供了開發中用到的介面的說明,不管用什麼語言開發,這些內容總是要非常熟悉的。

請在新浪微博開放平臺中找到API文件的連結,稍加瀏覽,我們將結合需求,一邊查文件,一邊對Demo進行擴充。

在weibolist.php,當前登入使用者及其所關注使用者的最新微博是通過$c->home_timeline();獲得的。在API文件V2的讀取介面部分找到statuses/home_timeline條目,點選連結瀏覽對該條目詳細解釋的頁面。

在稍靠後的地方,有返回值的“欄位說明”:

返回值欄位

欄位型別

欄位說明

idstr

string

字串型的微博ID

created_at

string

建立時間

id

int64

微博ID

text

string

微博資訊內容

source

string

微博來源

favorited

boolean

是否已收藏

truncated

boolean

是否被截斷

in_reply_to_status_id

int64

回覆ID

in_reply_to_user_id

int64

回覆人UID

in_reply_to_screen_name

string

回覆人暱稱

mid

int64

微博MID

bmiddle_pic

string

中等尺寸圖片地址

original_pic

string

原始圖片地址

thumbnail_pic

string

縮圖片地址

reposts_count

int

轉發數

comments_count

int

評論數

annotations

array

微博附加註釋資訊

geo

object

地理資訊欄位

user

object

微博作者的使用者資訊欄位

回想輸出$ms中的每一條微博的程式碼:

<?php foreach( $ms as $item ): ?>
  <divstyle="padding:10px;margin:5px;border:1px solid #ccc">
    <?=$item['text'];?>
  </div>
<?php endforeach; ?>

原來我們僅僅是用<?=$item['text'];?>輸出了微博的文字部分,用的是text欄位。我們還能用created_at顯示建立時間,用id顯示微博,用XXX_pic獲取各種圖片的地址。

採用模仿的方式,下面把這段程式碼修改為:

<?php foreach( $ms as $item ): ?>
  <divstyle="padding:10px;margin:5px;border:1px solid #ccc">
      <?=$item['text'];?>   <!//正文>
     (發文時間: <?=$item['created_at'];?>)<br>
      <?php
        $ori_img=$item['original_pic'];
        if($ori_img)
        {
          echo "<ahref='".$ori_img."'> <imgsrc='".$item['thumbnail_pic']."'></a>";
        }
     ?>
  </div>
<?php endforeach; ?>

如下圖所示,顯示的微博中有了發文時間和圖片,點選小圖片還能通過連結看到大圖片。


再看“欄位說明”的表格,微博作者的使用者資訊欄位user的型別是object。因此,為了在顯示博文時將作者的有關情況輸出,我們需要知道表示微博作者的user物件的結構。

還是回到API文件V2頁面,找到“使用者介面”部分的users/show條目,我們看到user物件原來有如此多的欄位(屬性)。

返回值欄位

欄位型別

欄位說明

id

int64

使用者UID

screen_name

string

使用者暱稱

name

string

友好顯示名稱

province

int

使用者所在地區ID

city

int

使用者所在城市ID

location

string

使用者所在地

description

string

使用者描述

url

string

使用者部落格地址

profile_image_url

string

使用者頭像地址

domain

string

使用者的個性化域名

gender

string

性別,m:男、f:女、n:未知

followers_count

int

粉絲數

friends_count

int

關注數

statuses_count

int

微博數

favourites_count

int

收藏數

created_at

string

建立時間

following

boolean

當前登入使用者是否已關注該使用者

allow_all_act_msg

boolean

是否允許所有人給我發私信

geo_enabled

boolean

是否允許帶有地理資訊

verified

boolean

是否是微博認證使用者,即帶V使用者

allow_all_comment

boolean

是否允許所有人對我的微博進行評論

avatar_large

string

使用者大頭像地址

verified_reason

string

認證原因

follow_me

boolean

該使用者是否關注當前登入使用者

online_status

int

使用者的線上狀態,0:不線上、1:線上

bi_followers_count

int

使用者的互粉數

status

object

使用者的最近一條微博資訊欄位

我們用$item['user']可以獲得微博作者物件,於是通過下面的程式碼:

<?php if( is_array( $ms ) ): ?>
  <?phpforeach( $ms as $item ): ?>
   <divstyle="padding:10px;margin:5px;border:1px solid #ccc">
     <imgsrc="<?=$item['user']['profile_image_url'];?>"><!//頭像>
     <ahref="<?=$item['user']['url']; ?>"><?=$item['user']['id'];?>:<?=$item['user']['name']; ?>
        </a><br>  <!//暱稱及連結> 
    <?=$item['text'];?>  <!//正文>
     (發文時間:<?=$item['created_at'];?>)<br>
    <?php
       $ori_img =$item['original_pic'];
       if($ori_img)
        {
         echo "<a href='".$ori_img."'> <imgsrc='".$item['thumbnail_pic']."'></a>";
        }
     ?>
  </div>
  <?phpendforeach; ?>
<?php endif; ?>

顯示的微博中,加入了微博作者的頭像、ID和暱稱,點選暱稱還可以連結到他的主頁上,如下圖所示。


再完善一下。

在weibolist.php中,使用微博應用的主人資訊僅在下面一句程式碼中顯示了個暱稱。

<h2><?=$me['name']?> 你好~ 要換頭像麼?</h2>

實際上,這兒的$me也是個user物件。我們將<?=$me['name']?>刪除,而在這一段程式碼前加入:

<imgsrc="<?=$me['profile_image_url'];//我的頭像?>">
<?=$me['id']; ?>:<?=$me['name']; //暱稱 ?> 【<?=$me['description'];//暱稱 ?>】
粉絲數:<?=$me['followers_count'];?>     
關注數:<?=$me['friends_count'];?>     
微博數:<?=$me['statuses_count'];?>     
收藏數:<?=$me['favourites_count'];?><br>
<?=$me['friendships']['friends']['ids'];?>

顯示的頁面換為如下圖所示。效果已經大大改觀。


作者不能再講下去了,聰明的讀者應該繼續改進下去。將這樣的學習形成習慣,構思、查閱資料、改進,再構思……

中間一定會出現些障礙,一一解決後,柳暗花明。

這是一種精神。