ibcurl简介
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。
libcurl的官网 http://curl.haxx.se/
libcurl下载
点下面的下载链接,下载箭头指的文件。
库下载Release 7.71.1 · curl/curl · GitHub
libcurl安装
把下载好的文件放到Linux自己的工作目录中
1、解压文件
tar xvf curl-7.71.1.tar.bz2
解压后得到curl-7.71.1 ,进入该目录
2、阅读相关说明文档
以后遇到需要使用这种开源包的时候,可以去读一读README文件和dosc这是这个库的介绍和使用说明。
这里通过看dosc/INSTALL文件,引导我们去看INSTALL.md文件,通过阅读INSTALL.md发现在Unix环境中需要一下三步来安装这个库。
3、配置安装路径和编译工具
回到curl-7.71.1目录
命令./configure --prefix=&PWD/_install --host =arm-linux-gnueabihf-gcc
--prefix指定安装路径 --host指定编译工具,本文是在ubantu上运行的而不是树莓派,因此下面就不指定编译编译工具了。
下面的命令表示安装到当前路径的_install文件夹下,这个_install会在第三步make install以后自动创建,会把编译以后的东西放在这个文件夹里面
./configure --prefix=$PWD/_install
4、编译
make
Linux make命令是一个编译工具,它可以根据文件时间戳自动发现跟新过的文件并重新编译,避免不必要的编译。
在Linux系统中,make命令通常与Makefile文件一起使用,该文件包含了如何编译和链接项目中的源文件的规则。使用make命令可以自动完成大批量源文件的编译工作,并建立不同文件之间的依赖关系
5、安装
make install
Linux make install命令是用于安装程序的命令。它会将编译好的程序文件复制到指定的目录中,以便用户可以直接运行程序
经过上面五步以后,就可以看到curl-7.71.1目录下多了一个_install目录了,包含bin,头文件和库
调用libcurl编程访问百度主页
https://www.cnblogs.com/xietianjiao/p/13260021.html附大神写的好文章。
代码如下
demo.c
#include <stdio.h>
#include <curl/curl.h>
#define true 1
#define false 0
typedef unsigned int bool;
bool getUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储
return false;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: Agent-007");
curl = curl_easy_init(); // 初始化
if (curl)
{
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
curl_easy_setopt(curl, CURLOPT_URL,"http://www.baidu.com");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp指向的文件
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
res = curl_easy_perform(curl); // 执行
if (res != 0) {
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
return false;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86"); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
fclose(fp);
return true;
}
int main(void)
{
getUrl("/tmp/get.html");
postUrl("/tmp/post.html");
}
1、编译
gcc demo1.c -I ./curl-7.71.1/_install/include/ -lcurl -L ./curl-7.71.1/_install/lib/
指定头文件 链接库 指定库文件位置
2、运行
编译完成直接运行会报错,提示缺少库,在编译程序时,你需要告诉编译器去哪里找到库文件。但是,这并不意味着系统会自动将这个路径添加到共享库搜索路径中。因此,你需要在运行程序之前,手动将库路径添加到
LD_LIBRARY_PATH
环境变量中。例如:
export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/
然后在运行就不会不会有问题了。
3、查看执行结果
根据代码来看,是把执行结果写入到了/tmp/get.html下,打开这个文件就可以看到执行结果了。
vi /tmp/get.html
结果如下:
使用libcurl实现人脸识别
重新安装libcurl以支持https类型的访问
需要注意的是上面安装的libcurl并不能访问https的网页,因为HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,所以在./configure的时候需要配置ssl
首先删掉上一次编译完成的_install目录
rm _install -rf
然后重新./configure,这次需要配置ssl。
./configure --prefix=$PWD/_install --with-ssl
这一步会报错,大概意思就是缺少OpenSSL的库,需要我们自己安装一下
执行下面的命令安装
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
然后在你下载的那个目录下解压该文件
tar xvf openssl-1.1.1a.tar.gz
然后进入该目录,去读INSTALL文件,可以看到安装的方法
可以看到和libcurl基本一致,第一步也是需要配置的,这里为了简单,直接./config默认安装到系统的默认目录下,
./config
完成以后继续make
make
完成以后make install
make install
注意这三个命令是安装OpenSSL的,可不要忘了安装libcurl的时候第一步因为没有OpenSSL出错了,这里重新去到curl-7.71.1目录三步曲一下
./configure --prefix=$PWD/_install --with-ssl
make
make install //最后一步不行的话需要加上sudo,sudo make install
至此,libcurl库就安装完毕了,可以进行https的链接了。
实现人脸识别
购买别人做好人脸识别的方案
自己网上搜人脸识别购买即可,购买以后去看厂家给的api,我购买的是翔云的,主要看这张图的内容
ocrKey和ocrSecrert红色的部分在自己的个人中心去看。注意这个的图片格式为base64流,在代码中需要把上传的图片转换为base64流。
直接上代码,我自己也是copy别人的代码,这里就不说怎么这些代码的意思了,只说需要自己改动的地方,直接看注释就可以了。
你需要准备好两张人脸照片,然后按着注释改动你自己的代码,完成以后编译运行即可。
#include <stdio.h>
#include <curl/curl.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define true 1
#define false 0
typedef unsigned int bool;
char *getBase64(char *picPath)//这个函数就是把图片转为base64流的 参数为照片的路径
{
int fd;
char *img=NULL;
char cmd[128]={'\0'};
sprintf(cmd,"base64 %s >tmpFile",picPath);
system(cmd);
fd=open("./tmpFile",O_RDWR);
int fileSize=lseek(fd,0,SEEK_END);
img=(char *)malloc(fileSize+2);
memset(img,'\0',fileSize+2);
lseek(fd,0,SEEK_SET);
read(fd,img,fileSize);
close(fd);
system("rm -rf tmpFile");
return img;
}
size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)//回调函数的格式,访问https返回的信息会放到ptr指向的空间中
{
char buf[1024]={'\0'};
strncpy(buf,ptr,1024);
printf("%s",buf);
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
char *postString=NULL;
char *img1=NULL;
char *img2=NULL;
char *key="************************";//这里需要填入你自己的key
char *secret="************************";//同样这里需要填入你自己的secret 去你购买识别方案的网址去找
int typeId=21;//这里需要看厂家给的文档 上图文档写的是21
char *format="xml";//这里就按默认的xml格式
img1=getBase64("./reba1.jpeg");//这里需要填你自己准备的两张人脸照片的位置
img2=getBase64("./reba2.jpeg");//这里需要填你自己准备的两张人脸照片的位置
int len=strlen(key)+strlen(secret)+strlen(img1)+strlen(img2)+124;
postString=(char *)malloc(len);
memset(postString,'\0',len);
sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",img1,img2,key,secret,21,format);//上面这几步是为了按官方文档把这六个参数按顺序拼接起来然后发出去。
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,postString); // 指定post内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); // 指定url
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,readData); //将返回的https返回的结果发送到回调函数中
res = curl_easy_perform(curl);
printf("res:%d\n",res);
curl_easy_cleanup(curl);
}
free(img1);
free(img2);
free(postString);
return true;
}
int main(void)
{
postUrl("/tmp/post.html");
}