一直想尝试这个,奈何水平不足(GitHub上也没有参考),故原计划在假期学,然而一直拖到了今天。
校级 Watch Dogs

0x00.前言

这是一个很普通的控制台界面,以前总是感觉太简陋了,连图片列表都没有。当然现在没有那种感觉了,毕竟有Api就足够了。

0x01.开工

首先,阅读产品文档,今天对我们有用的是签名和鉴权文档人脸识别接口文档
然后,先生成签名,这里我用了它给出的php的实例,所以需要一个php环境。Windows下可以用PHPStudy,现在我在Mac下,方法就更简单了,sudo apachectl start即可。
签名有了,剩下的就简单了,直接看文档的例子就能明白。人脸识别有这么几个概念:

  1. group_id:就是一个分组,个体都在组里,好比一个学校,数量限制为5000个。

个体(person)以组(group)的形式存储,一个组可以包含多个个体,一个个体也可以存在于多个组。group_id即用来标识group。组(group)没有专门的创建接口,创建个体(person)时,指定group_id则会自动创建

  1. person_id:个体,也就是每一个人,数量限制为10000个。

人脸以个体(person)的形式存储,一个个体下可以存储多张人脸。person_id即用来标识person

  1. face_id:人脸,每一个人可以对应多张脸,数量限制为20个。

标识每张人脸的id

现在来创建个体:

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
4
import json
5
import requests
6
7
url = "http://service.image.myqcloud.com/face/newperson"
8
id = <此处替换为学号>
9
10
headers = {
11
    "Authorization": "<此处替换为签名>",
12
    "Host": "service.image.myqcloud.com",
13
#   "Content-Length": "187",
14
    "Content-Type": "Application/json"
15
}
16
17
data = {
18
    "appid": "<此处替换为项目ID>",
19
    "bucket": "<此处替换为空间名称>",
20
    "group_ids": ["2015"],  #注意此处参数类型,我被摆了一道
21
    "person_id": str(id),
22
    "url": "<此处替换为人脸图片地址>"
23
}
24
25
jdata = json.dumps(data)
26
r = requests.post(url=url, data=jdata, headers=headers)
27
28
print r.text

运行结果如下所示:

1
{"code":0,"message":"OK","data":{"person_id":"手动打码","suc_group":1,"suc_face":1,"session_id":"","face_id":"手动打码","group_ids":["2015"]}}

这样就在2015组(就是2015级学生)里创建了一个包含一张人脸的个体。接下来就是继续创建个体了……

2017-7-1 20:13:16
审查学校教务在线发现是大连乾豪开发的教务系统,此系统漏洞较多不过应该会有增量更新,用户登陆后(没账号你就不用想了……),进入教务管理系统查询中心,切换到学生园地个人信息,发现照片的链接是http://***.***/***.APPPROCESS?ByStudentNO=null,怀着试一试的态度,把null改成其他同学的学号,发现可以访问。可以写个爬虫爬下来……截至目前,试验所用照片已完全删除,使用本方法获取属于非法行为,滥用此法本人不承担任何责任!
1万年后……
个体足够了,可以进行人脸识别了,一共有三种:人脸验证、人脸检索、人脸比对。这里对我最有用的是人脸检索,其他的我就不详细介绍了。

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
4
import json
5
import requests
6
7
url = "http://service.image.myqcloud.com/face/identify"
8
9
headers = {
10
    "Authorization": "<此处替换为签名>",
11
    "Host": "service.image.myqcloud.com",
12
#   "Content-Length": "187",
13
    "Content-Type": "Application/json"
14
}
15
16
data = {
17
    "appid": "<此处替换为项目ID>",
18
    "bucket": "<此处替换为空间名称>",
19
    "group_id": ["2015"],
20
    "url":
21
}
22
23
jdata = json.dumps(data)
24
r = requests.post(url=url, data=jdata, headers=headers)
25
26
print r.text

大体上就是这个样子……

0x02.更新

2017-7-1 20:13:16
我记得当初还写了个前端页面对接到后端的接口上,用了Flask但是文件上传总是出错……
故意观察了一天再来写这段。总体上,可信率可观!
要是能识别的话基本上没有错的,不能识别的就是不能了……