以短链服务为例,探讨免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维度了。
您现在可以直接在浏览器中访问这个地址:
&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 官方文档慢慢选吧~
以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API的更多相关文章
- AJAX跨域调用ASP.NET MVC或者WebAPI服务
关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案 作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP. ...
- AJAX跨域调用ASP.NET MVC或者WebAPI服务的解决方案
问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模 ...
- Ajax跨域访问wcf服务中所遇到的问题总结。
工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务 ...
- 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法
关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...
- ajax跨域访问http服务--jsonp
在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...
- 一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)
JSONP(JSON with Padding)可以看成是JSON的一种“使用模式”,用以解决“跨域访问”的问题,这篇简单的文章给出一个简单的例子用于模拟如何通过jQuery以JSONP的访问调用一个 ...
- ajax跨域请求,页面和java服务端的写法
方法一(jsonp): 页面ajax请求的写法: $.ajax({ type : "get", async : false, cache : false, url : " ...
- html5 app开发实例 Ajax跨域访问C# webservices服务
通过几天的研究效果,如果在vs2010工具上通过webservice还是比较简单的,毕竟是一个项目. 如果您想通过HTML5 做出来的移动APP去访问c#做出来的webservice,那么就没那么简单 ...
随机推荐
- neon指令,注意事项
1. vbic_s8 (int8x8_t a, int8x8_t b) 是 ~(ai & bi),一开始理解成 (~ai )& bi 导致出错 2.uint8x8_t vqshrn ...
- Myeclipse 找不到Convert to maven project选项
https://my.oschina.net/u/2419190/blog/504417 Window > Preferences > General > Capabilities ...
- SPSS数据分析—混合线性模型
之前介绍过的基于线性模型的方差分析,虽然扩展了方差分析的领域,但是并没有突破方差分析三个原有的假设条件,即正态性.方差齐性和独立性,这其中独立性要求较严格,我们知道方差分析的基本思想其实就是细分,将所 ...
- C/C++ 如何来自动优雅的涮别银家的贴子
被涮屏涮烦了,就分享一下如何用低调的c/c++来涮别人家的屏吧! 此处埋下三颗雷! 这不是啥新知识,也不是什么浅显的代码.下面,来淘淘这份经验,呼呼 我们要了解Web browser 这个控件,因为到 ...
- C#窗体布局方式
DataGridView:显示数据表后台数据绑定: List<xxx> list = new List<xxx>(); dataGridView1.DataSource = l ...
- oracle修改序列
Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来 ...
- dos2unix,去掉Linux下文件中的^M
Windows系统下使用VS2010编写好的CPP文件,想放到Linux上进行编译.发现Linux上文件中的每行代码末尾都跟着^M这个符号. 为什么同一份文件在windows上和Linux上显示的不一 ...
- Octopus系列之代码备份
代码 $.extend($.validator.messages, { required: "This field is required.", remote: "Ple ...
- MVN使用随笔
001 创建项目 mvn archetype:generate -DgroupId=com.company.push.monitor -DartifactId=push-monitor -Darche ...
- [转]SecureCRT连接主机时,无法从键盘输入
问题: SecureCRT连接主机时,无法从键盘输入 答案: 最近通过超级终端或者SecureCRT连接主机时,都只能读取设备信息,但是无法从键盘输入,进入不了配置状态,后来仔细检查了配置,居然是流控 ...
