第一个新浪微博应用
我开发的第一个新浪微博应用“蟹爪消息导入”,已经通过新浪审核了,就像应用页面所说的一样,是因为自己有这样的需求,所以干起来特别卖劲,从开始操起遗忘了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> </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> </p></td>
114 </tr>
115 </table>
116
117
update.php1 <?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 ?>