(30 hackdays day 25) Tuling123 - 光棍節找個機器人聊天吧

Tuling123

今天介紹又一個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 Googlesegmentfault

再吐槽一下:Luling123把referrer link竟然翻譯成「升級鏈接」,還真是...目的導向...是否是應該考慮把消息發送按鈕更名叫「約」呢...哎,再吐呆毛就爆了...api

好啦,官方只提供了兩端調用代碼,PHP和Java的=.=。讓咱們來改形成nodejs的吧~promise

unirest

受夠了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的傲慢中舒緩很多~

grunt-init

好,讓咱們把它封裝成一個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~

相關文章
相關標籤/搜索