以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种:

1.基于Oauth协议,使用Open API。(http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E)

2.使用Weibo JS-SDK(http://open.weibo.com/sdk/js )。

官方的方式总是显得很麻烦。我们来探讨一下,能不能通过非官方的方法,免AppKey、免认证、Ajax跨域调用新浪微博API呢?

Web 2.0时代,短链服务非常流行。新浪的短链服务域名是t.cn,这个域名实在是非常短,没办法更短了。

打开新浪微博API的官方文档,关于短链服务是这样的描述的:

以上列举的方法调用都大同小异。我们再以第一个方法short_url/shorten为例。打开详细说明:http://open.weibo.com/wiki/2/short_url/shorten

我们来分析一下这一段说明:

1.是否需要登录:否。这很关键,既然不需要登录,我们的“免认证”就好发挥了。

2.频次限制:是。这也很关键,这意味着如果我们按照官方的方式,调用次数将非常受限。

3.支持格式:JSON。其实根据实验,新浪微博不仅支持JSON,还支持JSONP,只是文档没告诉我们罢了。这也很关键。因为有了JSONP,就意味着可以方便的跨域了。

4.URL:https://api.weibo.com/2/short_url/shorten.json 。其实这也是骗人的。HTTPS必定会影响速度。经过实验,直接把HTTPS改为HTTP,仍然是OK的。

接下来逐个攻破难点。

一,使用JQuery+JSONP跨域。

参考文档:http://baike.baidu.com/view/2131174.htm

Jquery对JSONP非常友好,只需要在AJAX调用时指明dataType : jsonp就可以了。

二,频次限制问题。

既然不需要登录,频次限制问题就可以绕过。因为AppKey本身是半公开的。我们可以很轻松地Google到一大堆牛逼应用的Appkey。

例如 :

iphone新浪微博客户端 App Key:5786724301

iPad新浪客户端App Key:2849184197

Google.Nexus浪客户端App Key:1206405345

周博通微博管家App Key:202088835

Weico App Key:211160679

以上列举的这些AppKey,都是来自于一些用户量非常多的手机应用,它们的频次限制非常宽松的,几乎可以理解为“不限制”。为了解决频次限制问题,我们用它们的Appkey就可以了。

另外:新浪微博API的频次限制是有两个维度的,服务IP维度和用户IP维度。http://open.weibo.com/wiki/Rate-limiting 。这一点与本文无关,因为Javascript在客户端运行。但如果您想对本文提到的方法进行改装,使用C#或其他高级语言在服务器端进行调用的话,就要注意服务器IP维度了。

 三、简单的实验一下。

您现在可以直接在浏览器中访问这个地址:

http://api.weibo.com/2/short_url/shorten.json?source=2849184197&url_long=http://www.cnblogs.com

浏览器中将显示

{"urls":[
{"result":true,"url_short":"http://t.cn/h5FGy","url_long":"http://www.cnblogs.com","type":0}]}
通过访问上述的地址,您已经得到了http://www.cnblogs.com的段地址:http://t.cn/h5FGy
注意我们使用的是http而非https,不需要使用https,上文已经提到了。
 
四、最终代码示例
最终代码的示例参考这里http://haotaoqu.com/item-45.html
这个示例将一个又臭又长的淘宝客URL地址转换为了新浪短地址。
Javascript代码如下:

<script type="text/javascript">

$(document).ready(function(){

var j=$("#urlText");

var i=$("#goumai");

$.ajax({

//使用iPad新浪微博客户端的Appkey
            url: ‘http://api.weibo.com/2/short_url/shorten.json?source=2849184197&url_long=‘+i[0].href,  
            type: "GET",
            dataType: "jsonp", //使用JSONP方法进行AJAX
            cache: false,
            success: function (data) {
                j.val ( data.data.urls[0].url_short); //处理返回数据,显示到网页上 
                    });
                }});
});

</script>


五、除short_url/shorten外,其他可以用此方法调用的API

凡是标记为“是否需要登录:否”的接口都可以通过本文的流氓方法进行调用。打开http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2 官方文档慢慢选吧~

时间: 2024-10-03 08:50:48

以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API的相关文章

关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案

原文:http://www.cnblogs.com/chenxizhang/p/3821703.html 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 1.使用模板创建一个最简单的ASP.NET Web API项目,调试起来确认能正常工作 public class TestController : ApiController { // GET api/test public IEnumera

AJAX跨域调用ASP.NET MVC或者WebAPI服务的解决方案

问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web API项目,调试起来确认能正常工作 public class UserController : ApiController { public UserModel getInfo() { UserModel um = new UserModel(); um.Uid = 5; um.UserName =

Ajax跨域访问wcf服务中所遇到的问题总结。

工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务. 问题:由于web项目和wcf服务,不在同一个端口之中,所以涉及到“跨域”的问题.跨域访问的时候,需要对服务的接口和方法做一定的限定.具体参考:http://www.cnblogs.com/yangbingqi/p/2096197.html 2.解决了跨域问题,我们需要把服务部署到IIS.vs20

实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace WcfService1 { [ServiceContract] public interface IAddService { [OperationContract] [WebInvoke(Method="GET",RequestFormat=WebMessageFormat.Json, Resp

服务端配置实现AJAX跨域请求

一直以为AJAX跨域是无法逾越的鸿沟,最近发现原来在服务端可以通过发送header信息来允许AJAX跨域请求. PHP代码示例: header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Headers:X-Requested-With'); 经过测试,webkit内核的浏览器成功实现跨域请求. IE一如既往的不支持~看来只能在移动端享用这一强大功能了 另外,需要注意的是,第一行配置中的*表示允许来自所有refer

ajax跨域请求,页面和java服务端的写法

页面ajax请求的写法: $.ajax({ type : "get", async : false, cache : false, url : "http://localhost:8081/a/b", data : { produ_id: 111, sub_id: 0, produ_quantity: 1, produ_price: 0.0 }, dataType : "jsonp", jsonp: "jsonpCallback&quo

ajax跨域解决方案(服务端仅限java)

楼主前端知识菜鸟,高手勿喷,在此记录工作中遇到的问题及解决方案,大神请滤过 1.jsonp(js客户端ajax请求参数方式设置) 2.服务端接口设置: HttpServletResponse 对象: setHeader("Access-Control-Allow-Origin", "*");

JAX-RS开发(四):ajax跨域访问REST服务时的cors解决方案

上一篇博客我们通过JSONP解决AJAX跨域问题,本文将通过CORS来解决跨域问题.CORS是HTML5新推出的,需要较高版本的浏览器才能支持.我用的IE11和Chrome41,都是支持CORS规范的.cors可以参考下面几篇文章: cors规范 http://www.w3.org/TR/cors/ cors浏览器兼容性 http://caniuse.com/#search=cors tomcat7的cors解决方案 http://tomcat.apache.org/tomcat-7.0-doc

java 服务端解决ajax跨域问题

//过滤器方式 可以更改为拦截器方式public class SimpleCORSFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; resp