c++ - 使用libcurl中发送带cookie的请求失败了

 农大军乐团_697 发布于 2022-11-08 00:52

需求

获取自己的CSDN资源下载列表的数据
步骤:
1.登录csdn(已成功)
2.获取登录成功后的cookie,并保存到本地(mycookie.txt)(也已成功)
3.使用之前获取的cookie访问CSDN资源下载列表(失败)

代码我已经精简了下,方便各位同仁测试(只要先使用其他浏览器登录下csdn,就可以得到cookie,然后,手动将得到的cookie复制到代码中就可以进行测试)

备:libcurl刚接触,碰到一个cookie问题,搞了下午,不仅焦头烂额而且还没成功,找不到失败的原因,如果大家方便的话,还麻烦帮忙小测试下,再次先感谢大家的帮忙~!

使用libcurl发送消息头(附带cookie信息)的时候,服务端返回“请先登录”的信息。
cookie信息是没错的,请会的朋友帮我看下,是不是发送cookie信息的写法有问题呢?


long writer(void *data, int size, int nmemb, string &content) { long sizes = size * nmemb; string temp((char*)data,sizes); content += temp; return sizes; } bool CurlInit(CURL *&curl, const char* url,string &content) { CURLcode code; string error; curl = curl_easy_init(); if (curl == NULL) { printf( "Failed to create CURL connection\n"); return false; } code = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); if (code != CURLE_OK) { printf( "Failed to set error buffer [%d]\n", code ); return false; } curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); code = curl_easy_setopt(curl, CURLOPT_URL, url); if (code != CURLE_OK) { printf("Failed to set URL [%s]\n", error); return false; } code = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); if (code != CURLE_OK) { printf( "Failed to set redirect option [%s]\n", error ); return false; } //writer:回调函数 code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer); if (code != CURLE_OK) { printf( "Failed to set writer [%s]\n", error); return false; } //回调函数的参数:content code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content); if (code != CURLE_OK) { printf( "Failed to set write data [%s]\n", error ); return false; } return true; } void GetDownloadList(int pageNum) { CURL *easy_handle; CURLcode res; curl_global_init(CURL_GLOBAL_ALL); easy_handle = curl_easy_init(); if(easy_handle) { string content; //get参数 char url[128] = {0}; sprintf(url,"http://download.csdn.net/my/downloads/%d",pageNum); //http请求头 struct curl_slist *headers = NULL; 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:download.csdn.net"); headers = curl_slist_append(headers,"Referer:http://www.csdn.net/"); 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,"Accept-Encoding:gzip, deflate"); headers = curl_slist_append(headers,"Connection:keep-alive"); headers = curl_slist_append(headers,"Cookie:UserName=用户名;UserInfo=userinfo信息(直接从火狐浏览器抓取)"); //发送http请求头 curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(easy_handle, CURLOPT_URL, url); if ( !CurlInit(easy_handle,url,content) ) { printf( "Failed to global init default [%d]\n" ); return; } //执行http请求 res = curl_easy_perform(easy_handle); if(res != CURLE_OK) fprintf(stderr,"curl_easy_perform() failed: %s\n",curl_easy_strerror(res)); double length = 0; res = curl_easy_getinfo(easy_handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD , &length); FILE * file = fopen("1.html","wb"); fseek(file,0,SEEK_SET); fwrite(content.c_str(),1,length,file); fclose(file); //释放资源 curl_slist_free_all(headers); curl_easy_cleanup(easy_handle); } curl_global_cleanup(); } int _tmain(int argc, _TCHAR* argv[]) { GetDownloadList(1); getchar(); return 0; }

返回信息












Python代码
注:之前使用python代码也写过一个,可以成功获取,代码也顺便贴上,借此,可以发现和C++中的http消息请求头其实是一样的

#获取之前下载的资源列表
def GetDownloadList(page):
    #get参数
    url="http://download.csdn.net/my/downloads/"+page
    #http请求头
    #经过测试,只需发送UserName和UserInfo这2个cookie值即可
    headers={"Host": "download.csdn.net",
             "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0",
             "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
             "Accept-Language":"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
             "Accept-Encoding":"gzip, deflate",
             "Referer":"http://www.csdn.net/",
             "Connection":"keep-alive",
         "Cookie":"UserName="+cookies["UserName"]+";UserInfo="+cookies["UserInfo"]

    }
    r = requests.get(url,headers = headers)
    return r.text

1 个回答
  • headers = curl_slist_append(headers,"Cookie:UserName=用户名;UserInfo=userinfo信息(直接从火狐浏览器抓取)");
    

    改成

    curl_easy_setopt(easy_handle, CURLOPT_COOKIE,"UserName=用户名;UserInfo=userinfo信息(直接从火狐浏览器抓取)");
    

    试试

    2022-11-12 01:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有