第一个新浪微博应用

第一个新浪微博应用

我开发的第一个新浪微博应用“蟹爪消息导入”,已经通过新浪审核了,就像应用页面所说的一样,是因为自己有这样的需求,所以干起来特别卖劲,从开始操起遗忘了N年的PHP和JS,利用闲暇时间完成这个应用,用了不到一个星期的时间,最开始通过dome入手到熟悉流程开发花2天时间,后来开发就比较顺了,主要是百度加实现。


作者最开始用的微博是饭否,结果饭否莫名其妙关闭了,接着找到的是和饭否最相似的蟹爪,而且支持饭否的导入。

后来新浪微博开测了,作者也开始使用,觉得不错就一直用新浪微博了,不过作者有收集癖好,希望所有的微薄都能集合在一起,正好新浪微博有开放平台,所以就有了这个应用。

如果你也和作者一样有收集癖,正好和作者使用的微薄一样轨迹,不妨试试也把饭否和蟹爪微薄导入到新浪微博。


想要做一个新浪微博应用,首先要到新浪微博开放平台创建账户,可以参照新手指南操作,这里有一个问题,创建应用时需要填写一个“应用地址”,对于没有主机资源的普通开发者来说,这是一个问题。但是如果你使用PHP开放的话,这里推荐SAE(Sina App Engine)


SAE是Sina App Engine(新浪应用引擎)的缩写,SAE是一个分布式web应用开发运行的服务平台,其不仅仅包含创建、部署web应用的简单交互,更涉及一整套大规 模分布式服务的解决方案。用户通过SAE可以方便的创建web应用、定制web应用、开发web应用、部署web应用、切换线上版本、删除应用,大大节省 了开发者的开发成本和运维成本。


SAE注册需要邀请码,否则只能注册体验用户,体验用户只能试用5天,过期后删除账户和所有代码,当然,你可以在5天内开发完代码,申请转正,或者再重新注册体验用户。

在SAE里创建一个应用,然后在代码管理里新建一个版本,这样就可以开始开发了。

第一个新浪微博应用

SAE使用SDK工具进行代码上传了,其实叫SDK工具有些勉强,明明现在只是个上传工具加强版。

第一个新浪微博应用

PHP开发先可以参考这两篇文章:《用于微博开放平台OAuth的lib SaeT上线了》《SaeT lib升级,原SaeT Class改名为SaeTOAuth,新增SaeTClient》。然后下载dome上传测试一下。

Demo使用教程
1. 下载,然后解压,修改config.php中的key
2. 打开index.php,将13行最后一个url改成你网站对应的callback.php的url
3. 上传到PHP空间即可


注意index.php页面回调页面的地址必须正确,特别是注意版本号。否则就会报如下错误:


 Error_code: 400; Error: 40022:Error: source paramter(appkey) is missing? 

如果你是通过http://xiezhua.sinaapp.com访问时,回调页面就应该是http: //xiezhua.sinaapp.com/callback.php;如果你是带版本号http://1.xiezhua.sinaapp.com访问时,回调页面就应该是http://1.xiezhua.sinaapp.com/callback.php。

当初出现这个问题调试了很久,到群里问大多都说是App Key和App Secret不正确,因为从错误描述只能这么猜测。我估计是跨域丢失引起的问题。

Dome调通后,后面实现就比较容易了。

主要碰到下面几个问题:
1.SAE上传文件比较麻烦,我用textarea替换了。
2.新浪微博API不允许频繁调用,估计是为了防止垃圾内容。后来我用了JS的timeout控制每30秒通过AJAX发送一次。
3.IE和FF Ajax兼容时出现乱码问题,通过encodeURI(url)进行控制。

下面是代码实现。

index.php


1 <?php
2

 3 session_start();

 4 if( isset($_SESSION['last_key']) ) header("Location: weibolist.php");

 5 include_once( 'config.php' );

 6 include_once( 'saet.ex.class.php' );

 7 

 8 

 9 

10 $o = new SaeTOAuth( WB_AKEY , WB_SKEY  );

11 

12 $keys = $o->getRequestToken();

13 $aurl = $o->getAuthorizeURL( $keys['oauth_token'] ,false , 'http://' . $_SERVER['HTTP_APPNAME'] . '.sinaapp.com/callback.php');

14 

15 $_SESSION['keys'] = $keys;

16 

17  header("Location: ".$aurl);

18 ?>

19 <a href="<?=$aurl?>">Use Oauth to login</a> 
callback.php

1 <?php
2

 3 session_start();

 4 include_once( 'config.php' );

 5 include_once( 'saet.ex.class.php' );

 6 

 7 

 8 $o = new SaeTOAuth( WB_AKEY , WB_SKEY , $_SESSION['keys']['oauth_token'] , $_SESSION['keys']['oauth_token_secret']  );

 9 

10 $last_key = $o->getAccessToken(  $_REQUEST['oauth_verifier'] ) ;

11 

12 

13 $_SESSION['last_key'] = $last_key;

14 

15 header('Location: xiezhua.php');

16 ?> 
xiezhua.php

 1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2 <style type="text/css">

 3 * {

 4  font-size : 12px;

 5  color: #4682B4;

 6 }

 7 body{background-color:#ddf3f7;}

 8 table{

 9  background-color:#FFF;

10 }

11 .pic

12 {

13 background-color: #71cae0;

14 display: block;

15 padding-top: 4px;

16 padding-right: 4px;

17 padding-bottom: 4px;

18 padding-left: 4px;

19 }

20 .button {

21  width: 400px;

22 }

23 .ok {

24  color: green;

25 }

26 .err {

27  color: red;

28 }

29 </style>

30 <table width="800" border="0" align="center" cellpadding="5" cellspacing="0">

31   <tr>

32     <td colspan="2"><img src="xiezhuaimp00.gif"alt="蟹爪消息导入" /><img src="xiezhuaimp01.gif" alt="蟹爪消息导入" /></td>

33   </tr>

34   <tr>

35     <td width="400" valign="top" hegth="600">

36 

37   <textarea name="xz" id="xz" cols="65" rows="20" ></textarea><br><br>

38 导入的格式是第一行是蟹爪的消息,第二份是消息发布时间,依此类推。??<br><br>

39 好吧,其实不一定是蟹爪的消息,只要符合格式都可以导入。这个你懂的。<br><br>

40   <input class="button" name="sb" text="" value="OK,我明白了,开始导入" type="button" onclick="update()">

41 

42   <p>&nbsp;</p>

43 <script type="text/javascript">

44 var list = new Array();

45 function update()

46 {

47          var text = document.getElementById("xz").value;

48  var xz = text.split("\n");

49   var status = "";

50  for(i=0;i<xz.length;i++){       

51          if(i%2==0){

52                  status += xz[i];                    

53          }else{

54                  status += "  [??¥è?aè?1??a " + xz[i] +"]";                                                 

55                  list[list.length] = status;                      

56                  status = "";                         

57          }           

58  }

59  timeout();

60 }

61 

62 function timeout(){ 

63  document.getElementById("log").innerHTML += insert(list.shift());

64  if(list.length > 0)

65          setTimeout(timeout, 30*1000);

66 }   

67 

68 function isFF(){

69  return navigator.userAgent.indexOf("Firefox")!=-1;

70 }

71 function isIE(){

72  return navigator.appName.indexOf("Microsoft Internet Explorer")!=-1 && document.all;

73 }

74 

75 

76 function insert(status){

77  var xmlHttp;

78          

79   if(isFF())

80   {  

81          xmlHttp = new XMLHttpRequest();

82   }else if(isIE())

83   {

84       xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');

85   }else{

86                  alert("暂不支持其他浏览器,请用IE、FireFox");

87   }

88   

89   var url="update.php?status="+status;

90   url = encodeURI(url);  

91  xmlHttp.open("POST",url,false);

92  xmlHttp.send(null);      

93  return xmlHttp.responseText;      

94 }

95  

96 </script>

97  <div id="log"></div>

98   </td>

99     <td width="400" valign="top">

100     <div>

101     作者最开始用的微博是饭否,结果饭否莫名其妙关闭了,接着找到的是和饭否最相似的蟹爪,而且支持饭否的导入。<br><br>

102     后来新浪微博开测了,作者也开始使用,觉得不错就一直用新浪微博了,不过作者有收集癖好,希望所有的微薄都能集合在一起,正好新浪微博有开放平台,所以就有了这个应用。<br><br>

103 如果你也和作者一样有收集癖,正好和作者使用的微薄一样轨迹,不妨试试也把饭否和蟹爪微薄导入到新浪微博。

104     </div>

105     <p></p>

106     <p><strong>第一步</strong>:登陆你的蟹爪,进入设置菜单,通过消息导出。

107     <p><img class="pic" src="help01.jpg"/></p>

108     <p><strong>第二步</strong>:将下载的文本打开,把内容复制到左边的输入框内(为什么不用上传?因为实现比较麻烦,反正只用一次,作者又太懒了,您就将就一下)。</p>

109     <p><img class="pic" src="help02.jpg"/></p>

110     <p><strong>第三步</strong>:开始导入了,去喝杯茶吧。(为什么要那么长时间?为避免出现“发微博太多了,休息一会吧”的新浪提示,所以现在定的时间是30秒导入一条,新浪至今也没公布发送频率多少算垃圾信息,所以您就耐心点开个网页挂机就好了。)</p>

111     <p><img class="pic" src="help03.jpg"/></p>

112     <p></p>    

113     <p>&nbsp;</p></td>

114   </tr>

115 </table>

116 

117  
update.php

1 <?php
2

 3 session_start();

 4 include_once( 'config.php' );

 5 include_once( 'saet.ex.class.php' );

 6 

 7 //Statuses/update

 8 header("content-type:text/html; charset=utf-8"); 

 9 $c = new SaeTClient( WB_AKEY , 

10                       WB_SKEY , 

11                       $_SESSION['last_key']['oauth_token'] , 

12                       $_SESSION['last_key']['oauth_token_secret']  );

13 $status = $_GET['status'];

14 //$status = urldecode($status);

15 //$status = iconv('gbk', 'utf-8',$status); 

16 echo ($status);

17 $msg = $c->update($status);

18 if ($msg === false || $msg === null){

19  echo (' <span class="err">发送失败</span><hr/>');

20 }else if (isset($msg['error_code']) && isset($msg['error'])){

21  echo (' <span class="err">发送失败 '.$msg['error_code'].' '.$msg['error']+"</span><hr/>");

22 }else{

23  echo(' <span class="ok">发送成功</span><hr/>');        

24 }

25 //echo($msg['id']." : ".$msg['text']." ".$msg["created_at"]);

26 ?> 

posted @ 2010-12-03 11:46  vanuan  阅读(220)  评论(0编辑  收藏  举报