libcurl模拟hi百度登陆

转自:http://blog.csdn.net/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. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值