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. --- .gitmodules | 3 ++ CMakeLists.txt | 13 ++++--- infinite.cpp | 103 +++++++++++++++++++++++++++++++++-------------------- vendor/liboauthcpp | 1 + 4 files changed, 77 insertions(+), 43 deletions(-) create mode 160000 vendor/liboauthcpp diff --git a/.gitmodules b/.gitmodules index 043d581..ffd7927 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "vendor/verbly"] path = vendor/verbly url = https://git.fourisland.com/verbly +[submodule "vendor/liboauthcpp"] + path = vendor/liboauthcpp + url = https://github.com/sirikata/liboauthcpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt index d8ec06e..cde46f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,23 @@ -cmake_minimum_required (VERSION 3.1) +cmake_minimum_required (VERSION 3.31) project (infinite) add_subdirectory(vendor/verbly) +set(LIBOAUTHCPP_BUILD_DEMOS FALSE) +add_subdirectory(vendor/liboauthcpp/build EXCLUDE_FROM_ALL) +include_directories(vendor/liboauthcpp/include) + find_package(PkgConfig) +find_package(CURL) pkg_check_modules(GraphicsMagick GraphicsMagick++ REQUIRED) pkg_check_modules(yaml-cpp yaml-cpp REQUIRED) -pkg_check_modules(mastodonpp mastodonpp REQUIRED) include_directories( ${GraphicsMagick_INCLUDE_DIRS} vendor/verbly/lib vendor/json - ${mastodonpp_INCLUDE_DIRS} + vendor/liboauthcpp/include + ${CURL_INCLUDE_DIRS} ${yaml-cpp_INCLUDE_DIRS}) link_directories( @@ -22,4 +27,4 @@ link_directories( add_executable(infinite infinite.cpp color.cpp fractal.cpp matrix3x3.cpp vector3d.cpp tinyxml2.cpp triangle.cpp) set_property(TARGET infinite PROPERTY CXX_STANDARD 17) set_property(TARGET infinite PROPERTY CXX_STANDARD_REQUIRED ON) -target_link_libraries(infinite ${GraphicsMagick_LIBRARIES} verbly ${yaml-cpp_LIBRARIES} ${mastodonpp_LIBRARIES}) +target_link_libraries(infinite ${GraphicsMagick_LIBRARIES} verbly ${yaml-cpp_LIBRARIES} curl oauthcpp) 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)); } diff --git a/vendor/liboauthcpp b/vendor/liboauthcpp new file mode 160000 index 0000000..2893f1b --- /dev/null +++ b/vendor/liboauthcpp @@ -0,0 +1 @@ +Subproject commit 2893f1bf42e1dfd5acf0dd849519cf27ac9c7395 -- cgit 1.4.1