Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smach/1570d42abb30da72ea8993c89c76c882 to your computer and use it in GitHub Desktop.
Save smach/1570d42abb30da72ea8993c89c76c882 to your computer and use it in GitHub Desktop.
# get all people you follow on Mastodon and which lists you've assigned them to. Inspired by Jon Udell doing this with Steampipe, his blog post: https://blog.jonudell.net/2022/12/22/lists-and-people-on-mastodon/
library(rtoot) # need the dev version, and you need to have gotten and stored a user token
library(dplyr)
library(purrr)
library(magrittr)
library(glue)
# If you don't know your Mastodon account ID
my_display_name <- "YOUR DISPLAY NAME HERE"
my_account <- rtoot::search_accounts("smach")
# Mastodon account ID comes back in the list of account.
# My account was the first result, hence the [1]. Check yours!
my_id <- my_account$id[1]
num_following <- my_account$following_count[1]
# Find all your Mastodon lists
all_my_lists <- rtoot(endpoint = "api/v1/lists") |>
bind_rows()
# This is a function to get all the members of a specific list. The endpoint defaults to a maximum of 40 list members returned. If, like me, you have larger lists, set limit to 0 as I did in the function's first line of code.
get_list_members <- function(list_id, list_title) {
list_info <- rtoot(endpoint = glue("api/v1/lists/{list_id}/accounts?limit=0"))
list_members <- list_info |>
map_dfr(magrittr::extract, c("username", "acct", "display_name", "url", "id"))
list_members$List <- list_title
list_members$ListID <- list_id
return(list_members)
}
# Run the function on all of your lists
my_list_members <- map2_df(all_my_lists$id, all_my_lists$title, get_list_members)
# Now, separately, get a list of all the people you follow. I set the variable num_following above when searching for my account ID. You can set it manually.
all_people_i_follow <- get_account_following(my_id, limit = num_following)
# This code joins the people you follow with the people on lists
following_w_their_lists <- left_join(all_people_i_follow[, c("id", "acct", "display_name", "note", "url")], my_list_members[, c("List", "id", "acct", "display_name")], by = c("id", "acct", "display_name"))
# This reshapes the results to show one row for each person and a column for all the lists you've assigned them to. It also turns NA (which shows up as the string "NA" and not R NA) into blank character string ""
following_results <- following_w_their_lists |>
group_by(id, acct, display_name, note, url) |>
summarize(
Lists = paste(List, collapse = ", "),
Lists = ifelse(Lists == "NA", "", Lists)
) |>
ungroup() |>
arrange(Lists)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment