PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——PHP SDK中Demo程序简析

PHP+新浪微博开放平台+新浪云平台(SAE)

——新浪微博应用开发的一个解决方案



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'];?>

显示的页面换为如下图所示。效果已经大大改观。


作者不能再讲下去了,聪明的读者应该继续改进下去。将这样的学习形成习惯,构思、查阅资料、改进,再构思……

中间一定会出现些障碍,一一解决后,柳暗花明。

这是一种精神。


评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值