Documentation, function reference, and articles: schliebs.github.io/disinfo
disinfo bundles data and helper functions for research on disinformation and state-backed information operations. Right now it covers two things: curated seed lists of Russian and Chinese state-linked diplomatic and government accounts on Twitter/X, and domain lists of Russian and Chinese state-controlled media outlets. The plan is to grow this into a broader toolkit for disinformation studies.
Diplomat and government accounts
get_accounts() returns one row per account: the seed-list entry (country, ISO2 code, account category, handle) joined with profile metadata from the most recent scrape.
library(disinfo)
ru_accs <- get_accounts(country = "RU", group = "diplomats")
#> 353 Russian diplomat and government accounts. Account data as of 2024-04-15.
ru_accs |>
dplyr::select(country, cat, twitter_handle, name, followers_count)
#> # A tibble: 353 × 5
#> country cat twitter_handle name followers_count
#> <chr> <chr> <chr> <chr> <dbl>
#> 1 Afghanistan E RusEmbassyKabul "Russian Embassy in Kabul" 16922
#> 2 Afghanistan C ruscg_mzs "Russia in Mazar-e Sharif" 707
#> 3 Albania E RussianAlbania "Russian Embassy in Albani… 1148
#> 4 Algeria E AmbRus_Algerie "Ambassade de Russie" 10069
#> 5 Angola E russembangola4 "russembangola" 350
#> 6 Argentina E EmbRusiaEnArgEs "Embajada de Rusia,AR" 19394
#> 7 Argentina E EmbRusiaEnArgRu "Посольство России,AR" 4479
#> 8 Armenia E rusembassyARM "ПосольствоРФвAрмении" 3969
#> 9 Armena C GyumriRussia "Генеральное консульство Р… 811
#> 10 Australia E RusEmbAU "Russia in Australia" 7975
#> # ℹ 343 more rowsBoth countries at once, with the originating state in state:
accs <- get_accounts(country = c("RU", "CN"))
table(accs$state)
#>
#> CN RU
#> 293 353The cat column codes the account type; the most common codes are E embassies, C consulates and consuls, A ambassadors and staffers, G central government accounts, S other staffers, and QG quasi-governmental accounts.
State media domains
get_domains() returns domain lists for state-controlled outlets (RT, Sputnik, TASS, CGTN, Xinhua, People’s Daily, Global Times, China Daily), including their language editions and regional subdomains. Useful for matching shared URLs in social media data or building link-search queries.
domains <- get_domains(country = c("RU", "CN"), online = FALSE)
head(domains)
#> # A tibble: 6 × 7
#> country lang outlet url lang_identifier prefix ct_keyword
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 russia en rt rt.com rt.com https:// rt.com
#> 2 russia en rt rt.com on.rt.com https:// rt.com
#> 3 russia de rt deutsch.rt.com deutsch.rt.com https:// rt.com
#> 4 russia de rt de.rt.com de.rt.com https:// rt.com
#> 5 russia fr rt francais.rt.com francais.rt.com https:// rt.com
#> 6 russia es rt actualidad.rt.com actualidad.rt.com https:// rt.comData
All data lives in inst/extdata/ as plain CSV files, so you can also use it without R:
- Russian diplomat and government accounts: seed list · profile scrape
- Chinese diplomat and government accounts: seed list · profile scrape
- State media domains: Chinese outlets · Russian outlets
By default the functions read these files from the GitHub repository, so you get the current versions without reinstalling (online = TRUE). Set online = FALSE to use the snapshots bundled with your installed package.
The account lists were maintained and re-scraped between 2021 and 2024; the profile metadata is from the last scrape in April 2024. Handles and labels on X change, so treat counts and account status as snapshots, not live data.
