过了这么长时间才写测试程序,实在是对不起自己,说好的坚持都忘了,废话不说了。

  头文件:

kuaipan.h

  1. #ifndef __KUAIPAN__ 
  2. #define __KUAIPAN__ 
  3.  
  4. int get_signature(char* http_url,char* oauth_consumer_key,char* oauth_nonce, char* oauth_signature_method,char* oauth_timestamp, char* oauth_version,char* consumer_secret,char oauth_signature[]); 
  5. #endif 

  最后一个函数的实现:

kuaipan.c

  1. #include <unistd.h> 
  2. #include <stdio.h> 
  3. #include <string.h> 
  4. #include <malloc.h> 
  5. #include "base64.h" 
  6. #include "url_encode.h" 
  7. #include "hmac_sha1.h" 
  8. #include "kuaipan.h" 
  9.  
  10. extern int URLEncode( 
  11.   const char* str,  
  12.   const int strSize,  
  13.   char* result,  
  14.   const int resultSize 
  15. ); 
  16. extern char* base64_encode(const char* data, int data_len);  
  17. extern char* hmac_sha( 
  18.   char* k, /* secret key */ 
  19.   int lk, /* length of the key in bytes */ 
  20.   char* d, /* data */ 
  21.   int ld, /* length of data in bytes */ 
  22.   char* out, /* output buffer, at least "t" bytes */ 
  23.   int t 
  24. ); 
  25. int get_signature(char* http_url,char* oauth_consumer_key,char* oauth_nonce, char* oauth_signature_method,char* oauth_timestamp, char* oauth_version,char* consumer_secret,char oauth_signature[]) 
  26.   //char* oauth_signature=(char*)malloc(1024*sizeof(char)); 
  27.   char obj[1024]="",d[1024]="",out[1024]=""
  28.   int lk=0,ld=0,t=0; 
  29.   //char url[1024]=""; 
  30.   char consumer_key[1024]=""
  31.   char nonce[1024]="";    
  32.   char signature_method[1024]="";   
  33.   char timestamp[1024]=""
  34.   char version[1024]=""
  35.   //sprintf(url,"%s& 
  36.   sprintf(consumer_key,"oauth_consumer_key=%s",oauth_consumer_key); 
  37.   sprintf(nonce,"&oauth_nonce="); 
  38.   sprintf(signature_method,"&oauth_signature_method=%s",oauth_signature_method); 
  39.   sprintf(timestamp,"&oauth_timestamp=%s",oauth_timestamp); 
  40.   sprintf(version,"&oauth_version=%s",oauth_version); 
  41.    
  42.   strcat(d,"GET&"); 
  43.   //printf("src=%s\n",d); 
  44.   //strcat(d,"&",1); 
  45.   URLEncode(http_url,strlen(http_url),obj,1024); 
  46.   strcat(d,obj); 
  47.   //printf("src=%s\n",d); 
  48.   strcat(d,"&"); 
  49.   URLEncode(consumer_key,strlen(consumer_key),obj,1024); 
  50.   strcat(d,obj); 
  51.   //printf("src=%s\n",d); 
  52.   URLEncode(nonce,strlen(nonce),obj,1024); 
  53.   strcat(d,obj); 
  54.   strcat(d,oauth_nonce); 
  55.   //printf("src=%s\n",d); 
  56.   URLEncode(signature_method,strlen(signature_method),obj,1024); 
  57.   strcat(d,obj); 
  58.   //printf("src=%s\n",d); 
  59.   URLEncode(timestamp,strlen(timestamp),obj,1024); 
  60.   strcat(d,obj); 
  61.   URLEncode(version,strlen(version),obj,1024); 
  62.   strcat(d,obj); 
  63.   printf("src=%s\n%d\n",d,strlen(d)); 
  64.   ld=strlen(d); 
  65.   lk=strlen(consumer_secret); 
  66.   char *hmac_shastr=(char*)hmac_sha(consumer_secret,lk,d,ld,out,20); 
  67.   int hmac_shalen=strlen(hmac_shastr); 
  68.   printf("hmac_shastr=%s\n",hmac_shastr); 
  69.   int base64_encodelen=strlen((char*)base64_encode(hmac_shastr, hmac_shalen)); 
  70.   URLEncode(base64_encode(hmac_shastr,hmac_shalen),base64_encodelen,obj,1024); 
  71.   strcat(oauth_signature,obj); 
  72.   //strcat(oauth_signature,"\0"); 
  73.   printf("%s\n%d\n",oauth_signature,strlen(oauth_signature)); 
  74.   return 1; 
  75.   //return oauth_signature; 

上面就是最后一个程序的函数实现了

test_kuaipan.c

  1. #include <curl/curl.h> 
  2. //#include <curl/types.h>   
  3. #include <curl/easy.h> 
  4. #include <string.h> 
  5. #include <stdlib.h> 
  6. #include "kuaipan.h" 
  7. FILE *fp; //定义FILE类型指针   
  8. extern char* get_nonce(); 
  9. extern int get_signature(char* http_url,char* oauth_consumer_key,char* oauth_nonce, char* oauth_signature_method,char* oauth_timestamp, char* oauth_version,char* consumer_secret,char oauth_signature[]); 
  10. size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream); //这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的   
  11. int main(int argc, char *argv[])   
  12. {   
  13.    
  14.   char consumer_key[]="你的consumer_key"
  15.   char consumer_secret[]="你的consumer_secret"
  16.   char oauth_signature_method[]="HMAC-SHA1"
  17.   char oauth_signature[2048]; 
  18.   memset(oauth_signature,0,2048); 
  19.   //char request_method[]="GET"; 
  20.   char http_url1[]="https://openapi.kuaipan.cn/open/requestToken"
  21.   //const char oauth_timestamp; 
  22.   char oauth_version[]="1.0"
  23.   char oauth_timestamp[40]=""
  24.   char oauth_nonce[1024]=""
  25.   strcpy(oauth_nonce,(char*)get_nonce()); 
  26.   sprintf(oauth_timestamp,"%d",(int)time(0)); 
  27.   //char oauth_signature 
  28.   get_signature(http_url1,consumer_key,oauth_nonce,oauth_signature_method, oauth_timestamp, oauth_version,consumer_secret,oauth_signature); 
  29.    
  30.    
  31.   CURL *curl;   
  32.   char url_base[2048]=""
  33.   //strncpy(url_base,http_url1,strlen(http_url1)); 
  34.    
  35.   sprintf(url_base,"%s?oauth_signature=%s&oauth_consumer_key=%s&oauth_nonce=%s&oauth_signature_method=HMAC-SHA1&oauth_timestamp=%s&oauth_version=1.0",http_url1,oauth_signature,consumer_key,oauth_nonce,oauth_timestamp); 
  36.   printf("%s\n",url_base); 
  37.   curl_global_init(CURL_GLOBAL_ALL);     
  38.   curl=curl_easy_init();   
  39.   curl_easy_setopt(curl, CURLOPT_URL,url_base);     
  40.  
  41.   if((fp=fopen("touch.txt","w"))==NULL)   
  42.   {   
  43.       curl_easy_cleanup(curl);   
  44.       exit(1);   
  45.   }   
  46.   curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理   
  47.   curl_easy_perform(curl);   
  48.   curl_easy_cleanup(curl);   
  49.   //exit(0);   
  50.   return 0; 
  51.  
  52.  
  53. size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) //这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的   
  54. {   
  55.     int written = fwrite(ptr, size, nmemb, (FILE *)fp);   
  56.     return written;   
  57. }   

程序测试使用了libcurl库,所以要确保你的电脑已经安装了libcurl库,具体版本看头文件我注释了的那个,因为libcurl库已经不支持了。

这次就上传源码了

(完)