/* void createnonce(char nonce[NONCE_LENGTH]) { int i,j; srand(time(NULL)); for(i=0; i < NONCE_LENGTH; i++) { j = random() % NONCE_CHARS; if(j < 10) nonce[i] = j + 48; else if(j < 36) nonce[i] = j + 55; else nonce[i] = j + 61; } } */ int post(const char *msg) { const char *request_uri = "http://api.twitter.com/1/statuses/update.json"; char *req_url = NULL; char *postarg = NULL; int argc = 2; char argv_utf8[BUF_SIZE]; char **argv = (char**)malloc(sizeof(char*) * 2); argv[0] = strdup(request_uri); snprintf(argv_utf8, sizeof(argv_utf8), "status= %s", msg); tcstrcututf(argv_utf8, MSG_SIZE); //** convert string to UTF-8 format (required by twitter API) argv[1] = strdup(argv_utf8); req_url = oauth_sign_array2(&argc, &argv, &postarg, OA_HMAC, NULL, consumer_key, consumer_secret, access_token, access_token_secret); free(argv[0]); free(argv[1]); free(argv); oauth_http_post2(req_url, postarg, "Expect: \r\n"); return 0; }
int plurk_api( key_pair* request ,key_pair* permanent ,const char* api_uri ,const char* invoke_method ,int arg_count, ... ) { char* request_uri = s_concate(&(plurk_url), &(plurk_uri_request)); char* api_url = s_concate( &(plurk_url) ,&(api_uri)); int argc = 0; int i = 0; char** argv = NULL; char* req_hdr = NULL; char* req_url = NULL; char* http_hdr = NULL; char* reply = NULL; char* postarg = NULL; argc = oauth_split_url_parameters(api_url, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, before add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif int arg_index; char* arg_from_valist; va_list vaarg; va_start(vaarg, arg_count); for (arg_index = 0; arg_index < arg_count; arg_index++) { arg_from_valist = va_arg(vaarg, char*); oauth_add_param_to_array(&argc, &argv, arg_from_valist); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, arg_from_valist: %s\n", arg_from_valist); printf("SAMUEL_DEBUG, argc:%d\n", argc); #endif } va_end(vaarg); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, before add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif oauth_sign_array2_process(&argc, &argv, NULL, //< postargs (unused) OA_HMAC, "POST", //< HTTP method (defaults to "GET") request->key, request->secret,//NULL, NULL); permanent->key, permanent->secret); req_hdr = oauth_serialize_url_sep(argc, 1, argv, ", ", 100); req_url = oauth_serialize_url_sep(argc, 0, argv, "&", 1); oauth_free_array(&argc, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, req_hdr: %s\n", req_hdr); printf("SAMUEL_DEBUG, req_url: %s\n", req_url); #endif http_hdr = malloc(strlen(req_hdr) + 200); memset(http_hdr,0,100); sprintf(http_hdr, "Authorization: OAuth realm=\"\", %s", req_hdr); #if SAMUEL_DEBUG printf("request URL=%s\n", req_url); printf("request header=%s\n\n", http_hdr); #endif reply = oauth_http_post2(req_url, &postarg, http_hdr); if(!reply){ printf("SAMUEL_DEBUG, HTTP request for an oauth request-token failed.\n"); } else printf("SAMUEL_DEBUG, reply: %s\n", reply); if (reply) free(reply); if (req_hdr) free(req_hdr); if (req_url) free(req_url); if (http_hdr) free(http_hdr); if (postarg) free(postarg); if (api_url) free(api_url); return 0; }
/** * @brief Use API key, response key-pair and verification code * to retrive the permanent key-pair * * @param req_key API key * @param req_secret API secret key * @param res_key the address of the response key * @param res_secret the address of the response secret key * @param verifier verification code * * @return error on 1 */ inline static int get_access_token(char* req_key, char* req_secret, char** res_key, char** res_secret, char* verifier){ int fail = 0; char *request_token_uri = s_concate(&(plurk_url), &(plurk_uri_access)); char *postarg = NULL; char *req_url; char *reply; int verifier_len = strlen(verifier); char *verifier_perm = malloc(sizeof(char)*(15 + verifier_len + 1)); memset(verifier_perm, 0, 15 + verifier_len + 1); verifier_perm = memcpy(verifier_perm, "oauth_verifier=", 15); verifier_perm = strncat(verifier_perm, verifier, verifier_len); //req_url = oauth_sign_url2(request_token_uri, // const char *url // &postarg, // char **postarg // OA_HMAC, // OAuthMethod method // "POST", // const char *http_method // req_key, // const char *key // req_secret, // const char *secret // res_t_key, // const char *t_key // res_t_secret // char *t_secret // ); // transfer oauth_sign_url2() in steps // example edited from: // http://liboauth.sourceforge.net/tests_2oauthtest2_8c-example.html#a0 int argc=0; int i; char **argv=NULL; char *req_hdr = NULL; char *http_hdr= NULL; argc = oauth_split_url_parameters(request_token_uri, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, before add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif // the most important step here!! add parameter oauth_add_param_to_array(&argc, &argv, verifier_perm); #if SAMUEL_DEBUG printf("====\nSAMUEL_DEBUG, after add parameters to array\n"); for (i=0;i<argc; i++) printf("%d:%s\n",i,argv[i]); #endif //do something important here?? oauth_sign_array2_process(&argc, &argv, NULL, //< postargs (unused) OA_HMAC, "POST", //< HTTP method (defaults to "GET") req_key, req_secret,//NULL, NULL); *res_key, *res_secret); req_hdr = oauth_serialize_url_sep(argc, 1, argv, ", ", 6); req_url = oauth_serialize_url_sep(argc, 0, argv, "&", 1); oauth_free_array(&argc, &argv); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, req_hdr: %s\n",req_hdr); printf("SAMUEL_DEBUG, req_url: %s\n",req_url); #endif http_hdr = malloc(strlen(req_hdr) + 100); memset(http_hdr,0,100); sprintf(http_hdr, "Authorization: OAuth realm=\"\", %s", req_hdr); #if SAMUEL_DEBUG printf("request URL=%s\n", req_url); printf("request header=%s\n\n", http_hdr); #endif // POST HTTPMethod reply = oauth_http_post2(req_url,&postarg,http_hdr); // GET HTTPMethod //reply = oauth_http_get2(req_url,postarg,http_hdr); if(!reply){ printf("SAMUEL_DEBUG, HTTP request for an oauth request-token failed.\n"); return (fail = 1); } else fail = get_keysecret(reply, res_key, res_secret); #if SAMUEL_DEBUG printf("SAMUEL_DEBUG, res_key: '%s'\t res_secret: '%s'\n", *res_key, *res_secret); printf("Samuel_DEBUG, final %x\n",res_key); printf("SAMUEL_DEBUG, postarg: %s\n",postarg); #endif if(http_hdr) free(http_hdr); if(req_hdr) free(req_hdr); if(verifier_perm) free(verifier_perm); if(reply) free(reply); if(req_url) free(req_url); if(postarg) free(postarg); if(request_token_uri) free(request_token_uri); return fail; }