有一个很简单的需求,我想把自己的微博的内容输出到我的网站上。本以为是个很简单的事情,结果折腾了一晚上。
首先想到使用新浪微博,因为平常自己用的就是新浪微博。网上有很多关于新浪微博的API开发,首先就找到了dudu站长的分享: 第一步是要申请账号: 现在申请已经不需要发邮件了。非常简单,申请成为开发者,然后创建应用,填写正确的邮箱地址,马上就收到App Key了。
拿到这个Key后,没有照dudu的代码试一遍,因为其介绍的是发布内容到微博,而我的要求是获取微博内容到网站。 文章下面推荐使用: ,下载之后便可以直接使用了。里面有个示例代码,修改web.config中的appkey后可以直接运行。
点击连接按钮后,弹出窗口,需要授权。
授权完成后,即可调用相关方法,返回也没有问题,可以成功输出。
本以为皆大欢喜,但总觉得哪里不对,是“授权”!每次登录都会弹出这该死的授权页面。
尝试按照dudu文章里面的代码,结果总是报错:
反复查找新浪的开发指南,始终没找到方法,又去了开发者论坛找: 有与我碰到同样问题的朋友,不过也没有解决办法。
不过得到几个关键信息:
1.使用oAuth是一定会弹出授权页面的。
2.basic登录已经不开放了。
3.oauth2.0授权有效期是24小时。
4.用户名密码方式需要申请。
几个有用的帖子:
实在想不到什么好办法了,只好继续搜索。
beer提供了一种方法获取RSS: 不过这个方法我没有试。
新浪的路看来是走不通了,抱着侥幸的心理试试腾讯的微博。
类似的方法进行开发者申请,同样是创建应用后通过邮件收到appKey.阅读开发文档的时候有个让我眼前一亮的东东:RSS/JSONP输出。
需要登录访问,可以直接获取两种方式的调用地址:
如我的:
直接输入浏览器中即可出现jsonp的数据(要多刷新几次)。这不正是我想要的东东吗?本以为万事大吉,想通过jquery的getJSON()轻松获取:
$.getJSON("http://v.t.qq.com/output/json.php", { type: "2", name: "dragonice", sign: "fa46dfdc668d42faf78b11193ea12db7ec207678" }, function (db) { var msg = ""; for (var i = 0; i < db.data.length; i++) { msg += "" + db.data[i].content + "
"; } document.getElementById('weibo').innerHTML = msg; } );
结果死活得不到数据。不甘心,可能是json和jsonp不同,找到一篇文章:通过ajax()来尝试:
$.ajax({ url: "http://v.t.qq.com/output/json.php?type=2&name=dragonice&sign=fa46dfdc668d42faf78b11193ea12db7ec207678", type: "GET", dataType: "JSONP", success: function (db) { alert("a"); var msg = ""; for (var i = 0; i < db.data.length; i++) { msg += "" + db.data[i].content + "
"; } document.getElementById('weibo').innerHTML = msg; } });
没有成功(有时会报weiboData()没有定义的错误。)。反反复复试了N次,还是不成功。装个chrome浏览器(chrome确实比ie9快,MS怎么这么不给力啊!)。调试后发现数据得到了,但是处理不正确。整了N久还是不行。本来想放弃算了,还是求助了下Google,结果发现了这个:
微薄正在加载中
一段代码就搞定了。
其实有种方法一直想试,但是没js调用没成功,怎么都不甘心。尝试一下发现是可以的:
string url = "http://v.t.qq.com/output/json.php?type=2&name=dragonice&sign=fa46dfdc668d42faf78b11193ea12db7ec207678"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "application/x-www-form-urlencoded"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("UTF-8")); string retString = myStreamReader.ReadToEnd(); Response.Write(retString);