Skip to contents

Downloading the account lists without R

If you would like to access or download the account seed lists without using R, you can load them directly from the repository:

Pulling the account lists in R

get_accounts() filters the seed lists to accounts that were still posting when the list was last checked and joins profile metadata from the most recent scrape:

library(disinfo)
library(dplyr)
library(ggplot2)

accs <- get_accounts(country = c("RU", "CN"), group = "diplomats")

accs %>%
  select(state, country, cat, twitter_handle, name, followers_count) %>%
  head(10)
#> # A tibble: 10 × 6
#>    state country             cat   twitter_handle  name          followers_count
#>    <chr> <chr>               <chr> <chr>           <chr>                   <dbl>
#>  1 CN    Afghanistan         A     ChinaEmbKabul   Zhao Xing 赵星…           28078
#>  2 CN    Albania             E     ChinaembassyT   ChinaEmbassy…            3946
#>  3 CN    Algeria             E     ChinaEmbAlgeria Embassy of C…           15945
#>  4 CN    Algeria             S     Hakimyu2        NA                         NA
#>  5 CN    Algeria             S     QuanQuan_1231   NA                         NA
#>  6 CN    Angola              E     ChinaEmbAngola  ChinaEmbAngo…            4365
#>  7 CN    Antigua and Barbuda E     ChinaEmbAntigua Chinese Emba…            1989
#>  8 CN    Argentina           E     ChinaEmbArg     Embajada de …           14802
#>  9 CN    Argentina           S     amigoxiaolin    Xiaolin Wang             1027
#> 10 CN    Australia           C     ChinaConSydney  Chinese Cons…            9305

Composition of the seed lists

The cat column codes the account type. The bulk of both networks falls into four groups:

cat_labels <- c(A = "Ambassadors & staffers", S = "Ambassadors & staffers",
                E = "Embassies", C = "Consulates & consuls",
                G = "Government accounts")

plot_df <-
  accs %>%
  filter(cat %in% names(cat_labels)) %>%
  mutate(category = cat_labels[cat]) %>%
  count(state, category)

ggplot(plot_df, aes(x = reorder(category, n), y = n, fill = state)) +
  geom_col(position = "dodge", width = 0.7) +
  coord_flip() +
  scale_fill_manual(values = c(RU = "#002147", CN = "#a33e3e"), name = NULL) +
  labs(x = NULL, y = "Accounts",
       title = "Russian and Chinese state-linked accounts on Twitter/X",
       subtitle = "Active accounts in the seed lists, by account type") +
  theme_minimal() +
  theme(legend.position = "bottom",
        plot.title = element_text(colour = "#002147", face = "bold"))

Audience sizes differ sharply across account types:

accs %>%
  filter(cat %in% names(cat_labels)) %>%
  mutate(category = cat_labels[cat]) %>%
  group_by(state, category) %>%
  summarise(accounts = n(),
            median_followers = median(followers_count, na.rm = TRUE),
            max_followers = max(followers_count, na.rm = TRUE),
            .groups = "drop") %>%
  arrange(desc(median_followers))
#> # A tibble: 7 × 5
#>   state category               accounts median_followers max_followers
#>   <chr> <chr>                     <int>            <dbl>         <dbl>
#> 1 CN    Ambassadors & staffers      109            6440         377987
#> 2 RU    Embassies                   166            6258         565753
#> 3 CN    Embassies                   106            5603         161942
#> 4 CN    Consulates & consuls         41            3501         156460
#> 5 RU    Government accounts          73            2600.       4530138
#> 6 RU    Ambassadors & staffers       17            2442          66907
#> 7 RU    Consulates & consuls         72            1067           5515