Post to Mastodon from R
[This article was first published on r.iresmi.net, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Mastodon is a decentralized microblogging platform.
We can analyse some data and directly post our findings to a Mastodon instance.
For example we can plot the different TLDs used by the Mastodon Fediverse.
library(tidyverse) library(httr) library(jsonlite) library(scales) library(ggthemes) library(ggrepel) # data source url <- "https://instances.mastodon.xyz/" mastodon <- GET(paste0(url, "instances.json")) %>% content(as = "text") %>% fromJSON() %>% select(-info) %>% filter(!str_detect(name, "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")) %>% # remove IP mutate(statuses = as.integer(statuses), name_clean = str_remove(str_to_lower(name), "/$|\\.$|:\\d*$"), # remove trailing dots, slashes and port number tld = str_replace_all(name_clean, "(.*?)(\\.[a-z0-9]*)$", "\\2")) %>% # extract TLD filter(! tld %in% c("0")) # remove special cases download_time <- format(Sys.time(), tz = "UTC", usetz = TRUE) # saveRDS(mastodon, paste0("data/mastodon_", download_time, ".rds")) nbi <- nrow(mastodon) nbu <- sum(mastodon$users, na.rm = TRUE) # cleaning and # plot the TLDs (top level domains) of Mastondon instances ----------------------- mastodon %>% filter(! str_detect(tld, "xn--")) %>% group_by(tld) %>% summarise(nb = n(), users = sum(users, na.rm = TRUE), statuses = sum(statuses, na.rm = TRUE)) %>% filter(nb > 0 & users > 0 & statuses > 0) %>% { ggplot(., aes(users, statuses, label = tld, size = nb, color = nb)) + geom_text_repel(segment.size = 0, force = 0.5) + #geom_point(alpha = 0.4) + labs(title = "Mastodon Top Level Domains", subtitle = paste(nrow(.), "TLDs for", nbi, "instances having", nbu, "users -", download_time), x = "users", y = "statuses", caption = paste("r.iresmi.net\ndata from", url, "\nIDN removed ; positions adapted for clarity")) + scale_x_log10(labels = comma) + scale_y_log10(labels = comma) + scale_color_viridis_c(trans = "log", name = "# of\ninstances", labels = function(x) round(x, 0)) + scale_size(range = c(3, 10), guide = FALSE) + theme(plot.caption = element_text(size = 7)) } (plot_file <- paste0("img/mastodon_tld_", download_time, ".png")) %>% ggsave(width = 15, height = 10, units = "cm", dpi = 100, scale = 2)
Before posting we have to create an authorization token once.
# Registration # run this part once and write down client_id and client_secret, # you can then comment this part r <- POST(paste0(instance , "api/v1/apps"), body = list(client_name = "my_application_name", redirect_uris = "urn:ietf:wg:oauth:2.0:oob", scopes = "write")) stop_for_status(r) apps <- content(r) paste("client_id :", apps[["client_id"]]) paste("client_secret", apps[["client_secret"]]) # end of registration ; set your client id/secret below
Login
# Your instance, login and password instance <- "https://mastodon.cloud/" user <- "*******" pass <- "*******" client_id <- "********************" client_secret <- "******************" # Login ------------------------------------------------------------------- r <- POST(paste0(instance , "oauth/token"), body = list(client_id = client_id, client_secret = client_secret, grant_type = "password", username = user, password = pass, scope = "write")) stop_for_status(r) token <- content(r)
We can then post the created image and its accompanying status.
# post image r <- POST(paste0(instance , "api/v1/media"), add_headers(Authorization = paste("Bearer", token[["access_token"]])), body = list(file = upload_file(plot_file))) stop_for_status(r) media <- content(r) # post status r <- POST(paste0(instance , "/api/v1/statuses"), add_headers(Authorization = paste("Bearer", token[["access_token"]])), body = list(status = paste0("#Mastodon Top Level Domains\n#Rstats\n", media[["text_url"]]), "media_ids[]" = media[["id"]])) stop_for_status(r) statuses <- content(r)
To leave a comment for the author, please follow the link and comment on their blog: r.iresmi.net.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.