https协议之人脸识别
一、libcurl和openssl安装
因为刚开始只安装了libcurl时,并没有安装openssl,所以只支持Http协议访问,安装了openssl库后,支持Https的访问。
- rm _install/ -rf
先删除之前安装curl库的路径及文件。 - vi ./docs/INSTALL.md
查看libcurl的install文件,在install文件中,看到配置时需要加–with-ssl。 - ./configure --prefix=/home/jiangyo/Desktop/httpHandler/curl-7.71.1/_install --with-ssl
看到配置的过程出了错误,系统需要先支持ssl,才能进行配置。 - wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
安装openssl - tar vxf openssl-1.1.1a.tar.gz
解压openssl - ./configure
默认安装在系统路径下,这样编译的时候就不用加动态库的环境变量路径,也不用指定动态库。 - make #编译
- sudo make install #安装
- ./configure --prefix=/home/jiangyo/Desktop/httpHandler/curl-7.71.1/_install --with-ssl
安装完openssl后重新配置curl - make #编译
- make install #安装
- gcc demo2.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
重新进行编译文件 - sudo apt-get update、sudo apt-get install libcurl4-openssl-dev
运行a.out的时候会报错,解决办法。
二、Base64
- Base64就是一种基于64个可打印字符来表示二进制数据的方法。字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。
- Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0-31、127这33个字符属于控制字符,32~126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。
具体转换步骤
- 将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
- 将上面的24个二进制位每6个一组,共分为4组。
- 在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
- 根据Base64编码对照表(见下图)获得对应的值。
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
- Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的浪费。因此,Base64编码之后的文本,要比原文大约三分之一。
- 为什么使用3个字节一组呢?因为6和8的最小公倍数为24,三个字节正好24个二进制位,每6个bit位一组,恰好能够分为4组。
注意事项
- 大多数编码都是由字符串转化成二进制的过程,而Base64的编码则是从二进制转换为字符串。与常规恰恰相反,
- Base64编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文。也可以通过打乱Base64编码来进行加密。
- 中文有多种编码(比如:utf-8、gb2312、gbk等),不同编码对应Base64编码结果都不一样。
三、人脸识别
- https://www.netocr.com/
在翔云人工智能平台开通人脸识别服务后,可通过该平台,在程序中通过https访问,将图片等信息,通过Post请求发送给该平台。 - 源程序:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#define true 1
#define false 0
typedef unsigned int bool;
char buf[1024] = {0};
size_t readdata( void *ptr, size_t size,size_t nmemb, void *stream)
{
strncpy(buf, ptr, 1024);
//printf("===============================readdata========================\n");
//printf("%s\n", buf);
}
char *getBaseData(char *pass, int *len)
{
char cmd[128] = {0};
int readlen, fd;
char *readbuf;
sprintf(cmd, "base64 %s > output", pass);
system(cmd);
fd = open("./output", O_RDWR);
readlen = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
readbuf = (char *)malloc(sizeof(char) * readlen +2);
read(fd, readbuf, readlen);
*len = readlen;
close(fd);
return readbuf;
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char key[128] = "KX4NTh8jQmQEtcY1pT1vZ9";
char secret[128] = "2f7e3e1b594e41a1a3718176950cd57a";
int typeId = 21;
char format[16] = "xml";
char postData[800000] = {0};
int len1, len2;
char *img1=NULL;
char *img2=NULL;
img1 = getBaseData("./1.jpg", &len1);
img2 = getBaseData("./4.jpg", &len2);
sprintf(postData, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s" , img1, img2, key, secret, typeId, format);
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData); // 指定post内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readdata); //将返回的http头输出到fp指向的文件
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
printf("res = %d\n",res);
}
if(strstr(buf, "是") != NULL) {
printf("same people!\n");
}
else {
printf("diff people!\n");
}
return true;
}
int main(void)
{
postUrl();
}