VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
来源:互联网 发布:从化数据 编辑:程序博客网 时间:2024/04/29 20:26
环境:Win7 64位+VC2008
软件及源码下载:(http://pan.baidu.com/s/1jGE52pK)
涉及到的知识点:
C++多线程编程
libcurl的使用(包括发送http请求、发送cookie给服务器、保存cookie)
关于libcurl的资料,推荐大家参考下官方文档:http://curl.haxx.se/libcurl/c/example.html
软件运行结果
原帖提供的源码已经不可用,改了下提供的源码自己的又可以登录自动评价了(2015年2月10日00:53:10)如图:
添加两张HttpWatch的使用图
1:这个就不用多说了,大家都是明白人,这个就是登录第一步访问的url地址2:刚才忘了说,这个列表包括了请求和返回的全部数据包3:post请求,以及访问该网站的路径地址,4:这个微信网站用来防止外链登录的,一开始试登录的时候忘了加这个,然后总是奇怪登录不上,然后把head字段一个个试才知道是需要这个字段;5:这个也必须得写上,因为有点网站禁止了一些随意的抓包,所以必须得模拟你所在的运行环境。不让服务器发送你是抓包;6:这个是post的数据列表;7:这个就是服务器那边需要在本地设置的cookie值,这个得缓存起来,然后在后面的操作发送给服务器,因为服务器有时会用到某些值,如果没有的话就不好办了, 你懂的;8:这个就是登录操作返回过来的结果,具体的数据就要看自己分析了,这里的数据是一个json字符串,
libcurl中的所有函数
curl_easy_duphandle
curl_easy_escape
curl_easy_getinfo
curl_easy_init
curl_easy_pause
curl_easy_perform
curl_easy_recv
curl_easy_reset
curl_easy_send
curl_easy_setopt
curl_easy_strerror
curl_easy_unescape
curl_escape (deprecated, do not use)
curl_formadd
curl_formfree
curl_formget
curl_free
curl_getdate
curl_getenv (deprecated, do not use)
curl_global_cleanup
curl_global_init
curl_global_init_mem
curl_mprintf (deprecated, do not use)
curl_multi_add_handle
curl_multi_assign
curl_multi_cleanup
curl_multi_fdset
curl_multi_info_read
curl_multi_init
curl_multi_perform
curl_multi_remove_handle
curl_multi_setopt
curl_multi_socket
curl_multi_socket_action
curl_multi_strerror
curl_multi_timeout
curl_share_cleanup
curl_share_init
curl_share_setopt
curl_share_strerror
curl_slist_append
curl_slist_free_all
curl_strequal (deprecated, do not use)
curl_strnequal (deprecated, do not use)
curl_unescape (deprecated, do not use)
curl_version
curl_version_info
描述:这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它将由libcurl库自动完成。
参数:flags
CURL_GLOBAL_ALL //初始化所有的可能的调用。
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化。
描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。
char *curl_version( );
一般curl_easy_init意味着一个会话的开始. 它的返回值一般都用在easy系列的函数中
参数:CURL类型的指针.
描述: 这个函数最重要了.几乎所有的curl 程序都要频繁的使用它.
它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.
(这个函数有些像ioctl函数)
参数:
1 CURL类型的指针
2 各种CURLoption类型的选项.(都在curl.h库里有定义,man 也可以查看到)
3 parameter 这个参数 既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量.它用什么这取决于第二个参数.
CURLoption 这个参数的取值很多.具体的可以查看man手册.
option 运作起来.
参数:
CURL类型的指针
如何操作cookie
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt");
- curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE, "cookie.txt");
模拟登录csdn
- ReturnInfo CCSDNDlg::LoginServer(CString strUser,CString strPass)
- {
- ReturnInfo returnInfo;
- returnInfo.bReturn = FALSE;
- CURL *curl;
- CURLcode res;
- struct curl_slist *headers = NULL;
- curl_global_init(CURL_GLOBAL_ALL);
- curl = curl_easy_init();
- if(curl){
- //初始化cookie引擎
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
- curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION, 1L);
- //http请求头
- headers = curl_slist_append(headers,"User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0"); //模拟浏览器
- headers = curl_slist_append(headers,"Host:passport.csdn.net");
- headers = curl_slist_append(headers,"Accept:*/*");
- headers = curl_slist_append(headers,"Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
- headers = curl_slist_append(headers,"Accept-Encoding:gzip, deflate");
- headers = curl_slist_append(headers,"X-Requested-With:XMLHttpRequest");
- headers = curl_slist_append(headers,"Referer:https://passport.csdn.net/account/loginbox?callback=logined&hidethird=1&from=http%3a%2f%2fwww.csdn.net%2f");
- headers = curl_slist_append(headers,"Connection:keep-alive");
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie.txt"); //把服务器发过来的cookie保存到cookie.txt
- //发送http请求头
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
- char url[256];
- sprintf(url,"http://passport.csdn.net/ajax/accounthandler.ashx?t=log&u=%s&p=%s&remember=0&f=http%3A%2F%2Fwww.csdn.net%2F&rand=0.47590136872096434",strUser,strPass);
- curl_easy_setopt(curl, CURLOPT_URL,url);
- string content;
- //设置回调函数
- res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
- res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
- //执行http请求
- res = curl_easy_perform(curl);
- string returnVal;
- Utf8ToMb((char*)content.c_str(),content.length(),returnVal);
- int pos = returnVal.find("\"status\":true");
- if ( pos >= 0){
- returnInfo.bReturn = TRUE;
- int nStartPos = content.find("data\":");
- int nEndPos = content.rfind("\"}}");
- returnInfo.data = content.substr(nStartPos+6,nEndPos - nStartPos-4);
- }else{
- int nStartPos = returnVal.find("error\":");
- int nEndPos = returnVal.find("data\":",nStartPos);
- returnInfo.strErrorInfo = returnVal.substr(nStartPos+8,nEndPos-nStartPos-11);
- }
- //释放资源
- curl_easy_cleanup(curl);
- curl_slist_free_all(headers);
- headers = NULL;
- }
- curl_global_cleanup();
- return returnInfo;
- }
根据给定的网址获取网页源码
- static string GetHtmlPage(string url)
- {
- CURL *easy_handle;
- CURLcode res;
- string content;
- curl_global_init(CURL_GLOBAL_ALL);
- easy_handle = curl_easy_init();
- if( easy_handle )
- {
- //初始化cookie引擎
- curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,"");
- curl_easy_setopt(easy_handle,CURLOPT_TIMEOUT,5); //设置请求超时时间
- //curl_easy_setopt(easy_handle,CURLOPT_VERBOSE,1); //输出请求头和响应头
- //curl_easy_setopt(easy_handle,CURLOPT_HEADER,1);
- curl_easy_setopt(easy_handle,CURLOPT_FOLLOWLOCATION, 1L);
- //http请求头
- struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers,"Host: download.csdn.net");
- headers = curl_slist_append(headers,"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
- headers = curl_slist_append(headers,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
- headers = curl_slist_append(headers,"Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
- headers = curl_slist_append(headers,"Referer: http://www.csdn.net/");
- headers = curl_slist_append(headers,"Connection: keep-alive");
- curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers);
- curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE, "cookie.txt"); //读取本地存储的cookie
- if(!InitCurl(easy_handle,res,url,content))
- {
- //释放资源
- curl_slist_free_all(headers);
- curl_easy_cleanup(easy_handle);
- return NULL;
- }
- //释放资源
- curl_slist_free_all(headers);
- curl_easy_cleanup(easy_handle);
- }
- curl_global_cleanup();
- string tt;
- Utf8ToMb((char *)content.c_str(),content.length(),tt);
- return tt;
- }
获取下载资源总页数
- static int GetTotalPageNum()
- {
- string url = "http://download.csdn.net/my/downloads/1";
- string html = GetHtmlPage(url);
- int nPos = html.rfind("尾页");
- if (nPos == -1)
- return -1;
- nPos -= 2;
- int nStartPos = html.rfind("/",nPos);
- string strTotal = html.substr(nStartPos+1,nPos - nStartPos - 1);
- return atoi(strTotal.c_str());
- }
获取待评论的资源列表
- static vector<DownResourceInfo> GetToCommentList(int pageNum)
- {
- vector<DownResourceInfo> vtDownload;
- char url[128] = {0};
- sprintf(url,"http://download.csdn.net/my/downloads/%d",pageNum);
- string html = GetHtmlPage(url);
- int nPos = 0;
- int n = 0;
- int flag = 1;
- while((nPos = html.find("#comment",n)) != -1)
- {
- n = nPos+1;
- int nStartPos = html.rfind("/",nPos);
- string strUrl = html.substr(nStartPos+1,nPos - nStartPos -1);
- DownResourceInfo info;
- info.strResourceCurl = strUrl;
- //获取资源的名字
- nStartPos = html.find(strUrl,nPos+1);
- if(nStartPos == -1)
- return vtDownload;
- nStartPos += 2;
- nStartPos += strUrl.length();
- int nEndPos = html.find("</a>",nStartPos);
- string ResourceName = html.substr(nStartPos,nEndPos - nStartPos);
- info.strResourceName = ResourceName;
- vtDownload.push_back(info);
- }
- return vtDownload;
- }
发表评论
- static BOOL AddComment(string sourceId)
- {
- CURL *easy_handle;
- CURLcode res;
- string content;
- curl_global_init(CURL_GLOBAL_ALL);
- easy_handle = curl_easy_init();
- if( easy_handle )
- {
- //初始化cookie引擎
- curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE,"");
- curl_easy_setopt(easy_handle,CURLOPT_FOLLOWLOCATION, 1L);
- string url = "http://download.csdn.net/index.php/comment/post_comment?jsonpcallback=jsonp1385304626524&sourceid="+sourceId+"&content=%E9%9D%9E%E5%B8%B8%E6%84%9F%E8%B0%A2%EF%BC%8C%E8%BF%99%E8%B5%84%E6%BA%90%E6%88%91%E6%89%BE%E4%BA%86%E5%A5%BD%E4%B9%85%E4%BA%86%EF%BC%81&rating=5&t=1385304679900";
- string referer = "Referer: http://download.csdn.net/detail/wasdzxce/"+sourceId;
- //http请求头
- struct curl_slist *headers = NULL;
- headers = curl_slist_append(headers,"Host: download.csdn.net");
- headers = curl_slist_append(headers,"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
- headers = curl_slist_append(headers,"Accept: text/javascript, application/javascript, */*");
- headers = curl_slist_append(headers,"Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
- headers = curl_slist_append(headers,"Accept-Encoding: gzip, deflate");
- headers = curl_slist_append(headers,"Content-Type: application/x-www-form-urlencoded");
- headers = curl_slist_append(headers,"X-Requested-With: XMLHttpRequest");
- headers = curl_slist_append(headers,referer.c_str());
- headers = curl_slist_append(headers,"Connection: keep-alive");
- curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers);
- curl_easy_setopt(easy_handle, CURLOPT_COOKIEFILE, "cookie.txt"); //读取本地存储的cookie
- if(!InitCurl(easy_handle,res,url,content))
- {
- //释放资源
- curl_slist_free_all(headers);
- curl_easy_cleanup(easy_handle);
- curl_global_cleanup();
- return FALSE;
- }
- //释放资源
- curl_slist_free_all(headers);
- curl_easy_cleanup(easy_handle);
- }
- curl_global_cleanup();
- int pos = content.find("\"succ\":1");
- if (pos>=0)
- return TRUE;
- else
- return FALSE;
- }
原文地址:曾是土木人
- VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
- VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
- VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
- VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
- Android模拟登录评论CSDN
- CSDN自动评论返积分工具
- CSDN下载资源再评论不再返积分。
- python 模拟登录csdn并获取博客列表等操作
- 自动评论CSDN下载资源(httpclient)
- 360云盘自动登录、获取免费空间、上传并分享文件得积分[二]
- libcurl模拟登录
- PHP中使用CURL模拟登录并获取数据实例
- 使用selenium自动登录淘宝并获取cookie
- CSDN下载资源再评论不返积分2017-11-8 11:00
- python模拟登录csdn并获取首页文章写入MySQL中(二)
- CSDN下载自动评论
- 自动登录CSDN网站,并回复帖子
- PHP curl 模拟登录并获取数据
- Unity3D ShaderLab 静态贴图光照模型
- Unity中使用脚本LineRenderer(现行渲染器)画圆
- unity3d 摄像机跟随角色时被物体遮挡解决方案
- HTML全局属性
- 那些年我们一起追过的缓存写法(二)
- VC使用libcurl模拟登录CSDN并自动评论资源以获取积分
- NGUI之UIGrid
- Cocos2d-x 3.2 大富翁游戏项目开发-第二十五部分 大富翁股市
- ECMALL目录结构设置与数据库表
- Unity3D 学习 创建简单的按钮、相应事件
- C++6.0行号显示插件的安装和 字体设置问题
- 黑马程序员-IOS学习笔记-C语言基础复杂数据类型
- Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版
- 最全的libcurl库资源整理