libcurl 可以发送和接收HTTP消息,因此可以发送用户名、密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来。

基本步骤

  1. 正常访问登录页面,访问时,设置CURL参数,指定COOKIE文件。
  2. 获取验证码的图片。
  3. 发送用户名,密码和验证码(附加上第一次访问时指定的COOKIE)。
 /*首次访问页面,指定COOKIE文件,因为我们后面发送登录的账户和密码时,需要这个COOKIE*/
1 void accessFirstTime(){
void* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, POSTURL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, );
curl_easy_setopt(curl, CURLOPT_VERBOSE,);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "D:/dearTony/t1.cookie");
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,false);//设定为不验证证书和HOST
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,false);
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
return;
}

上面代码中,line 3, POSTURL 是需要访问得登录页面地址。 特别要注意的是,line 7, 8, 9 第七行告诉libcurl 将服务器发送过来的COOKIE存在哪个文件, 8,9行告诉服务器不需要SSL验证。

 /*将图片存盘*/
size_t downImage(void *buffer, size_t size, size_t nmemb, void *userp){
FILE *fp = fopen("d:/dearTony/validateImg","wb");
fwrite(buffer,size, nmemb, fp);
fclose(fp);
return true;
} /*获取验证码*/
void getYZM(){
const char* targetUrl= "https://***.***.com/cgi-bin/img/validateimg"; //图片的URL
void* curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, targetUrl);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, downImage);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, );
curl_easy_setopt(curl, CURLOPT_VERBOSE,);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "D:/dearTony/t1.cookie");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,);//设定为不验证证书和HOST
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST,); CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
return;
}

注意line 19,20,21  , 如果不附加COOKIE,  则获取的验证图片内容不对。

最后,发送账户名,密码和验证码。

 #define POSTURL "https://***.***.com/cgi-bin/user/Login"
#define POSTFIELDS "fundAccount=28000000****&isSaveAccount=1&mac=&normalpassword=&\
password=23c0d43c50972a7c6b927e61c52f15bd3d71c03e05ae9fce\
fd8b7ac29d19b293c25d72c651756050c4e843e31de0c05b9bca6e8b547\
9a90f5f1bb59818e0b983991b4259bbdd35d9ae423ef5602c8956bae122270f68908c229ca63a40114d4586c4bfcb90764&\
password_Controls=normal&\
retUrl=&ticket=%&type=Z" /*登录,ticket是上一步取得的验证码*/
bool login(QString& ticket){
QString postf = QString(POSTFIELDS).arg(ticket);
std::string tstr = postf.toStdString();
void* curl = curl_easy_init();
const char *postArg = tstr.c_str();
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*");
chunk = curl_slist_append(chunk, "Accept-Encoding: text/plain");
chunk = curl_slist_append(chunk, "Accept-Language: zh-Hans-CN, zh-Hans; q=0.8, en-US; q=0.5, en; q=0.3");
chunk = curl_slist_append(chunk, "Connection: Keep-Alive");
chunk = curl_slist_append(chunk, "Cache-Control: no-cache");
chunk = curl_slist_append(chunk, "Host: ***.***.com");
chunk = curl_slist_append(chunk, "Content-Type: application/x-www-form-urlencoded");
chunk = curl_slist_append(chunk, "Referer: https://***.***.com/cgi-bin/user/Login");
chunk = curl_slist_append(chunk, "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_URL, POSTURL);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postArg); /*POST的参数,通过F12抓包得到*/
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, );
curl_easy_setopt(curl, CURLOPT_POST, ); /*表明是POST方法*/
curl_easy_setopt(curl, CURLOPT_VERBOSE,);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "D:/dearTony/t1.cookie"); //一定要带上
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,);//设定为不验证证书和HOST
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST,); int response_code = ;
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_slist_free_all(chunk);
return true;
}

line15~24是HTTP头,可以用浏览器的F12功能抓包得到。

总结: 一定要注意COOKIE选择和 SSL 选项。

用libcurl 登录网站的更多相关文章

  1. 用c#开发微信 (20) 微信登录网站 - 扫描二维码登录

    像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 1 创建网站应用 在微信开放平台创建一个网站应用 https:// ...

  2. c#使用WebClient登录网站抓取登录后的网页

    C#登录网站实际上就是模拟浏览器提交表单,然后记录浏览器响应返回的会话Cookie值,再次发送请求时带着这个会话cookie值去请求就可以实现模拟登录的效果了. 如下类CookieAwareWebCl ...

  3. .NET C#使用微信公众号登录网站

    适用于:本文适用于有一定微信开发基础的用户 引言:花了300大洋申请了微信公众平台后,发现不能使用微信公众号登录网站(非微信打开)获得微信帐号.仔细研究后才发现还要再花300大洋申请微信开放平台才能接 ...

  4. Winform模拟post请求和get请求登录网站

    引言 最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的相关信息的封装,然后请求网站登录地址的样子.发现自己的博客中对这部分只是也没总结,就借着这股 ...

  5. Bing必应(Yahoo雅虎)搜索引擎登录网站 - Blog透视镜

    Bing必应是微软的搜索引擎,原本是置放在MSN网站上的,微软重新开发并改为新的名子,只要连到官网,登录网站后,过了不久,搜索引擎就会用爬虫,来检索你的网站,等过了一阵子之后,自然就可以找到你的文章. ...

  6. Google谷歌搜索引擎登录网站 - Blog透视镜

    建置好了网站之后,为了能提升流量或是增加曝光度,Mix通常会到Google谷歌,用手动登录的方式,登录网站,不久之后,搜索引擎就会派遣蜘蛛机器人,来检索你的网站,等一段时间之后,就会出现在搜索引擎内, ...

  7. jQuery异步请求模拟IE登录网站

    具体请求的登录验证页面后台逻辑处理,这里我们忽略,不在我们的学习范围内:关键的是使用jQuery异步请求方法,如下例子: <%@ Page Language="C#" Aut ...

  8. python网络爬虫之使用scrapy自动登录网站

    前面曾经介绍过requests实现自动登录的方法.这里介绍下使用scrapy如何实现自动登录.还是以csdn网站为例. Scrapy使用FormRequest来登录并递交数据给服务器.只是带有额外的f ...

  9. Java 扫描微信公众号二维码,关注并自动登录网站

    https://blog.csdn.net/qq_42851002/article/details/81327770 场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: ...

随机推荐

  1. 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...

  2. PHP变量

    变量的声明 PHP变量声明必须是$(美元符号)+变量名进行命名,同时在=(赋值操作符)后进行赋值 声明后的变量不是仅可以在一个<?php 这里是php代码 ?>使用,它还可以在当前页面所有 ...

  3. 通过JAXB完成Java对象与XML之间的转换

    Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...

  4. 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  5. js拖拽

  6. 非域客户端的office使用RMS加密服务出现‘介绍“信息权限管理服务”’服务的提示

    环境:office2007,需要使用windows RMS服务,客户机处于工作组模式,如图: 出现这个说明客户机没有发现RMS服务,可以通过导入注册表解决,如下: Windows Registry E ...

  7. 客户关系管理系统-CRM源码

    QQ:2112326142   邮箱:jxsupport@qq.com 本公司开发的CRM源代码系统一份,附源代码,本公司产品唯一销售客服QQ号:2112326142  请联系此QQ号,以免给您的工作 ...

  8. vim的高亮查找操作

    使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个关键字时,想不起来怎么查找“下一个”,于是google之并解决,顺便把有用的都贴过来罢. 查找指令:/xxx 往下查找?xxx 往上  ...

  9. Hibernate 系列 08 - 对象识别机制

    目录导读: Hibernate 系列 学习笔记 目录 本篇目录: 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(“==”号识别) 2. equals()和hashCode()识别 1. 以 ...

  10. SQL分隔字符串

    创建函数: )) --@str:目标字符串 --@spliter:分隔符 RETURNS @tb TABLE(ch NVARCHAR(max)) AS BEGIN DECLARE @Num INT,@ ...