(30 hackdays day 25) Tuling123 – 光棍节找个机器人聊天吧

Tuling123

今天介绍又一个AI机器人Tuling123,当然是开放API的。而且,Tuling123号称可以创建个性化的机器人哦~(别跟我说这logo像个啥…)

图片描述

注册获取API Key,看平台接入文档。发现一个悲惨的事实:发送请求的API居然是GET的…而且URL还设计成这样 http://www.tuling123.com/openapi/api…让我猜一下,以后你们会把新的API设计成/openapi/api2吧。这惨状仅次于我见到过的一个把发送评论API设计成GET的。

而且,这可怜的GET还要承载userid,location,lon(lon….哎),lat以及询问信息info所有内容…

想要测试这个API很容易,curl一下就好啦。

curl "http://www.tuling123.com/openapi/api?key=xxxxxx&info=我喜欢你"
{"code":100000,"text":"宝贝,我也很爱你,来,亲一下"}

这个回答看起来不错。但当我问“哪里当片儿”时,丫居然说

{"code":100000,"text":"最好别有这样的想法。为了你好才说的。 希望对你能有好处。 yin是生活事业学业福气寿命婚姻命运的克星。一个人消耗完了自己相应的福报,等待他的是苦果自受。 看、想、听、说、做yin秽的事,都会大大折损人的福报。"}

只能说…真没幽默感…

另外,这API居然把unauthorized的statusCode写在200的reponse里,而且还跟正常业务的statusCode写在一个地方,受不鸟…还40001,40002…C时代穿越过来的么…请好好看看How To Design A Good API And Why It Matters Google

再吐槽一下:Luling123把referrer link居然翻译成“升级连接”,还真是…目的导向…是不是应该考虑把消息发送按钮改名叫“约”呢…哎,再吐呆毛就爆了…

好啦,官方只提供了两端调用代码,PHP和Java的=.=。让我们来改造成nodejs的吧~

unirest

受够了mikeal/request的non-promise,随便一搜就找到了新欢:unirest。选择的一个重要原因是,Mashape做的~

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~

(30 hackdays day 24) Atatus – what happened before crash

Atatus是一个用来记录“犯罪现场”的工具。正如其他类似的统计异常的SDK一样,Atatus除了收集你的web app里发生的异常,在后台看到各种Bug的统计,最重要的功能的可以记录发生异常的时候用户的行为。

图片描述

如何重现

工程师在解决bug的时候遇到的最讨厌的事情莫过于不知道如何重现问题。现代Web App的复杂度越来越高,一个错误可能是长时间的javascript执行的积累造成的,很可能用户遇到一个问题,但只能报告一个有#的url。而之前的操作才是引发这个bug的原因。
Atatus就是来解决这个问题的。用户只要配置好SDK,一旦遇到Exception,Atatus就会把它,以及之前所做的行为报告给服务器。

比如我做了个登陆页面,我在一个input里输入了用户名,在另一个密码登陆框里输入了密码,然后点击了登陆按钮,bang,出bug了。整个栈被如实打出。同时,一旦你觉得某个bug被解决了,可以点resolve隐藏掉这个bug。对于小型项目来说还是很方便的。

图片描述

Angular

Angular是个FrontEnd又爱又恨的的框架,其中一恨就是有些错误超难track。Atatus专门为Angular写了一小段错误处理代码(当然这个不是Atatus专用的)。

.factory('$exceptionHandler', ["$window", function ($window) {
  return function (exception, cause) {
    if (exception.stack) {
      exception.stack = exception.stack.replace('new ', '');
    }
    if ($window.atatus) {
      $window.atatus.send(exception);
    }
  };
}]);

增加这么一个处理exception的factory,你的Angular程序就能在发生错误的时候统计下整个的用户行为和错误了。

离线存储

一个H5应用经常会面临用户不在线的情况,只要打开offline模式,等到用户连上网以后就会自动发送。它用的是localstorage,所以不用怕关掉tab。

atatus.enableOffline(true)

Pricing

唯一有点遗憾的就是它不提供永久免费的方案。当然你可以试用30天之后再注册一个账号…
不过,12刀15万个exception听起来还是不错的(除非你的App写了个抛异常的死循环)~

(30 hackdays day 23) Favico.js – 网页杀死处女

是不是觉得网页的favicon(就是一个tab上的小图片)太乏味?用微信头像谋杀处女座还不够爽?怕用户看不到“您有新的消息”?好吧,用Favico.js来屠戮用户吧!

图片描述

看到了吧…凄苦吧…想象一下以后你的浏览器变成这样,还在跳来跳去…是不是想死…

图片描述

这个库使用起来超简单:创建一个Favico,.badge设置数字,done

var badge = 5;
var favicon = new Favico({
    animation : 'slide'
});
favicon.badge(badge);

原理也很简单,js里创建一个canvas的dom,把图片变成DataURL,然后直接改head里icon的href。所以,它还有高级用法:把html5视频放到favicon里,甚至把摄像头内容变成favicon…

var favicon=new Favico();
favicon.webcam();
//stop
favicon.webcam('stop');

好吧我承认我幻想过在tab里看porn,who care有码无码…

哎,写到现在都不知道写啥了…没心情写码态。先这样吧,以后再增加一些源码分析。

(30 hackdays day 22) Import.io – 最简单好用的网页爬虫服务

import.io,一个2012年成立的公司。至今已经有3m刀的…种子轮…为毛…

注意,这是一篇由脑残和图片组成的文章。

图片描述

anyway,import.io是我用过最简单的爬虫,没有之一。简单到…只要输入一个网址(当然其实它可以更简单到不用输入http://),就可以获得一个该页面对应的API。更牛逼的是,这是一个我想寻找付费服务却寻觅不得的产品!

两步得到网站API

  1. 打开https://magic.import.io/ 输入要爬取的网址,比如http://producthunt.com
  2. 调整你需要的数据列,比如把url_link那列改为title
  3. 点击下面的GET API…

然后import.io就会给出一个GET API,一个POST API,甚至还有直接从Google sheets取数据的地址!

图片描述

这个API足够足够简单吧!也不用[o]auth就直接拿数据!唯一可惜的一点是,似乎它有一些延迟,没法很实时获得数据(也正是这时候我开始满页面找pricing…)。

除了GET以外,你还可以往里拽(POST)其他URL,很适合那种同构的多页爬取。

当然,虽然你觉得Http GET已经足够简单了,但import.io不这么认为,它觉得你还是需要SDK的…好吧,其实我是为了展示他的API doc页面…里红色的那部分!想起了一个以前看到过别人分享的注释

//Attempt Handshake: Hello? This is London calling. Are we reaching you?
//Handshake Failed: I don't understand...he just hung up.

图片描述

import.io不光是一个爬网页的平台,它还提供存储,搜索(是的…)等服务。赞一下里面的文档样式。

图片描述

App

一个爬虫用的桌面App?想到了啥?像浏览器一样,圈圈点点?
这里下载import.io的桌面应用,安装完了去桌面打开(谁知道为啥它不扔launcher里…),splash都cute到死…

图片描述

打开以后呢,发现呢,就是个firefox内核的浏览器…区别就在与在这个app里可以使用chrome里无法使用的API from URL 2.0,API from Authenticated URL这些功能。估计就是为了把各种登陆cookie都很容易拿到,所以就做了个浏览器的壳吧。

用起来才发现这简直是…简直了…找到要爬的页面,鼠标选择要爬取的内容,搞定以后publish就可以产生一个某类页面的API了,以后只需要把新的文章URL扔给他就ok了。

图片描述

可以看出import.io其实没有diffbot那么智能,但对于那些懒得写xpath的程序员,import.io真的很方便!说到xpath,似乎我真的好久没写过了…可以看出import.io也是用xpath来实现的。

图片描述

好啦,这篇真的是一行代码都没有(这完全是为了配合import.io的好用好吧)…好吧,我有姿势我自豪~

(30 hackdays day 21) Wakatime – 现在几点了,你在做什么呢

前面提到了一个用来QS自己的工具Clarify。这次介绍一个专门给程序员用的工具。
大家都知道一万小时定律,但我究竟写java写了多久了呢?WakaTime知道。估计很多人都知道RescueTime,我也是用RescueTime来记录我的工作时间。但它无法记录更具体的行为(也许实际也做了),比如我写了多久javascript,多久objective-C。Waka就可以啦,因为它提供了几个主要的IDE的插件,只需要安装对应的插件,Waka就能自动记录你在IDE里的行为。

WakaTime

Waka的基本设计和rescuetime类似。每个人注册完将获取一个key,装一个客户端,把key输进去(登陆是同一个道理),然后它就把本地的所有行为带个key扔给服务器来统计,一段时间之后给你个报表。不过Waka做的真的很精准,精确到每一个文件用了多少秒,每一种语言用了多少时间。

图片描述
图片描述

据说Waka还能知道你在每个branch用了多久,这还真是一个量化程序员的好办法。如果有项目管理会用这种工具,相信也能更精准的把握开发进度,控制每一次开发尝试的代价。

作为一个付费用户狂人,登陆以后做的第一件事当然是搜Pricing~对比一下,付费用户的功能就是无限期数据查看和原始数据导出。想了想…算了这次…还有团队版本哦~

工作原理

Waka让我觉得好玩的是他的plugin都是开源的,而且在他的开源项目列表里看到了一个叫wakatime的核心项目,python写的,说是大家基本不需要直接使用的。基本可以确定是每个plugin都会去调用的核心库。

从queue.py里看出所有的log都会被放到~/.wakatime.db下,那我们就去看看它存了啥。打开以后发现是空的…想必是Waka把log都传走了以后就删掉了本地的。于是,断网,假装写代码,再看看。

图片描述

可以看到它记录了我在哪个文件,什么时间,什么项目下,写了什么语言,甚至在哪一行下都记录下来了。如果这个数据结合版本管理,动态的展现出来,将会是多酷啊~

Anyway,由于我很想用koding这样的WebIDE来工作,这样就又没发用Waka了,所以我需要知道发送记录的具体API是什么。

这也叫API文档

Wakatime是觉得代码是最好的文档么,居然在API文档里没有写出这些log是如何被打进数据库的…文档里只有认证,获得统计信息,和当前用户信息的接口…

好吧,那我们直接去刚才那个python的repo里看吧。首先,这里面肯定有个代码文件是包括http和wakatime.com的。那就搜吧,找到了init.py里一个函数叫send_action。很明显这是用来发log的。

那先让我们用curl模拟一下这个请求吧(看起来也不用太多域)。

$ curl -d '{"time":"1414688349","file":"/root","lines":"123","language":"javascript","is_write":"0","project":"manhattan"}' -H "User-Agent: space" -H "Content-Type: application/json" -H "Authorization: Basic ODMwOTliYjMtZGUwZS00NWFkLThhODItZmY4OWUwYzxxxxxxx" https://wakatime.com/api/v1/actions
{
  "data": {
    "id": "83682870-8306-4d12-b4a9-e0ba5f6cc295"
  }
}

把Key base64一下,用date +%s拿一下当前的timestamp,就可以往Waka里扔数据啦。扔完了以后看看Dashboard~好啦,我们的曼哈顿项目出现啦~

图片描述

如果你愿意可以把它改成各种SDK(当然browser里会出现跨域的问题,所以你可以找个中间服务器做这事儿)。

在未来做点儿事儿

刚才看到了有个timestamp来表示时间,如果改成以后呢。估计waka不会蛋疼到做这个检查吧…往2015年1月1日扔几个action,等一小会儿,看manhattan项目的URL,改成https://wakatime.com/project/manhattan?start=2014-12-26&end=2015-1-3。就能看到我在未来写javascript了~

扩展的waka

所以其实wakatime是一个特别基础的action记录和统计平台。如果它愿意开源(其实这真的还不如一个logger分析平台…),完全可以搭建成一个QS小服务。比如晚上9点连续发出20分钟加速度变化数据,然后就停止了10分钟…

(30 hackdays day 20) Clarify – 处于pending状态的QS服务

如果你还不知道量化自身,那么建议你看看Quantified Self。量化自身对于我来说,就是希望在我比较短的生命预期内,能尽量留下我的数据,从而在身体死掉前,用算法创建出一个IO近似于我的“个体”。

“我TM说啥了?”

这是两三年前就在做的一件事情,时断时续的我用一些12小时的录音笔记录了一天我周围的声音(当然也包括我自己的)。最简单的目的就是希望能知道我之前说了啥(我记性比较差…)。但当时找了一些voice recognition的SDK来分析记录下来的语音信息。结果都特别不如意,基本没有能用的。
直到最近买了一个Narrative Clip,我又开始重燃QS的热情了。Rekognition – 借我借我一双慧眼吧文章中,我第一次把narrative里的部分数据拿来分析,得到的结果意外的好。这坚定了我之前的想法:

如果有一个一开始设计好的idea的api flow的blueprint,让机器能帮你在发展的过程中不断紧盯这些API能不能满足需求,直到某一天,这个pipeline通了。丫就告诉你,爷,你丫的idea跑通了。

Clarify

好啦,BB这么多的目的是介绍一个不那么牛逼的服务,Clarify。Clarify号称自己做三件事儿:Capture,Analyze,Discover。简单的说就是把语音视频数据扔给它,它帮你做信号处理(估计就是降噪),语音识别和自然语言处理。当然这也是收费的,音频每小时3刀,每5000个搜索一刀。

听着很简单,但当我看到这个服务的时候,我知道这就是我想要的~不用装SDK,不用运行在我的server上。我只需要把媒体数据扔到一个像七牛的地方,拿到URL,扔给Clarify。稍等就可以问它“我前天这时候说下周去哪聚会来着?”。好吧,至少能做到,搜索,上周这时候,有“聚会”的这段音频。

API

丫居然用PHP来做tutorial…好吧,不发表言论…创建一个App,拿到AppKey。找到nodejs SDK,翻翻tutorial,猜一猜就写个测试程序出来。

var clarifyio = require('clarifyio');
var client = new clarifyio.Client("api.clarify.io", "[key]")

var bundleId;
var data = {
    name: "qwerty bundle " + Math.random(),
    media_url: "https://s3-us-west-2.amazonaws.com/op3nvoice/harvard-sentences-1.wav"
};
client.createBundle(data, function (err, res) {
    if (err) return done(err);
    bundleId = res.id;
    client.search({query: "fire", query_fields: "*"}, function (err, res) {
        if (err) return done(err);
        console.log('search');
        console.dir(res);
        client.removeBundle(bundleId, function (err) {
            if (err) return done(err);
            client.removeBundle(bundleId);
        });
    });
});

就是这句 client.search({query: “fire”, query_fields: “*”},…)。执行结果也很简单。

{ total: 1,
  limit: 10,
  search_terms: [ { term: 'fire' } ],
  item_results: [ { score: 1, term_results: [Object] } ],
  _class: 'SearchCollection',
  _links:
   { self: { href: '/v1/search?query=fire&query_fields=*' },
     items: [ [Object] ],
     first: { href: '/v1/search?query=fire&query_fields=*&iterator=S10a47fbc8ef' } } }

它就是告诉你某个bundle里(bundle就是一个media的集合)有没有这个字出现。所以具体在哪里出现,似乎也还是得很多人工介入的。

无论如何,Clarify让我能用十几行代码就能分析一个我之前的录音(这个就不放出来了~)。虽然结果不理想,但我相信不久的将来我一定能等到那个”test全部通过”的API的~

另外,介绍一个全球第一个虚拟Hackathon。是之前提到的Koding举办的。https://koding.com/Hackathon
在一个WebIDE里,和一群全世界的hacker们玩一次hackathon,一定很酷!

哎,最近精力有限,水点儿请见谅…

(30 hackdays day 19) CARA – EQ不足CARA补

受朋友之邀调研有没有那种提供视频中的人脸识别并自动添加上某些面具类的服务或者API,如果能根据表情调整面具内容就更好。

首先,人脸识别的API有超多,国内很有名的Face++之类的都可以提供很好的结果。但这里有三个不同:视频,表情,面具。

视频

理论上,视频也就是一堆静态图片而已,但按照目前HTTP API的效率来说,一秒钟24次API真的还是挺难的。但如果效果好,也可以跟对方合作,用长连接类的API来调用他们API,也许能撑得住。

表情

于是我就去搜emotion detection API,发现了这么个服务Imrsv,先体验一下他们的栗子服务(挺好玩的!)。我的检测结果。

图片描述

他会让你看一段视频,然后观察你的表情,分析出笑,惊讶,不喜欢和注意情况。你肯定想到他们做这玩意儿是干啥的了…

Cara-cloud

这就是提供刚才那种分析服务的云服务,CARACloud。demo页面有两个功能:根据图片分析和服务器端分析。
我们先看看图片分析的。先扔进去一张乔布斯的~

图片描述

[
    {
        "date_created": 1414518641,
        "age": 2,
        "gender": 1,
        "width": 307,
        "height": 307,
        "x": 51,
        "y": 236
    },
    {
        "date_created": 1414518641,
        "age": 3,
        "gender": 1,
        "width": 283,
        "height": 283,
        "x": 464,
        "y": 211
    }
]

其中的age只是一个类型,2是young adult(30岁以下),3是adult(30-50我记得是)。让我们再扔一个进去~

1373255755982.jpg

结果是…我很认真的挑了好几张霍金的玉照…结果都是…

{
    "error": "CloudNoFaceDetectedException",
    "error_description": "No face detected."
}

翻来翻去发现他们从13年就开始叫嚣会出API doc,结果现在还是没消息。一个隐蔽的小论坛里,发消息的频度也是以月计算的。
好吧,那只能用他Demo页的接口来用啦。

DevTools查一下,写如下的curl:

curl --data "type=image_url&cara_cloud_demo_image_url%5Bimage_url%5D=http%3A%2F%2Fcdn.macrumors.com%2Farticle-new%2F2013%2F06%2Fsteve_jobs_bio_covers-800x604.jpg&cara_cloud_demo_image_url%5B_token%5D=165932fef9c0c28ea1a048b860b5b5384fb3a722&submit-url=Submit"  https://imrsv.com/cara-cloud-demo

修改其中图片URL的部分拿到结果页面的HTML,查看里面确实有结果。注意%5B和%5D是中括号[和]。不过每次都要改一下_token的值。

下面那个Server Side Video Processing只能看视频了,结果看起来很棒。如果能深度合作肯定能做出来那种根据表情实时变化的效果。

看了一圈,发现没有地方注册网页…login里的Create an account居然是连接到contact…好吧,你们丫以前肯定是能注册的,程序员肯定不愿意把那功能删掉!

所以呢,我们就搜一搜cara 或者imrsv register呗。然后就发现了这个注册页面。然后,注册,确认,登陆,就能看到它的后台啦。

Document里选择成为Developer,填满以后自动就会把AppID和AppSecret给你。再点Document就能看到各种API的文档啦。懒得注册还需要全部文档截图的可以找我要哈。(那该是什么样的人呢…)

图片描述

其中有一段Upload media的描述让我很困惑。这,到底是License先有还是先Upload呢…

Upload either image/video for processing. This API requires a license. License would not be available until processing is done.

不过通过测试发现确实是会给你的License,在等一阵子以后收到的mail里。从media_id里看出,这公司至今也就处理了14万张图片…好惨…

图片描述

到点儿啦,Downloads里还有好几个好玩的东西,PHP脚本啥的,有兴趣的去看看哈。

试用了下CARACV的Mac版,真的很好玩,指定一个证书以后,录一段视频就能得到一个分析报告。有什么注意了多久呀,看了几瞥呀啥的。有钱的商铺绝对可以用来做广告效果统计哈。

图片描述
图片描述
图片描述

这个故事告诉我们:笑起来更年轻~
各种文件下载可以看这里。文档截图。好啦,所有文件都在这里

(30 hackdays day 18) Dexlabs – 有语言的逆向分析服务

以前我做过一段时间的Android逆向,当时是为了检查广告检查病毒,后来用来找到公开的intent跳转到应用内做搜索,再后来为了找到这些应用都跟哪些API打交道,从而统计SDK和产品之间的关联度。之后就再也没接触过这些了。不过前两天发现我还在订阅apk analyze的Google alert邮件,所以就决定再回来看看现在这领域都在玩哪些新玩意儿啦~(其实是找不到新API了吧…)

android-apktool

绝对的老牌选手了,从10年开始就在维护。貌似现在是Connor Tumbleson这家伙在维护。这家伙是Techcom Worldwide的程序员,看起来一直很专注在Android OS这块,以至于他的Vibe里只有两个Tag:Technology, Android OS。对比一下我的…唉,惭愧。(为毛会有粤语…)
图片描述
图片描述

丫做了一堆网站,看了下觉得都挺好玩的。另外最近他把Wordpress换成了Ghost,太酷了!有没有Ghost的博客托管平台啊!顺便再膜拜一下Brut.alll!

图片描述

先看看2.0.0RC2的样子。好久没用过apktool了,第一眼看到的区别就是-advance这个参数,高级信息…是个啥…其他的,似乎跟上次见到的时候无甚差别。不过根据文章介绍,ApkTool终于支持Java7了。

具体的逆向过程我就不讲啦,因为以前做过这个。

dexlabs

主角儿来啦。当我说Reverse engineer的时候,你应该就想到了Reverse engineer as a Service吧~是的,Dexlab就是这样一个产品。看名字就很明白啦,这是个以分析APK为生的公司。

图片描述

里面又碰到一个第一眼不认识的词儿Heuristics(这是要改成30天速成英语四级么…)。好吧,一会儿再看这到底是啥高级功能。

这产品使用很简单,注册个账号,上传个apk,等它告诉你分析完了,就可以开始看结果啦。所以这是个编辑都会干的活儿(没有贬低的意思=.=)。因为是静态分析,所以也不用指望有什么很突破的功能。通过首页的示例基本就可以看出其中一个很重要的功能应该就是类似IDA pro的关联分析静态分析功能。

GMS

普通的小应用不值得分析,让我们直接上大招,Google Mobile Service。这是一套Google在Android上的核心服务,在国产手机上基本不能有。

上传完以后就开始分析,着进度条晃啊晃啊的烦死了,既然你丫不知道进度就谦逊一点嘛!大概4分钟以后分析完了(27MB确实比较大,以前的经验来说这种程序如果是java的就会跑崩了…)。好,下面是大图!可以很快的划过去。

bigfile

这就是这个庞大的GMS的基本信息,就是APKTool能分析出来的那些。重点是看右边的那个Package Deps。好吧,完全看不出来啥了…基本也就能看出几种基本服务类型,Ad啊location啊啥的。

图片描述

最有意思的,是他们还为程序静态分析设计了一套类似SQL的语言,DXQL – Dexter Query Language。不过,通过他们在twitter上的这只推来看(只有一个retweet),应该不会有其他地方使用这种语言…

哦对,其实,这个平台主推的应该还是协作分析的功能。邀请他人来一起分析某个APK,听起来就跟搅基是同义词~

最后,我一直在寻找的API,在FAQ里找到了…

Which extraction/export interfaces does Dexter offer?
None yet. However we want to implement a SDK which can run on the user’s client computer for further analysis. If you contact us about that, it might help to schedule our priorities ;)

事实上,他们对很多功能的回复都是这个: If you contact us about…好吧,这是第一个没有API的XaaS。下次我尽量不那么水…

(30 hackdays day 17) AngelList – IT桔子啥时候开放API

最近在做的事情需要收集创业公司的信息,所以这次我介绍一个获取Startup信息的API。AngelList,是一个为创业公司提供投资,招聘等服务的平台。

AngelList现在号称”Over $10,000,000 invested online this month”,我数了下数字,差不多一个月1000万刀的投资。但…logo为毛做的这么二…

图片描述

废话不多说直接看API https://angel.co/api/

第一眼望去看到的是OAuth,第二眼望去就看到一个不认识的词儿,Accreditation。看起来好像是得到认证过的投资信息。不管了,不用到暂时。

先看一个综合的搜索Search API。按名字来搜索公司,用户,地理Tag等。这个不需要认证就可以访问。比如我们找个叫leap motion的公司

GET https://api.angel.co/1/search?query=leap%20motion&type=Startup

就可以得到一堆跟leap motion有关的公司。可是,前两个名字都叫Leap motion…不过根据AngelList的排行,第一名应该还是比较靠谱的,而且第一个还有pic这个域。

{
    "id":6343,
    "pic":"https://d1qb2nb5cznatu.cloudfront.net/startups/i/6343-3704fb09e9b74996b5826f5cc1ab5a00-thumb_jpg.jpg?buster=1369156838",
    "url":"https://angel.co/leap-motion",
    "name":"Leap Motion",
    "type":"Startup"
}

这里面的信息很少,想要详细信息就得访问另外的Startups API

Startups API也是个很综合性的接口。除了获得某个Startup的信息以外,还能得到它的评论,以及Startup的排行榜和具有某个tag的所有Startup。
我们用刚才拿到的ID来访问Leap motion的公司信息。

GET https://api.angel.co/1/startups/6343

就能拿到一个挺全面的公司基本信息啦。包括公司首页,公司logo,产品描述等等,公司涉及领域等。

另外一个可以用来窥探公司方向的API事Jobs API。看看Leap motion在什么。

GET https://api.angel.co/1/startups/6343/jobs

可以看到他们在招Software Engineer,期权,薪水,技能都有描述。他们用了一个Array的Tag来描述技能,工作地点之类的,这个用法还是挺好玩的。

图片描述

看,Leap motion在招会用C++写算法的软件工程师哈。再见…
最后,某些牛逼投资人的following也是很有价值的,那就是Follows API

(30 hackdays day 16) Filepicker – 上传文件如此简单

基本上,各种产品都会用到一个很普通,但又很难实现的很漂亮的功能——文件上传。比较早期的一些Web框架还特地为File Upload做了专用的组件来方便开发者上传以及在后端处理上传的文件。这次我就介绍一个帮助大家超轻松实现文件上传功能的服务,Filepicker

logo

Filepicker.io

Filepicker做的事情很简单:帮助你用最少的代码把文件传到你想要的地方。我们直接看一个最简单的例子,使用Filepicker提供的Drag-Drop Pane widget来上传图片。

filepicker.makeDropPane($('#exampleDropPane'), {
  multiple: true,
  onSuccess: function(Blobs) {
    $("#exampleDropPane").text("Done, see result below");
    console.log(JSON.stringify(Blobs));
  },
  onError: function(type, message) {
    $("#localDropResult").text('('+type+') '+ message);
  },
  onProgress: function(percentage) {
    $("#exampleDropPane").text("Uploading ("+percentage+"%)");
  }
});

只要在页面上加一个id是exampleDropPane的div,它就会变成一个可以往进拖拽文件并上传的控件。上传成功以后,onSuccess里就可以得到上传以后的文件信息,比如如下。

[{"url":"https://www.filepicker.io/api/file/n4Ba7BdNSJyaLZfu2Qm5","filename":"logo-primary.png","mimetype":"image/png","size":8452,"isWriteable":false}]

返回信息里包括文件URL,mime(filepicker帮你分析出来的,我测试了下apk也可以分析的出来,挺不错的)和一起其他信息。

也许你会很奇怪,这文件没有传到我的服务器上呀?是的,Filepicker不光帮你写前端代码,也帮你搞定了文件存储(默认情况)。这意味着一个前端工程师,使用BaaS类服务,加上Filepicker就可以超容易的做出一个允许用户上传文件的WebApp——在onSuccess里在BaaS里创建一个文件对象,把url指向Blobs.url就可以啦。

如果你很在意用其他数据存储服务,比如S3,Azure,Dropbox,Rackspace。可以简单的在makeDropPane里添加选项location:’dropbox’就可以啦。在Developer Portal里你可以配置如上几种服务的各种Key。

Filepicker.io   Developer Portal   fxp007 gmail.com.png

还有一种情况,你的App需要把数据存在用户自己的某类存储账号中,比如用户自己的Box,用widget就可以很容易enable这个功能。

API

Filepicker支持各种终端,并提供SDK(当然有Javascript的)。

Filepicker SDK

btw. Meteor的发展速度真是猛啊!

CDN

如果你的网站是个IO集中型的,换言之很在乎CDN的,可以使用Amazon的CloudFront和Filepicker.io一起使用。

Price

Filepicker帮你保存文件,提供一行代码添加uploader,可以存在各种地方,你觉得得多少钱?只需要29或者99!刀…价目表很清楚,我感觉对于小公司也是超值的。另外就是,我很好奇最牛逼方案里20GB大文件是咋搞…
Filepicker.io   Easy  Powerful File Uploads.png

ok,抱歉又水了一篇,太困了,晚安~

想了解这个30 hackdays可以查看这篇文章。也欢迎访问我的墙外站

在WordPress.com的博客.

向上 ↑