[转载]第一个新浪微博应用

[转载]第一个新浪微博应用_不同樊响_新浪博客.
我开发的第一个新浪微博应用“蟹爪消息导入”,已经通过新浪审核 了,就像应用页面所说的一样,是因为自己有这样的需求,所以干起来特别卖劲,从开始操起遗忘了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 ?> 
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏