#include "cocoatweet/api/status/update.h" #include "cocoatweet/util/util.h" #include #include #include #include #include extern "C" { #include } namespace CocoaTweet::API::Statuses { Update::Update() { url_ = "https://api.twitter.com/1.1/statuses/update.json"; } void Update::status(const std::string _status) { status_ = _status; param_.insert_or_assign("status", status_); } void Update::process(std::weak_ptr _oauth, std::function _callback) { // エンドポイントへのパラメータにOAuthパラメータを付加して署名作成 auto oauth = _oauth.lock(); auto oauthParam = oauth->oauthParam(); auto sigingParam = oauthParam; for (const auto [k, v] : param_) { sigingParam.insert_or_assign(k, v); } auto signature = oauth->signature(sigingParam, "POST", url_); // 作成した署名をエンドポイントへのパラメータ及びOAuthパラメータに登録 std::cout << "signature : " << signature["oauth_signature"] << std::endl; oauthParam.merge(signature); // リクエストボディの構築 std::string requestBody = ""; { std::vector tmp; for (const auto& [key, value] : param_) { tmp.push_back(key + "=" + value); } std::stringstream os; std::copy(tmp.begin(), tmp.end(), std::ostream_iterator(os, "&")); requestBody = os.str(); requestBody.erase(requestBody.size() - std::char_traits::length("&")); } std::cout << "request Body -> " << requestBody << std::endl; // ヘッダの構築 std::string oauthHeader = "authorization: OAuth "; { std::vector tmp; for (const auto& [key, value] : oauthParam) { tmp.push_back(key + "=" + value); } std::stringstream os; std::copy(tmp.begin(), tmp.end(), std::ostream_iterator(os, ",")); oauthHeader += os.str(); oauthHeader.erase(oauthHeader.size() - std::char_traits::length(",")); } std::cout << "OAuth Header -> " << oauthHeader << std::endl; // do post CURL* curl; CURLcode res; std::string rcv; curl = curl_easy_init(); url_ = url_ + "?status=" + status_; std::cout << "URL : " << url_ << std::endl; if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url_.c_str()); curl_easy_setopt(curl, CURLOPT_POST, 1); // curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBody); // curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestBody.length()); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, 0); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallback_); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&rcv); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // Headerを保持するcurl_slist*を初期化 struct curl_slist* headers = NULL; // Authorizationをヘッダに追加 headers = curl_slist_append(headers, oauthHeader.c_str()); // headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } if (res != CURLE_OK) { std::cout << "curl error : " << res << std::endl; exit(1); } if (_callback) { _callback(rcv); } } } // namespace CocoaTweet::API::Statuses