From b5cc36e1cb8830893ee4baa000f5293e242c1114 Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sun, 9 Nov 2025 15:56:32 -0500 Subject: It now posts to Tumblr! The churn never ends. --- infinite.cpp | 103 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 64 insertions(+), 39 deletions(-) (limited to 'infinite.cpp') diff --git a/infinite.cpp b/infinite.cpp index 5fcea86..5c8ccbc 100644 --- a/infinite.cpp +++ b/infinite.cpp @@ -7,11 +7,12 @@ #include #include #include -#include #include #include #include #include +#include +#include class fill_blanks { private: @@ -433,6 +434,63 @@ class fill_blanks { } }; +void postToTumblr(std::string post_text, Magick::Image& image, const OAuth::Client& client) { + nlohmann::json jsonMedia; + jsonMedia["type"] = "image/jpeg"; + jsonMedia["identifier"] = "some-identifier"; + jsonMedia["width"] = image.columns(); + jsonMedia["height"] = image.rows(); + jsonMedia["alt_text"] = post_text; + jsonMedia["caption"] = post_text; + + nlohmann::json contentBlock; + contentBlock["type"] = "image"; + contentBlock["media"] = jsonMedia; + + nlohmann::json postBody; + postBody["content"].push_back(contentBlock); + postBody["tags"] = "inspiration,flame fractal,generated"; + + std::string postText = postBody.dump(); + std::cout << postText << std::endl; + + Magick::Blob blob; + image.write(&blob); + + std::string url = "https://api.tumblr.com/v2/blog/icouldswear/posts"; + + std::string oauthHeader = client.getFormattedHttpHeader(OAuth::Http::Post, url, ""); + + struct curl_slist* header_list = NULL; + header_list = curl_slist_append(header_list, oauthHeader.c_str()); + + CURL* easy = curl_easy_init(); + curl_mime* mime = curl_mime_init(easy); + curl_mimepart* json_part = curl_mime_addpart(mime); + curl_mime_data(json_part, postText.c_str(), CURL_ZERO_TERMINATED); + curl_mime_name(json_part, "json"); + curl_mime_type(json_part, "application/json"); + + curl_mimepart* image_part = curl_mime_addpart(mime); + curl_mime_data(image_part, reinterpret_cast(blob.data()), blob.length()); + curl_mime_name(image_part, "some-identifier"); + curl_mime_type(image_part, "image/jpeg"); + curl_mime_filename(image_part, "image.jpg"); + + curl_easy_setopt(easy, CURLOPT_MIMEPOST, mime); + curl_easy_setopt(easy, CURLOPT_HTTPHEADER, header_list); + curl_easy_setopt(easy, CURLOPT_URL, url.c_str()); + + CURLcode error = curl_easy_perform(easy); + if (error != CURLE_OK) { + std::cout << curl_easy_strerror(error) << std::endl; + } + + curl_easy_cleanup(easy); + curl_slist_free_all(header_list); + curl_mime_free(mime); +} + int main(int argc, char** argv) { srand(time(NULL)); @@ -449,10 +507,9 @@ int main(int argc, char** argv) std::string configfile(argv[1]); YAML::Node config = YAML::LoadFile(configfile); - mastodonpp::Instance instance{ - config["mastodon_instance"].as(), - config["mastodon_token"].as()}; - mastodonpp::Connection connection{instance}; + OAuth::Consumer tumblr_consumer(config["consumer_key"].as(), config["consumer_secret"].as()); + OAuth::Token tumblr_token(config["access_token"].as(), config["access_token_secret"].as()); + OAuth::Client tumblr_client(&tumblr_consumer, &tumblr_token); // Parse forms file std::map> groups; @@ -782,41 +839,9 @@ int main(int argc, char** argv) std::cout << "Generated image!" << std::endl << "Posting..." << std::endl; - std::string tweetText = action; - tweetText.resize(140); - - auto answer{connection.post(mastodonpp::API::v1::media, - {{"file", std::string("@file:") + tempfile}, {"description", tweetText}})}; - if (!answer) - { - if (answer.curl_error_code == 0) - { - std::cout << "HTTP status: " << answer.http_status << std::endl; - } - else - { - std::cout << "libcurl error " << std::to_string(answer.curl_error_code) - << ": " << answer.error_message << std::endl; - } - } else { - nlohmann::json response_json = nlohmann::json::parse(answer.body); - answer = connection.post(mastodonpp::API::v1::statuses, - {{"status", tweetText}, {"media_ids", - std::vector{response_json["id"].get()}}}); + postToTumblr(action, image, tumblr_client); - if (!answer) - { - if (answer.curl_error_code == 0) - { - std::cout << "HTTP status: " << answer.http_status << std::endl; - } - else - { - std::cout << "libcurl error " << std::to_string(answer.curl_error_code) - << ": " << answer.error_message << std::endl; - } - } - } + std::cout << "Posted!" << std::endl; std::this_thread::sleep_for(std::chrono::hours(12)); } -- cgit 1.4.1