libcurl模拟hi百度登陆

C/C++实现百度API GET请求 简介: 个人项目中有时候需要用到百度提供的API服务,GET请求在其他高级语言中已经直接提供了,但在C语言中需要自行编写GET请求或者直接使用开源的包,对于网络编程还是比较熟悉了,但是在使用一些免费服务时需要GET请求,于是自己利用C/C++语言编写了一个简单的GET请求工具。 原理: 不管再该高级的语言实现的GET请求他都脱离不了基本的网络通信和HTTP协议,所以这里使用网络通信编程技术和 阅读详情

转自:http://blog.youkuaiyun.com/zengraoli/article/details/11517209

题外话:

      话说某大型论坛,每天都有不少网友瞄准00.00发表文章,争取拿到当天第一签。某牛某天兴致大发,在Linux下,利用crond定时在00:00运行一个shell脚本程序来发表文章,于是日日得到第一签,引来不少网友羡慕。不必羡慕,看完这篇文章,稍加揣摩,查查资料,你也可以做到了。


一、curl与libcurl介绍


    网上关于curl介绍的通常说法是:


     curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER,TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道( proxy tunneling),甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。Windows操作系统下的网络蚂蚁,网际快车(FlashGet)的功能它都可以做到。准确的说,curl支持文件的上传和下载,所以是一个综合传输工具,但是按照传统,用户习惯称curl为下载工具。
    
    curl是使用libcurl实现的,而libcurl提供了各种语言的库,方便开发者使用,由于我只了解C语言,所以下面例子使用C语言API。

    在看下面内容之前,请先看懂这个example:http://curl.haxx.se/lxr/source/docs/examples/simple.c看懂之后再看:http://curl.haxx.se/lxr/source/docs/examples/postit2.c。


二、实例

     使用libcurl库下载hi百度个人私有日志,首先必须用抓包工具抓取hi百度登陆的几个数据包研究,总结规律,然后用libcurl模拟。
     通过对hi百度登陆流程,数据包的观察,登陆过程大致分为3步:
      1)打开https://passport.baidu.com/?login页面,百度的服务器会在你的页面写一个sessionid,sessionid存在cookie中;
      2)用户输入帐号密码,点击登陆,浏览器会发送帐号密码,还有第一步保存的cookie,到https://passport.baidu.com/?login;这里需要特别注意,如果没有发送第一步保存的cookie,服务器会要你填写验证码,而验证码是图片信息,我们无从获取,所以第一步保存cookie是必须的。
      3)服务器验证帐号密码,cookie里面的sessionid,正确则再发送两个sessionid给浏览器,以后浏览器获取页面都会发送这两个sessionid回服务器验证。

      了解这些之后,用libcurl c API实现三个小程序来获取一个被我设置为个人私有的页面,这三个小程序最好是写成一个程序来,考虑到为了给初学者一个清晰的思路,用三个小程序对应上面描述的三个步骤,程序代码见附录。
      看到这里,也许你会说,何必这么麻烦,我用帐号密码登陆也可以看到自己的私有文章。这里最重要的是演示如何用libcurl模拟网站的登陆过程,登陆之后要做什么就随便你了。如果你是想搞破坏了,也很简单,把下面的程序改成灌水机就可以了,不过建议别这么做,小心被封帐号或IP,当然,你可以申请多个帐号,把你的程序做成木马,用别人的肉机来灌水。但是奉劝一句:出来混早晚要还的,把技术用来"为人民服务"吧!
      
      在结束这篇文章之前,得说明一下,如果你是UNIX类用户,直接用curl就可以方便实现下面的功能,只要几条语句,这也就是开篇说的shell程序的内容了。


附录:

  1. /*************open_login_page.c***********/  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <curl/curl.h>  
  5. #include <curl/types.h>  
  6. #include <curl/easy.h>  
  7. int main(int argc, char *argv[])  
  8. {  
  9. CURL *curl;  
  10. CURLcode res;  
  11. struct curl_slist *headerlist=NULL;  
  12. static const char buf[] = "Expect:";  
  13. curl_global_init(CURL_GLOBAL_ALL);  
  14. curl = curl_easy_init();  
  15. headerlist = curl_slist_append(headerlist, buf);  
  16. if(curl)   
  17. {  
  18.     curl_easy_setopt(curl, CURLOPT_URL, "https://passport.baidu.com/?login");  
  19.     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  
  20.     curl_easy_setopt(curl, CURLOPT_COOKIEJAR,"cookie_open.txt");//把服务器发过来的cookie保存到cookie_open.txt  
  21. #ifdef SKIP_PEER_VERIFICATION  
  22.     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  23. #endif  
  24. #ifdef SKIP_HOSTNAME_VERFICATION  
  25.     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  
  26. #endif  
  27.     res = curl_easy_perform(curl);  
  28.     /* always cleanup */  
  29.     curl_easy_cleanup(curl);  
  30.     /* free slist */  
  31.     curl_slist_free_all(headerlist);  
  32. }  
  33. return 0;  
  34. }  

  1. /********************login_hi_baidu*****************/  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <curl/curl.h>  
  5. #include <curl/types.h>  
  6. #include <curl/easy.h>  
  7. int main(int argc, char *argv[])  
  8. {  
  9. CURL *curl;  
  10. CURLcode res;  
  11. struct curl_slist *headerlist=NULL;  
  12. static const char buf[] = "Expect:";  
  13. curl_global_init(CURL_GLOBAL_ALL);  
  14. curl = curl_easy_init();  
  15. headerlist = curl_slist_append(headerlist, buf);  
  16. if(curl)   
  17. {  
  18.     curl_easy_setopt(curl, CURLOPT_URL, "https://passport.baidu.com/?login");  
  19.     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  
  20.     curl_easy_setopt  
  21. (curl,CURLOPT_POSTFIELDS,"username=s_yqguo&password=&psp_tt=0&safeflg=0&return_method=get&u=http://hi.baidu.com/s%  
  22. 5Fyqguo");//设置帐号密码,其余的信息是页面要求的,抓包即可看见。  
  23.     curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"cookie_open.txt");//提交第一步保存的cookie  
  24.     curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"cookie_login.txt");//保存登陆后的cookie  
  25. #ifdef SKIP_PEER_VERIFICATION  
  26.     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  27. #endif  
  28. #ifdef SKIP_HOSTNAME_VERFICATION  
  29.     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  
  30. #endif  
  31.     res = curl_easy_perform(curl);  
  32.     /* always cleanup */  
  33.     curl_easy_cleanup(curl);  
  34.     /* free slist */  
  35.     curl_slist_free_all(headerlist);  
  36. }  
  37. return 0;  
  38. }  

  1. /************download_private_page.c******************/  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <curl/curl.h>  
  5. #include <curl/types.h>  
  6. #include <curl/easy.h>  
  7. static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)  
  8. {  
  9.    int written = fwrite(ptr, size, nmemb, (FILE *)stream);  
  10.    return written;  
  11. }  
  12. int main(int argc, char *argv[])  
  13. {  
  14. CURL *curl;  
  15. CURLcode res;  
  16. static const char *headerfilename = "head.out";  
  17. FILE *headerfile;  
  18. static const char *bodyfilename = "body.html";  
  19. FILE *bodyfile;  
  20. struct curl_slist *headerlist=NULL;  
  21. static const char buf[] = "Expect:";  
  22. curl_global_init(CURL_GLOBAL_ALL);  
  23. curl = curl_easy_init();  
  24. headerlist = curl_slist_append(headerlist, buf);  
  25. if(curl)   
  26. {  
  27.     //拉取私有页面  
  28.     curl_easy_setopt(curl, CURLOPT_URL, "http://hi.baidu.com/s_yqguo/blog/item/c4e99e58d7ec9d86800a18a2.html");  
  29.     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  
  30.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);  
  31.     headerfile = fopen(headerfilename,"w");  
  32.     if (headerfile == NULL)   
  33.     {  
  34.       curl_easy_cleanup(curl);  
  35.       curl_global_cleanup();  
  36.       curl_slist_free_all(headerlist);  
  37.       printf("open head.out file failed!\n");  
  38.       return -1;  
  39.     }  
  40.     bodyfile = fopen(bodyfilename,"w");  
  41.     if (bodyfile == NULL)   
  42.     {  
  43.       curl_easy_cleanup(curl);  
  44.       curl_global_cleanup();  
  45.       curl_slist_free_all(headerlist);  
  46.       printf("open body.html file failed!\n");  
  47.       return -1;  
  48.     }  
  49.     curl_easy_setopt(curl,CURLOPT_WRITEHEADER, headerfile);  
  50.     curl_easy_setopt(curl,CURLOPT_WRITEDATA,bodyfile);  
  51.     curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"cookie_login.txt");//把第二步保存的cookie发送给服务器验证  
  52. #ifdef SKIP_PEER_VERIFICATION  
  53.     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  54. #endif  
  55. #ifdef SKIP_HOSTNAME_VERFICATION  
  56.     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  
  57. #endif  
  58.     res = curl_easy_perform(curl);  
  59.     /* always cleanup */  
  60.     curl_easy_cleanup(curl);  
  61.     /* free slist */  
  62.     curl_slist_free_all(headerlist);  
  63.     curl_global_cleanup();  
  64.     if(headerfile != NULL)  
  65.    fclose(headerfile);  
  66.     if(bodyfile != NULL)  
  67.        fclose(bodyfile);  
  68. }  
  69. return 0;  
  70. }  

用C++打开指定网址 用C++打开指定网址原理——》system(“命令”) 就像这样: #include <bits/stdc++.h> using namespace std; int main() { system("start "网址""); return 0; } 上面是主体的框架 下面我们就来实践一下(打开360 百度): #include <bits/stdc++.h> using namespace std; int main() { system("start https:/ 阅读详情

相关推荐

C++ 访问 百度AI 通用文字识别(标准版)

第一步:成为百度AI开放平台的开发者 第二步,创建一个应用,获取app_id、api_key、secret_key 第三步,下载官方C++ SDK源码: aip-cpp-sdk-4.15.8.zip 第四步:打开官方源码,并且下载相应包 核心代码: int main() { aip::Ocr client(app_id, api_key, secret_key); Json::Value result; std::string.

h a 6 6 6 c k 为 你解决复杂难题! 1308

libcurl获取网页内容的C/C++代码

我们之前用socket API写过访问百度服务的程序, 今天我们用libcurl来写写。 实际上后者是对前者的封装。 代码如下(注意:你要包含curl.h文件, 并在makefile中加入对应的静态库, 否则编译不过):

认知 行动 坚持 3万+

利用c++语言打开百度网页,并允许搜索、

利用c++语言打开百度网页,并允许搜索。 本小程序为某个女孩写的,所以永久免费了。利用cmd方式打开浏览器,并允许输入文字,进行百度搜索。

编程实现调用libcurl库访问百度

libcurl相关API介绍 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程: 调用curl_global_init()初始化libcurl 调用 curl_easy_init()函数得到 easy interface型指针 调用curl_easy_setopt设置传输选项 根据curl_easy_set

cyh20001027的博客 429

用友U8其中一个账套提示演示期已到期-修复方法

【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序...

u010431289的博客 2万+

第1期技术: DQN算法原理及实现过程

利用神经网络近似值函数的方法表示为: V^(s,w)≈Vπ(s)q^(s,a,w)≈qπ(s,a) \hat{V}(s, w) \approx V_{\pi}(s) \\ \hat{q}(s, a, w) \approx q_{\pi}(s, a) V^(s,w)≈Vπ​(s)q^​(s,a,w)≈qπ​(s,a) 那么具体的工作过程是怎样实现的? 以及如何从端到端的过程,本文将讲解Deep Q Network(DQN, 而这正是由DeepMind于2013年和2015年分别提出的两篇论文《Playi

深度强化学习实验室:一个“开源开放、共享共进”的强化学习学术组织。 4953

库的使用--用libcurl库访问百度

库的使用--用libcurl库访问百度 学习内容: 步骤一:库下载 https://github.com/curl/curl/releases/tag/curl-7_71_1 步骤二:放进去linux里面 步骤三:创建文件夹然后进去 mkdir httpHandler cd httpHandler/ 步骤四:放到zeus(你的路径)下 ~相当于zeus 步骤五:解压 步骤六:进入到这个文件夹(以后的开源包几乎都这样) 步骤七:读 README(看作者)vi README(不是必须) 步骤八:看相关文

weixin_45361450的博客 364

SurfaceControlViewHost使用介绍

可以看到,主要用途:是把一个进程的View显示到另外一个进程里面。

chadm.xiang 1283

c++封装HTTP GET请求访问网站

运行环境:VS2013 功能:模拟浏览器访问百度 具体代码如下 #include <iostream> #include <WinSock2.h> #include <WS2tcpip.h> #include <sstream> #pragma comment(lib,"ws2_32.lib") int main() { //初始化配置...

c_shell_python的博客 2730

【Collibra 驱动 IPD 数据血缘治理】:三层图谱分层展示体系与全链路追踪的技术业务实践

(应用级/数据级/字段级)是理解复杂数据流动的核心手段。其价值不仅体现在可视化的直观性,更在于通过。技术保障血缘不可篡改性,进一步提升IPD数据治理的可靠性。,解决了跨层级血缘分析的性能与可用性矛盾。数据血缘图谱要素定义(字节跳动/腾讯云/信安标委)实现对IPD数据的精准追踪,而数据血缘图谱的。分层交互设计标准(智慧城市数据中台规范)Collibra技术文档(2024)字段级血缘的挑战与解决路径。自动优化血缘路径,并深化。字段级血缘技术实现方案。Collibra通过。图数据库性能优化原理。

百态·数智思维 | 聚焦大数据、量化与未来AI 1242

【视线追踪】视线追踪的性能评估框架 及 基础知识

文章目录一、 前言二、 眼球追踪基础1. 眼动类型研究2. 基本设备3. 校准 calibration4. 眼球视线和头部姿态的关系5. 视线追踪精确度的评估三、 视线估计算法1. 基于2维回归2. 基于3D模型1) 单摄像头2) 多摄像头3. 基于交叉比4. 基于外观5. 基于眼睛形状的方法四、 实现估计的应用1. 电脑2. 电视3. 头戴设备4. 汽车5. 手持设备6. 设备配置五、 视线追踪的性能指标和错误原因1. 不同平台之间差异性很大2. 影响视线追踪可用性的因素六、 视线追踪系统的性能评估框架1

火火的博客 5307

libcurl模拟hi百度登陆libcurl模拟hi百度登陆

2009-02-21 23:35题外话:     话说某大型论坛,每天都有不少网友瞄准00.00发表文章,争取拿到当天第一签。某牛某天兴致大发,在Linux下,利用crond定时在00:00运行一个shell脚本程序来发表文章,于是日日得到第一签,引来不少网友羡慕。不必羡慕,看完这篇文章,稍加揣摩,查查资料,你也可以做到了。一 curl与libcurl介绍

yjfkpyu的专栏 1721

[RK3568 Android11] 开发之调试RK809 codec音频-SPK喇叭

目录 前言 一、注册声卡顺序 二、SPK喇叭路由配置 三、tinyalsa调试工具 前言 瑞芯微RK809是一种复杂的功率管理集成电路(PMIC)集成编解码器,适用于由外部电源供电的多核系统应用;同时它也集成了音频编解码器,这样在硬件设计上可以直接使用RK809 codec功能,不必再外挂个其他codec芯片;RK809 codec不仅支持SPK,还支持耳机,MIC功能; 一、注册声卡顺序 设备树dts里面原厂帮我们配置好了rk809_sound,我们直接...

~未来可期~ 7412

C/C++实现HTTPS通信(抓取百度页面)

#include &lt;WINSOCK2.H&gt; #include &lt;openssl/ssl.h&gt; #include &lt;openssl/err.h&gt; #include &lt;iostream&gt; #include &lt;sstream&gt; #pragma comment(lib,"libeay32.lib") #pragma comment(li...

ZRXSLYG的博客 2万+

nvidia系列教程-AGX-Orin基础环境搭建

NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低功耗的边缘计算应用设计。无论是自动驾驶、机器人,还是智能监控系统,Jetson AGX Orin 都能为这些应用提供强大的计算能力。本篇博客将为大家详细介绍如何在AGX Orin(32GB)上搭建基础开发环境,包括系统安装、CUDA和cuDNN的配置等,帮助你快速上手这个强大的平台。架构: 搭载 56 个 Tensor Core 的 1792 核 NVIDIA Ampere c GPUCUDA Cores。

flypig has a dream! 2796

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图(附源码)

上一节我们讨论了纹理贴图的相关基础操作,但上一节的纹理贴图操作基本上都是规则图形,包括圆形和球形虽然复杂一点,但是它也是规则的。这一节课我们要讨论一下,怎么在不规则图形上纹理贴图,就比如文章下图的心形纹理贴图,以及纹理的平移、旋转、放大缩小功能。

zhooyu的博客 1307

libcurl教程

无

qq_43812868的博客 2687

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

curl库函数 说明

目录索引: 一、LibCurl基本编程框架libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。想要知道更多关于libc...

萧西朗的博客 5760

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

libcurl 笔记

来自https://curl.haxx.se/libcurl/c/libcurl-tutorial.html 初始化 参数指定要初始化的模块 curl_global_init(CURL_GLOBAL_ALL); CURL_GLOBAL_WIN32 CURL_GLOBAL_SSL 当不再使用libcurl时调用:curl_global_cleanup();查询libcurl支持的特性curl_versio

一直被超越,从未被模仿 1040

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ POST请求调用百度AI OCR

阅读本文前先看这篇文章:c++调用百度AI OCR SDK 一.鉴权认证机制 1.百度通用参考:鉴权认证机制 简介 本文档主要针对HTTP API调用者,百度AIP开放平台使用OAuth2.0授权调用开放API,调用API时必须在URL中带上access_token参数,获取Access Token的流程如下: 获取Access Token 请求URL数据格式 向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL

Greless的后花园 1976

libcurl库简单使用

文章目录一、简介二、常用的基本函数2.1 CURLcode curl_global_init(long flags);2.2 void curl_global_cleanup(void)2.3 char *curl_version( )2.4 CURL *curl_easy_init( );2.5 void curl_easy_cleanup(CURL *handle);2.6 CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parame

u012477435的博客 1369
上一篇: libcurl 库的ftp上传和下载代码
下一篇: C++ 用libcurl库进行http 网络通讯编程
「已注销」
博客等级 码龄14年 116粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值