过了这么长时间才写测试程序,实在是对不起自己,说好的坚持都忘了,废话不说了。
头文件:
kuaipan.h
- #ifndef __KUAIPAN__
- #define __KUAIPAN__
- 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[]);
- #endif
最后一个函数的实现:
kuaipan.c
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- #include "base64.h"
- #include "url_encode.h"
- #include "hmac_sha1.h"
- #include "kuaipan.h"
- extern int URLEncode(
- const char* str,
- const int strSize,
- char* result,
- const int resultSize
- );
- extern char* base64_encode(const char* data, int data_len);
- extern char* hmac_sha(
- char* k, /* secret key */
- int lk, /* length of the key in bytes */
- char* d, /* data */
- int ld, /* length of data in bytes */
- char* out, /* output buffer, at least "t" bytes */
- int t
- );
- 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[])
- {
- //char* oauth_signature=(char*)malloc(1024*sizeof(char));
- char obj[1024]="",d[1024]="",out[1024]="";
- int lk=0,ld=0,t=0;
- //char url[1024]="";
- char consumer_key[1024]="";
- char nonce[1024]="";
- char signature_method[1024]="";
- char timestamp[1024]="";
- char version[1024]="";
- //sprintf(url,"%s&
- sprintf(consumer_key,"oauth_consumer_key=%s",oauth_consumer_key);
- sprintf(nonce,"&oauth_nonce=");
- sprintf(signature_method,"&oauth_signature_method=%s",oauth_signature_method);
- sprintf(timestamp,"&oauth_timestamp=%s",oauth_timestamp);
- sprintf(version,"&oauth_version=%s",oauth_version);
- strcat(d,"GET&");
- //printf("src=%s\n",d);
- //strcat(d,"&",1);
- URLEncode(http_url,strlen(http_url),obj,1024);
- strcat(d,obj);
- //printf("src=%s\n",d);
- strcat(d,"&");
- URLEncode(consumer_key,strlen(consumer_key),obj,1024);
- strcat(d,obj);
- //printf("src=%s\n",d);
- URLEncode(nonce,strlen(nonce),obj,1024);
- strcat(d,obj);
- strcat(d,oauth_nonce);
- //printf("src=%s\n",d);
- URLEncode(signature_method,strlen(signature_method),obj,1024);
- strcat(d,obj);
- //printf("src=%s\n",d);
- URLEncode(timestamp,strlen(timestamp),obj,1024);
- strcat(d,obj);
- URLEncode(version,strlen(version),obj,1024);
- strcat(d,obj);
- printf("src=%s\n%d\n",d,strlen(d));
- ld=strlen(d);
- lk=strlen(consumer_secret);
- char *hmac_shastr=(char*)hmac_sha(consumer_secret,lk,d,ld,out,20);
- int hmac_shalen=strlen(hmac_shastr);
- printf("hmac_shastr=%s\n",hmac_shastr);
- int base64_encodelen=strlen((char*)base64_encode(hmac_shastr, hmac_shalen));
- URLEncode(base64_encode(hmac_shastr,hmac_shalen),base64_encodelen,obj,1024);
- strcat(oauth_signature,obj);
- //strcat(oauth_signature,"\0");
- printf("%s\n%d\n",oauth_signature,strlen(oauth_signature));
- return 1;
- //return oauth_signature;
- }
上面就是最后一个程序的函数实现了
test_kuaipan.c
- #include <curl/curl.h>
- //#include <curl/types.h>
- #include <curl/easy.h>
- #include <string.h>
- #include <stdlib.h>
- #include "kuaipan.h"
- FILE *fp; //定义FILE类型指针
- extern char* get_nonce();
- 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[]);
- size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream); //这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的
- int main(int argc, char *argv[])
- {
- char consumer_key[]="你的consumer_key";
- char consumer_secret[]="你的consumer_secret";
- char oauth_signature_method[]="HMAC-SHA1";
- char oauth_signature[2048];
- memset(oauth_signature,0,2048);
- //char request_method[]="GET";
- char http_url1[]="https://openapi.kuaipan.cn/open/requestToken";
- //const char oauth_timestamp;
- char oauth_version[]="1.0";
- char oauth_timestamp[40]="";
- char oauth_nonce[1024]="";
- strcpy(oauth_nonce,(char*)get_nonce());
- sprintf(oauth_timestamp,"%d",(int)time(0));
- //char oauth_signature
- get_signature(http_url1,consumer_key,oauth_nonce,oauth_signature_method, oauth_timestamp, oauth_version,consumer_secret,oauth_signature);
- CURL *curl;
- char url_base[2048]="";
- //strncpy(url_base,http_url1,strlen(http_url1));
- 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);
- printf("%s\n",url_base);
- curl_global_init(CURL_GLOBAL_ALL);
- curl=curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_URL,url_base);
- if((fp=fopen("touch.txt","w"))==NULL)
- {
- curl_easy_cleanup(curl);
- exit(1);
- }
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理
- curl_easy_perform(curl);
- curl_easy_cleanup(curl);
- //exit(0);
- return 0;
- }
- size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) //这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的
- {
- int written = fwrite(ptr, size, nmemb, (FILE *)fp);
- return written;
- }
程序测试使用了libcurl库,所以要确保你的电脑已经安装了libcurl库,具体版本看头文件我注释了的那个,因为libcurl库已经不支持了。
这次就上传源码了
(完)