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:
Russian diplomat and government Twitter accounts: browsable table or raw csv file
Chinese diplomat and government Twitter accounts: browsable table or raw csv file
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… 9305Composition 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