今天介绍又一个AI机器人Tuling123,固然是开放API的。并且,Tuling123号称能够建立个性化的机器人哦~(别跟我说这logo像个啥...)html
注册获取API Key,看平台接入文档。发现一个悲惨的事实:发送请求的API竟然是GET的...并且URL还设计成这样 http://www.tuling123.com/openapi/api
...让我猜一下,之后大家会把新的API设计成/openapi/api2
吧。这惨状仅次于我见到过的一个把发送评论API设计成GET的。node
并且,这可怜的GET还要承载userid,location,lon(lon....哎),lat以及询问信息info全部内容...git
想要测试这个API很容易,curl一下就好啦。github
curl "http://www.tuling123.com/openapi/api?key=xxxxxx&info=我喜欢你" {"code":100000,"text":"宝贝,我也很爱你,来,亲一下"}
这个回答看起来不错。但当我问“哪里当片儿”时,丫竟然说npm
{"code":100000,"text":"最好别有这样的想法。为了你好才说的。 但愿对你能有好处。 yin是生活事业学业福气寿命婚姻命运的克星。一我的消耗完了本身相应的福报,等待他的是苦果自受。 看、想、听、说、作yin秽的事,都会大大折损人的福报。"}
只能说...真没幽默感...json
另外,这API竟然把unauthorized的statusCode写在200的reponse里,并且还跟正常业务的statusCode写在一个地方,受不鸟...还40001,40002...C时代穿越过来的么...请好好看看How To Design A Good API And Why It Matters Google。segmentfault
再吐槽一下:Luling123把referrer link竟然翻译成“升级链接”,还真是...目的导向...是否是应该考虑把消息发送按钮更名叫“约”呢...哎,再吐呆毛就爆了...api
好啦,官方只提供了两端调用代码,PHP和Java的=.=。让咱们来改形成nodejs的吧~promise
受够了mikeal/request的non-promise,随便一搜就找到了新欢:unirest。选择的一个重要缘由是,Mashape作的~cookie
var API_ASK = 'http://www.tuling123.com/openapi/api', function ask(info, cb, err) { var query = { 'key': 'xxx', 'info': info } unirest.get(API_ASK) .query(query) .headers({'Accept': 'application/json'}) .end(function (response) { if (response.ok) { if (cb) cb(response.body); } else { if (err) cerr(response.error); } }); }
虽然不提供美妙的promise返回,但其余的一些超便利的功能,以及好看的字体,足以让人从mikeal的傲慢中舒缓很多~
好,让咱们把它封装成一个npm吧。我猜你确定不想从npm init开始。因此咱们找找那些确定存在的Project Scaffolding吧,很显然Grunt就有Project Scaffolding。咱们选nodejs的grunt-init-node来用。
安装好之后grunt一下肯定没问题。把以前的代码改吧改吧扔进去。
var unirest = require('unirest'), Q = require('q'); var API_ASK = 'http://www.tuling123.com/openapi/api', API_KEY, RESPONSE_TYPE = { 100000: 'text', 200000: 'url', 301000: 'novel', 302000: 'news', 304000: 'app', 305000: 'train', 306000: 'plane', 307000: 'groupon', 308000: 'coupon', 309000: 'hotel', 310000: 'lottery', 311000: 'price', 312000: 'restaurant' } exports.init = function (key) { API_KEY = key; }; exports.ask = function (info) { if (!API_KEY) { throw new Error('Please init with api key first'); } var deferred = Q.defer(); var query = { 'key': API_KEY, 'info': info } unirest.get(API_ASK) .query(query) .headers({'Accept': 'application/json'}) .end(function (response) { if (response.ok) { var result = JSON.parse(response.body); result.type = RESPONSE_TYPE[result.code]; if (result.type) { deferred.resolve(response.body); } else { deferred.reject('unknown code,' + response.body.code); } } else { deferred.reject(response.error); } }); return deferred.promise; };
哦sorry忘了提了,我用了可爱的Q来Promisify一下这个接口。想看这完整代码的请看tuling123 nodejs-sdk。若是有人有兴趣一块儿维护欢迎加入哈。哎,看惯了国外API产品的文档看国内的真是不习惯。
最后抱怨一下,Tuling123的登录timeout设置的过短了...并且,彷佛跟cookie里写的不同...
而后呢...欢迎注册Tuling123 via Link~