gpt4 book ai didi

c - 在 C 中使用 libcurl 和 liboauth 发布推文

转载 作者:太空狗 更新时间:2023-10-29 15:08:08 24 4
gpt4 key购买 nike

我尝试使用以下代码向 Twitter 发布一条推文,但不断收到错误消息“无法验证您”,“代码”:32“:

 curl_global_init(CURL_GLOBAL_ALL);
CURL *curl = curl_easy_init();

char *signedurl = malloc(sizeof(char) * 1024); /* Not how it will be, but works in this example. */

char *url = "https://api.twitter.com/1.1/statuses/update.json";
signedurl = oauth_sign_url2(url, NULL, OA_HMAC, "POST", consumer_key, consumer_secret, user_token, user_secret);
char *status = "status=test";

curl_easy_setopt(curl, CURLOPT_URL, signedurl); /* URL we're connecting to, after being signed by oauthlib */
curl_easy_setopt(curl, CURLOPT_USERAGENT, "dummy-string"); /* Not the actual string, just a dummy for this example */
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, status);
//curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

int curlstatus = curl_easy_perform(curl); /* Execute the request! */

curl_easy_cleanup(curl);
free(signedurl);

现在,我查看了 Twitter 的文档和他们网站上的讨论,他们推荐了三件事:

  1. 重新生成您的访问 token 。我已经这样做了,并尝试使用我拥有的 Twitter 桌面程序中的开发人员控制台通过他们发布到 Twitter,并且有效。这使我认为问题出在其他地方。
  2. 在请求 header 中包含 Content-Type: application/x-www-form-urlencoded。我的理解是,这是我使用 cURL 的默认方式,事实上,当我使用 VERBOSE 选项时,我可以看到它在 header 中。
  3. 正确编码 url。我知道 oauth_sign_url2 在从 Twitter 获取内容时会正确执行此操作,并且我尝试在状态上使用 oauth_url_escape("status=test") (即使我不我不认为我应该那样做)。那也不管用。

我觉得这很明显,但我很困惑。

最佳答案

我的原始代码中缺少的是正确构建 header 。以下代码有效。

 char *ttwytter_request(char *http_method, char *url, char *url_enc_args)
{
struct curl_slist * slist = NULL;
char * ser_url, **argv, *auth_params, auth_header[1024], *non_auth_params, *final_url, *temp_url;
int argc;

ser_url = (char *) malloc(strlen(url) + strlen(url_enc_args) + 2);
sprintf(ser_url, "%s?%s", url, url_enc_args);

argv = malloc(0);
argc = oauth_split_url_parameters(ser_url, &argv);
free(ser_url);

temp_url = oauth_sign_array2(&argc, &argv, NULL, OA_HMAC, http_method, consumer_key, consumer_secret, user_token, user_secret);
free(temp_url);

auth_params = oauth_serialize_url_sep(argc, 1, argv, ", ", 6);
sprintf( auth_header, "Authorization: OAuth %s", auth_params );
slist = curl_slist_append(slist, auth_header);
free(auth_params);

non_auth_params = oauth_serialize_url_sep(argc, 1, argv, "", 1 );

final_url = (char *) malloc( strlen(url) + strlen(non_auth_params) );

strcpy(final_url, url);
postdata = non_auth_params;

for (int i = 0; i < argc; i++ )
{
free(argv[i]);
}
free(argv);

curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "dummy-string");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata);

int curlstatus = curl_easy_perform(curl); /* Execute the request! */

curl_easy_cleanup(curl);
}

关于c - 在 C 中使用 libcurl 和 liboauth 发布推文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24539398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com