From e0826ab46885750dcf39689e092b992bc8494f5d Mon Sep 17 00:00:00 2001 From: 4cuck <40539855+4cuck@users.noreply.github.com> Date: Wed, 30 Aug 2023 00:59:58 +0200 Subject: [PATCH] parse and display instance countries --- .env.example | 4 +- Cargo.lock | 23 + entities/src/host.rs | 4 + entities/src/state/mod.rs | 1 + entities/src/state/scanner.rs | 3 + migration/src/lib.rs | 3 + migration/src/m20230829_201916_country.rs | 22 + scanner/Cargo.toml | 3 + scanner/src/cache_update.rs | 1 + scanner/src/instance_parser.rs | 694 +--- scanner/src/lib.rs | 5 +- scanner/test_data/instancelist.html | 3595 +++++++++++++------ scanner/test_data/instancelist_expected.csv | 76 + server/templates/about.html.j2 | 2 +- server/templates/instances.html.j2 | 15 +- src/main.rs | 3 + 16 files changed, 2681 insertions(+), 1773 deletions(-) create mode 100644 migration/src/m20230829_201916_country.rs create mode 100644 scanner/test_data/instancelist_expected.csv diff --git a/.env.example b/.env.example index efe2102..4396f30 100644 --- a/.env.example +++ b/.env.example @@ -22,8 +22,10 @@ PROFILE_NAME='@jack' PROFILE_POSTS_MIN=5 # regex content to search for to verify RSS availability RSS_CONTENT=', + pub country: String, pub version_url: Option, /// Last time the url and enabled were updated, *not* the rss pub updated: i64, @@ -36,6 +37,7 @@ pub enum Column { Domain, Url, Version, + Country, VersionUrl, Enabled, Rss, @@ -63,10 +65,12 @@ impl ColumnTrait for Column { type EntityName = Entity; fn def(&self) -> ColumnDef { match self { + // required for updated -> integer Self::Id => ColumnType::Integer.def(), Self::Domain => ColumnType::String(None).def(), Self::Url => ColumnType::String(None).def(), Self::Version => ColumnType::String(None).def().null(), + Self::Country => ColumnType::String(None).def(), Self::VersionUrl => ColumnType::String(None).def().null(), Self::Enabled => ColumnType::Integer.def(), Self::Rss => ColumnType::Integer.def(), diff --git a/entities/src/state/mod.rs b/entities/src/state/mod.rs index 08dabbd..8690894 100644 --- a/entities/src/state/mod.rs +++ b/entities/src/state/mod.rs @@ -47,4 +47,5 @@ pub struct CacheHost { pub is_latest_version: bool, /// Whether this host is known to be bad (ip blocking) pub is_bad_host: bool, + pub country: String, } diff --git a/entities/src/state/scanner.rs b/entities/src/state/scanner.rs index d94752f..1cfb862 100644 --- a/entities/src/state/scanner.rs +++ b/entities/src/state/scanner.rs @@ -22,6 +22,8 @@ pub struct Config { pub rss_content: String, /// List of additional hosts to include during health checks pub additional_hosts: Vec, + /// Country to use for additional hosts + pub additional_host_country: String, /// Referer to use pub referrer: String, /// Duration to average the ping/response times over @@ -49,6 +51,7 @@ impl Config { profile_posts_min: 5, rss_content: String::from(r#" Result<(), DbErr> { + let cmd = r#"ALTER TABLE "host" ADD COLUMN "country" TEXT NOT NULL DEFAULT '';"#; + let db = manager.get_connection(); + db.execute_unprepared("BEGIN EXCLUSIVE").await?; + tracing::info!("adding version_url column.."); + db.execute_unprepared(cmd).await?; + db.execute_unprepared("COMMIT TRANSACTION").await?; + db.execute_unprepared("VACUUM").await?; + Ok(()) + } + + async fn down(&self, _manager: &SchemaManager) -> Result<(), DbErr> { + panic!("Can't migrate down"); + } +} \ No newline at end of file diff --git a/scanner/Cargo.toml b/scanner/Cargo.toml index 13de704..26f7ac3 100644 --- a/scanner/Cargo.toml +++ b/scanner/Cargo.toml @@ -15,9 +15,12 @@ scraper = "0.17.1" chrono = { workspace = true } regex = { workspace = true } git2 = "0.17.2" +# testing +serde = { workspace = true, features = ["derive"] } [dev-dependencies] tracing-test = { workspace = true } +csv = "1.2.2" [dependencies.entities] path = "../entities" \ No newline at end of file diff --git a/scanner/src/cache_update.rs b/scanner/src/cache_update.rs index df18b57..908bfe7 100644 --- a/scanner/src/cache_update.rs +++ b/scanner/src/cache_update.rs @@ -144,6 +144,7 @@ impl Scanner { is_upstream, version_url: host.version_url, is_bad_host, + country: host.country, }) } host_statistics.sort_unstable_by_key(|k| k.points); diff --git a/scanner/src/instance_parser.rs b/scanner/src/instance_parser.rs index 82fa83b..265fdc6 100644 --- a/scanner/src/instance_parser.rs +++ b/scanner/src/instance_parser.rs @@ -22,6 +22,7 @@ pub enum InstanceListError { MalformedRow, } #[derive(Debug, Eq, PartialEq)] +#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] pub struct InstanceParsed { /// URL without any login stuff pub domain: String, @@ -29,22 +30,22 @@ pub struct InstanceParsed { pub url: String, /// whether this instance is marked as online pub online: bool, - /// whether this is marked as up to date - pub up_to_date: bool, /// the SSL provider this instance supposedly has pub ssl_provider: String, + /// the country for this instance + pub country: String, } impl InstanceParsed { /// just for testing purposes #[cfg(test)] - fn from(domain: &str, url: &str, online: bool, up_to_date: bool, ssl_provider: &str) -> Self { + fn from(domain: &str, url: &str, online: bool, ssl_provider: &str, country: &str) -> Self { Self { domain: domain.to_owned(), url: url.to_owned(), online, - up_to_date, ssl_provider: ssl_provider.to_owned(), + country: country.to_owned(), } } } @@ -76,6 +77,7 @@ impl InstanceParser { &self, html: &str, additional_instances: &[String], + additional_instances_country: &str, abort_on_err: bool, ) -> Result { let fragment = Html::parse_fragment(html); @@ -118,8 +120,8 @@ impl InstanceParser { domain: domain.to_owned(), url: entry.clone(), online: true, - up_to_date: true, ssl_provider: String::new(), + country: additional_instances_country.to_owned(), }, ); } @@ -185,8 +187,8 @@ impl InstanceParser { domain, url, online: columns[0] == CHECKBOX, - up_to_date: columns[1] == CHECKBOX, ssl_provider: columns[3].clone(), + country: columns[2].clone(), }; Ok(instance) } @@ -194,9 +196,10 @@ impl InstanceParser { #[cfg(test)] mod test { - use std::collections::HashMap; - + use std::{collections::HashMap, io::BufWriter}; + use std::io::Write; use tracing_test::traced_test; + use csv; use super::*; #[test] @@ -204,8 +207,11 @@ mod test { fn parse() { let html = include_str!("../test_data/instancelist.html"); let parser = InstanceParser::new(); - let res = parser.parse_instancelist(html, &[], true).unwrap(); - dbg!(&res); + let res = parser.parse_instancelist(html, &[], "", true).unwrap(); + + // writeback for new tests + // write_data(res.values()); + // adjust when updating the test html let expected: HashMap = expected_data() @@ -218,654 +224,26 @@ mod test { } } + fn write_data<'a, T: Iterator>(data: T) { + // use to write a new csv + let file = std::fs::File::create("test_data/instancelist_expected.csv").unwrap(); + let mut wtr = csv::Writer::from_writer(file); + for entry in data { + wtr.serialize(entry).unwrap(); + } + wtr.flush().unwrap(); + } + fn expected_data() -> Vec { - vec![ - InstanceParsed::from( - "nitter.lacontrevoie.fr", - "https://nitter.lacontrevoie.fr", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.nixnet.services", - "https://nitter:nitter@nitter.nixnet.services", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.fdn.fr", - "https://nitter.fdn.fr", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.1d4.us", - "https://nitter.1d4.us", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.kavin.rocks", - "https://nitter.kavin.rocks", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.unixfox.eu", - "https://nitter.unixfox.eu", - true, - true, - "Buypass AS-983163327", - ), - InstanceParsed::from( - "nitter.domain.glass", - "https://nitter.domain.glass", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "birdsite.xanny.family", - "https://birdsite.xanny.family", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.moomoo.me", - "https://nitter.moomoo.me", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "bird.trom.tf", - "https://bird.trom.tf", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.it", - "https://nitter.it", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "twitter.owacon.moe", - "https://twitter.owacon.moe", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "notabird.site", - "https://notabird.site", - false, - false, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.weiler.rocks", - "https://nitter.weiler.rocks", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.sethforprivacy.com", - "https://nitter.sethforprivacy.com", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.nl", - "https://nitter.nl", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.mint.lgbt", - "https://nitter.mint.lgbt", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.esmailelbob.xyz", - "https://nitter.esmailelbob.xyz", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "tw.artemislena.eu", - "https://tw.artemislena.eu", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.tiekoetter.com", - "https://nitter.tiekoetter.com", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.privacy.com.de", - "https://nitter.privacy.com.de", - true, - true, - "ZeroSSL", - ), - InstanceParsed::from( - "nitter.poast.org", - "https://nitter.poast.org", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.bird.froth.zone", - "https://nitter.bird.froth.zone", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.cz", - "https://nitter.cz", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.privacydev.net", - "https://nitter.privacydev.net", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "tweet.lambda.dance", - "https://tweet.lambda.dance", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.kylrth.com", - "https://nitter.kylrth.com", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.tokhmi.xyz", - "https://nitter.tokhmi.xyz", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.catalyst.sx", - "https://nitter.catalyst.sx", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "unofficialbird.com", - "https://unofficialbird.com", - true, - true, - "ZeroSSL", - ), - InstanceParsed::from( - "nitter.projectsegfau.lt", - "https://nitter.projectsegfau.lt", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.eu.projectsegfau.lt", - "https://nitter.eu.projectsegfau.lt", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.in.projectsegfau.lt", - "https://nitter.in.projectsegfau.lt", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "singapore.unofficialbird.com", - "https://singapore.unofficialbird.com", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "canada.unofficialbird.com", - "https://canada.unofficialbird.com", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "india.unofficialbird.com", - "https://india.unofficialbird.com", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nederland.unofficialbird.com", - "https://nederland.unofficialbird.com", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "uk.unofficialbird.com", - "https://uk.unofficialbird.com", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from("n.l5.ca", "https://n.l5.ca", true, false, "Let's Encrypt"), - InstanceParsed::from( - "nitter.slipfox.xyz", - "https://nitter.slipfox.xyz", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.soopy.moe", - "https://nitter.soopy.moe", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.qwik.space", - "https://nitter.qwik.space", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "read.whatever.social", - "https://read.whatever.social", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.rawbit.ninja", - "https://nitter.rawbit.ninja", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "nt.vern.cc", - "https://nt.vern.cc", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.ir", - "https://nitter.ir", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.privacytools.io", - "https://nitter.privacytools.io", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "n.sneed.network", - "https://n.sneed.network", - true, - true, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.smnz.de", - "https://nitter.smnz.de", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.twei.space", - "https://nitter.twei.space", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.inpt.fr", - "https://nitter.inpt.fr", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.d420.de", - "https://nitter.d420.de", - true, - true, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.caioalonso.com", - "https://nitter.caioalonso.com", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.at", - "https://nitter.at", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.pw", - "https://nitter.pw", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.nicfab.eu", - "https://nitter.nicfab.eu", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "bird.habedieeh.re", - "https://bird.habedieeh.re", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.hostux.net", - "https://nitter.hostux.net", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.adminforge.de", - "https://nitter.adminforge.de", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.platypush.tech", - "https://nitter.platypush.tech", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.pufe.org", - "https://nitter.pufe.org", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.us.projectsegfau.lt", - "https://nitter.us.projectsegfau.lt", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from("t.com.sb", "https://t.com.sb", true, false, "ZeroSSL"), - InstanceParsed::from( - "nitter.kling.gg", - "https://nitter.kling.gg", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.riverside.rocks", - "https://nitter.riverside.rocks", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.lunar.icu", - "https://nitter.lunar.icu", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "twitter.moe.ngo", - "https://twitter.moe.ngo", - true, - false, - "Google Trust Services LLC", - ), - InstanceParsed::from( - "nitter.freedit.eu", - "https://nitter.freedit.eu", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "ntr.frail.duckdns.org", - "https://ntr.frail.duckdns.org", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "n.opnxng.com", - "https://n.opnxng.com", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.tux.pizza", - "https://nitter.tux.pizza", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "t.floss.media", - "https://t.floss.media", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "twit.hell.rodeo", - "https://twit.hell.rodeo", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.nachtalb.io", - "https://nitter.nachtalb.io", - false, - false, - "Cloudflare", - ), - InstanceParsed::from( - "n.quadtr.ee", - "https://n.quadtr.ee", - false, - false, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.altgr.xyz", - "https://nitter.altgr.xyz", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "jote.lile.cl", - "https://jote.lile.cl", - true, - false, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.one", - "https://nitter.one", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.instances.cc", - "https://nitter.instances.cc", - false, - false, - "Cloudflare", - ), - InstanceParsed::from( - "nitter.io.lol", - "https://nitter.io.lol", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.hu", - "https://nitter.hu", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.no-logs.com", - "https://nitter.no-logs.com", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.ftw.lol", - "https://nitter:nitter@nitter.ftw.lol", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "tweet.whateveritworks.org", - "https://tweet.whateveritworks.org", - true, - false, - "Let's Encrypt + Cloudflare", - ), - InstanceParsed::from( - "nitter.fediflix.org", - "https://nitter.fediflix.org", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.nohost.network", - "https://nitter.nohost.network", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "twt.funami.tech", - "https://twt.funami.tech", - false, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.simpleprivacy.fr", - "https://nitter.simpleprivacy.fr", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.onthescent.xyz", - "https://nitter.onthescent.xyz", - true, - false, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.x86-64-unknown-linux-gnu.zip", - "https://nitter.x86-64-unknown-linux-gnu.zip", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.private.coffee", - "https://nitter.private.coffee", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.oksocial.net", - "https://nitter.oksocial.net", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.services.woodland.cafe", - "https://nitter.services.woodland.cafe", - true, - true, - "Let's Encrypt", - ), - InstanceParsed::from( - "nitter.datura.network", - "https://nitter.datura.network", - true, - true, - "Let's Encrypt", - ), - ] + let file = std::fs::File::open("test_data/instancelist_expected.csv").unwrap(); + let mut rdr = csv::Reader::from_reader(file); + let mut vec = Vec::new(); + for result in rdr.deserialize() { + // Notice that we need to provide a type hint for automatic + // deserialization. + let record: InstanceParsed = result.unwrap(); + vec.push(record); + } + vec } } diff --git a/scanner/src/lib.rs b/scanner/src/lib.rs index 566d8ad..05ca886 100644 --- a/scanner/src/lib.rs +++ b/scanner/src/lib.rs @@ -225,10 +225,11 @@ impl Scanner { #[instrument] async fn update_instacelist(&mut self) -> Result<()> { let start = Instant::now(); - let html = self.fetch_instancelist().await?; + let html: String = self.fetch_instancelist().await?; let parsed_instances = self.inner.instance_parser.parse_instancelist( &html, &self.inner.config.additional_hosts, + &self.inner.config.additional_host_country, false, )?; @@ -292,6 +293,7 @@ impl Scanner { host::ActiveModel { id: ActiveValue::NotSet, domain: ActiveValue::Set(instance.domain), + country: ActiveValue::Set(instance.country), url: ActiveValue::Set(instance.url), enabled: ActiveValue::Set(true), version: ActiveValue::Set(version), @@ -312,6 +314,7 @@ impl Scanner { host::Column::Rss, host::Column::Version, host::Column::VersionUrl, + host::Column::Country, ]) .to_owned(), ) diff --git a/scanner/test_data/instancelist.html b/scanner/test_data/instancelist.html index 04368a3..066b4aa 100644 --- a/scanner/test_data/instancelist.html +++ b/scanner/test_data/instancelist.html @@ -6,7 +6,9 @@ - + + + @@ -18,60 +20,60 @@ - + - - - - + + + + - - + + - - - + + + - + - - - - + + + - + - - - - + + + + + - - + + - + - - + + - + - Instances ยท zedeus/nitter Wiki ยท GitHub + Instances ยท zedeus/nitter Wiki @@ -81,7 +83,7 @@ - + @@ -99,7 +101,7 @@ - + @@ -110,9 +112,9 @@ - + - + @@ -121,25 +123,26 @@ - - + + + + + - - - - - - + + + + @@ -150,7 +153,7 @@ - + @@ -171,13 +174,13 @@ - -
+ +
- Skip to content + Skip to content @@ -186,429 +189,376 @@ - + + + - +
+
+
+ + + + - - - - - + +
+ + +
+ + Issues +
+
+ + Pull requests +
-
- + + + +
+ +
+ + + + +
+ +
+ + + +
- -
-
+ - + + - + + + + + +
+ + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ +
+ + + + zedeus  /   + nitter  /   + +
+
+ + + +
+ + +
+
+ Clear Command Palette +
+
+ + + +
+
+ Tip: + Type # to search pull requests +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type # to search issues +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type # to search discussions +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type ! to search projects +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type @ to search teams +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type @ to search people and organizations +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type > to activate command mode +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Go to your accessibility settings to change your keyboard shortcuts +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type author:@me to search your content +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:pr to filter to pull requests +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:issue to filter to issues +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:project to filter to projects +
+
+ Type ? for help and tips +
+
+
+ +
+
+ Tip: + Type is:open to filter to open content +
+
+ Type ? for help and tips +
+
+
+ +
+ +
+
+ Weโ€™ve encountered an error and some results aren't available at this time. Type a new search or try again later. +
+
+ + No results matched your search + + + + + + + + + + +
+ + + + + Search for issues and pull requests + + # + + + + Search for issues, pull requests, discussions, and projects + + # + + + + Search for organizations, repositories, and users + + @ + + + + Search for projects + + ! + + + + Search for files + + / + + + + Activate command mode + + > + + + + Search your issues, pull requests, and discussions + + # author:@me + + + + Search your issues, pull requests, and discussions + + # author:@me + + + + Filter to pull requests + + # is:pr + + + + Filter to issues + + # is:issue + + + + Filter to discussions + + # is:discussion + + + + Filter to projects + + # is:project + + + + Filter to open issues, pull requests, and discussions + + # is:open + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + + + @@ -1188,16 +2537,26 @@

Instances

- PrivacyDevel edited this page Jul 19, 2023 + Aron Heinecke edited this page Aug 28, 2023 · - 658 revisions + 697 revisions
@@ -1216,7 +2575,7 @@ - Pages 8 + Pages 9
@@ -1427,6 +2786,30 @@ +
+ + Rate Limiting โ€ Nginx + + + + + + + + +
  • +
    + +
    +
    + +
    @@ -1445,6 +2828,12 @@
    +
    Clone this wiki locally
    @@ -1477,13 +2866,13 @@ URL Country -Issuer & SSLLabs verificationย link +Issuer & SSLLabs verification link nitter.net -๐Ÿ‡ณ๐Ÿ‡ฑ +๐Ÿ‡ณ๐Ÿ‡ฑ Let's Encrypt @@ -1491,15 +2880,14 @@

    Public

    Note: Please add new instances to the bottom to preserve the order. In order to make it easier to preserve the right syntax and the proper aligment of the table in the Markdown source, it is recommended to copy everything into a text editor, edit it there, then copy the result back to the GitHub editor.

    -

    โŒยน means the instance isn't online.
    -โŒยฒ means the instance is outdated, mostly shows if an instance misses a vital change, e.g. timelines not loading.
    -โ“ means the commit link is invalid or missing from the instance's about page.

    +

    โŒยน means the instance isn't online.
    +โŒยฒ means the instance isn't working properly, mostly shows if an instance misses a vital change, e.g. timelines not loading.

    - + @@ -1507,667 +2895,530 @@ - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + + + - - - + + + - - - - - - - - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - - - - - - + + + - - - - - - - - - - + + + - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + +
    URL OnlineยนUpdatedยฒWorkingยฒ Country Issuer & SSLLabs verification link
    nitter.lacontrevoie.frโœ…โœ…๐Ÿ‡ซ๐Ÿ‡ทโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ท Let's Encrypt
    nitter.nixnet.services (auth required)โœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.fdn.frโœ…โœ…๐Ÿ‡ซ๐Ÿ‡ทโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ท Let's Encrypt
    nitter.1d4.usโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.kavin.rocksโœ…โœ…๐Ÿ‡ฎ๐Ÿ‡ณโœ…โŒ๐Ÿ‡ฎ๐Ÿ‡ณ Let's Encrypt
    nitter.unixfox.euโœ…โœ…๐Ÿ‡ณ๐Ÿ‡ฑโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ช Buypass AS-983163327
    nitter.domain.glassโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธCloudflare
    -birdsite.xanny.family (anycast)โœ…โŒ๐ŸŒCloudflare
    nitter.moomoo.meโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    bird.trom.tfโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ชโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.itโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ฎโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ฎ Let's Encrypt
    -twitter.owacon.moe (in Japanese)โœ…โœ…๐Ÿ‡ฏ๐Ÿ‡ตLet's Encrypt
    -notabird.site (anycast)โŒโŒ๐ŸŒCloudflare
    nitter.weiler.rocksโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.sethforprivacy.comโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.nlโœ…โœ…๐Ÿ‡ณ๐Ÿ‡ฑโœ…โŒ๐Ÿ‡ณ๐Ÿ‡ฑ Let's Encrypt
    nitter.mint.lgbtโœ…โœ…๐Ÿ‡ฌ๐Ÿ‡งโœ…โŒ๐Ÿ‡ฌ๐Ÿ‡ง Let's Encrypt
    nitter.esmailelbob.xyzโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆ Let's Encrypt
    tw.artemislena.euโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.tiekoetter.comโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.privacy.com.deโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช ZeroSSL
    nitter.poast.orgโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.bird.froth.zoneโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆ Let's Encrypt
    nitter.czโœ…โœ…๐Ÿ‡จ๐Ÿ‡ฟโœ…โœ…๐Ÿ‡จ๐Ÿ‡ฟ Let's Encrypt
    nitter.privacydev.netโœ…โœ…๐Ÿ‡ซ๐Ÿ‡ทโœ…โœ…๐Ÿ‡ซ๐Ÿ‡ท Let's Encrypt
    tweet.lambda.danceโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.kylrth.comโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆ Let's Encrypt
    nitter.tokhmi.xyzโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.catalyst.sxโŒโŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    unofficialbird.comโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ ZeroSSL
    nitter.projectsegfau.ltโœ…โœ…โœ…โŒ GeoDNS Let's Encrypt
    nitter.eu.projectsegfau.ltโœ…โœ…๐Ÿ‡ฑ๐Ÿ‡บโœ…โŒ๐Ÿ‡ฑ๐Ÿ‡บ Let's Encrypt
    nitter.in.projectsegfau.ltโœ…โœ…๐Ÿ‡ฎ๐Ÿ‡ณโœ…โŒ๐Ÿ‡ฎ๐Ÿ‡ณ Let's Encrypt
    singapore.unofficialbird.comโœ…โœ…๐Ÿ‡ธ๐Ÿ‡ฌโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ฌ Let's Encrypt
    canada.unofficialbird.comโœ…โœ…๐Ÿ‡จ๐Ÿ‡ฆโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆ Let's Encrypt
    india.unofficialbird.comโœ…โœ…๐Ÿ‡ฎ๐Ÿ‡ณโœ…โŒ๐Ÿ‡ฎ๐Ÿ‡ณ Let's Encrypt
    nederland.unofficialbird.comโœ…โœ…๐Ÿ‡ณ๐Ÿ‡ฑโœ…โŒ๐Ÿ‡ณ๐Ÿ‡ฑ Let's Encrypt
    uk.unofficialbird.comโœ…โœ…๐Ÿ‡ฌ๐Ÿ‡งโœ…โŒ๐Ÿ‡ฌ๐Ÿ‡ง Let's Encrypt
    n.l5.caโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.slipfox.xyzโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.soopy.moeโœ…โŒ๐Ÿ‡ญ๐Ÿ‡ฐโœ…โŒ๐Ÿ‡ญ๐Ÿ‡ฐ Let's Encrypt
    nitter.qwik.spaceโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ช Let's Encrypt
    read.whatever.socialโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.rawbit.ninjaโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Cloudflare
    nt.vern.ccโŒโŒ๐Ÿ‡บ๐Ÿ‡ธโŒโŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.irโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.privacytools.ioโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ชCloudflare
    n.sneed.networkโœ…โœ…๐Ÿ‡ฆ๐Ÿ‡บโœ…โŒ๐Ÿ‡ฆ๐Ÿ‡บ Cloudflare
    nitter.smnz.deโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ชโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.twei.spaceโœ…โŒ๐Ÿ‡ฆ๐Ÿ‡นโœ…โŒ๐Ÿ‡ฆ๐Ÿ‡น Let's Encrypt
    nitter.inpt.frโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ทโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ท Let's Encrypt
    nitter.d420.deโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ช Cloudflare
    nitter.caioalonso.comโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธโŒโŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.atโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.pwโœ…โŒ๐ŸŒLet's Encrypt
    nitter.nicfab.euโœ…โœ…๐Ÿ‡ฎ๐Ÿ‡นโœ…โœ…๐Ÿ‡ฎ๐Ÿ‡น Let's Encrypt
    bird.habedieeh.reโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฆโœ…โœ…๐Ÿ‡จ๐Ÿ‡ฆ Let's Encrypt
    nitter.hostux.netโœ…โœ…๐Ÿ‡ซ๐Ÿ‡ทโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ท Let's Encrypt
    nitter.adminforge.deโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.platypush.techโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ชโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.pufe.orgโŒโŒ๐Ÿ‡ณ๐Ÿ‡ฟLet's Encrypt
    nitter.us.projectsegfau.ltโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    t.com.sbโœ…โŒ๐Ÿ‡ช๐Ÿ‡ชโœ…โŒ๐Ÿ‡ช๐Ÿ‡ช ZeroSSL
    nitter.kling.ggโœ…โœ…๐Ÿ‡ณ๐Ÿ‡ฑโœ…โŒ๐Ÿ‡ณ๐Ÿ‡ฑ Let's Encrypt
    nitter.riverside.rocksโŒโŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.lunar.icuโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Cloudflare
    twitter.moe.ngoโœ…โŒ๐Ÿ‡ฎ๐Ÿ‡ฉโœ…โŒ๐Ÿ‡ฎ๐Ÿ‡ฉ Google Trust Services LLC
    nitter.freedit.euโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    ntr.frail.duckdns.orgโŒโŒ๐Ÿ‡ง๐Ÿ‡ทLet's Encrypt
    n.opnxng.comโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ฌLet's Encrypt
    nitter.tux.pizzaโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    t.floss.mediaโŒโŒ๐Ÿ‡ซ๐Ÿ‡ฎLet's Encrypt
    twit.hell.rodeoโŒโŒ๐Ÿ‡ฉ๐Ÿ‡ชLet's Encrypt
    nitter.nachtalb.ioโŒโŒ๐Ÿ‡จ๐Ÿ‡ญCloudflare
    n.quadtr.eeโŒโŒ๐Ÿ‡บ๐Ÿ‡ธCloudflare
    nitter.altgr.xyzโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฑโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฑ Cloudflare
    jote.lile.clโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฑโœ…โŒ๐Ÿ‡จ๐Ÿ‡ฑ Cloudflare
    nitter.oneโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ช Let's Encrypt
    nitter.instances.ccโŒโŒ๐Ÿ‡ณ๐Ÿ‡ดCloudflare
    nitter.io.lolโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.huโœ…โŒ๐Ÿ‡ญ๐Ÿ‡บLet's Encrypt
    nitter.no-logs.comโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ธ๐Ÿ‡ช Let's Encrypt
    -nitter.ftw.lol (auth required)โŒโŒ๐Ÿ‡ฉ๐Ÿ‡ชLet's Encrypt
    tweet.whateveritworks.orgโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt + Cloudflare
    nitter.fediflix.orgโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.nohost.networkโœ…โŒ๐Ÿ‡ฒ๐Ÿ‡ฝโœ…โŒ๐Ÿ‡ฒ๐Ÿ‡ฝ Let's Encrypt
    twt.funami.techโŒโŒ๐Ÿ‡ฐ๐Ÿ‡ทLet's Encrypt
    nitter.simpleprivacy.frโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ทโœ…โŒ๐Ÿ‡ซ๐Ÿ‡ท Let's Encrypt
    nitter.onthescent.xyzโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.x86-64-unknown-linux-gnu.zipโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.private.coffeeโœ…โœ…๐Ÿ‡ฆ๐Ÿ‡นโœ…โŒ๐Ÿ‡ฆ๐Ÿ‡น Let's Encrypt
    nitter.oksocial.netโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธ Let's Encrypt
    nitter.services.woodland.cafeโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.dafriser.beโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ชLet's Encrypt
    nitter.catsarch.comโœ…โŒ๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt
    nitter.perennialte.chโœ…โŒ๐Ÿ‡ฆ๐Ÿ‡บGoogle Trust Services LLC + Cloudflare
    https://nitter.laserdisc.tokyo/โœ…โŒ๐Ÿ‡ธ๐Ÿ‡ชLet's Encrypt
    nitter.datura.networkโœ…โœ…๐Ÿ‡ฉ๐Ÿ‡ชโœ…โŒ๐Ÿ‡ฉ๐Ÿ‡ช Let's Encrypt
    nitter.salastil.comโœ…โœ…๐Ÿ‡บ๐Ÿ‡ธLet's Encrypt

    Tor

    @@ -2181,155 +3432,155 @@ http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion/ -โŒ +โŒ http://nitter7bryz3jv7e3uekphigvmoyoem4al3fynerxkj22dmoxoq553qd.onion/ -โœ… +โœ… http://npf37k3mtzwxreiw52ccs5ay4e6qt2fkcs2ndieurdyn2cuzzsfyfvid.onion/ -โŒ +โŒ http://nitter.v6vgyqpa7yefkorazmg5d5fimstmvm2vtbirt6676mt7qmllrcnwycqd.onion/ -โŒ +โŒ http://i23nv6w3juvzlw32xzoxcqzktegd4i4fu3nmnc2ewv4ggiu4ledwklad.onion/ -โŒ +โŒ http://26oq3gioiwcmfojub37nz5gzbkdiqp7fue5kvye7d4txv4ny6fb4wwid.onion/ -โœ… +โœ… http://vfaomgh4jxphpbdfizkm5gbtjahmei234giqj4facbwhrfjtcldauqad.onion/ -โœ… +โœ… http://iwgu3cv7ywf3gssed5iqtavmrlszgsxazkmwwnt4h2kdait75thdyrqd.onion/ -โŒ +โŒ http://erpnncl5nhyji3c32dcfmztujtl3xaddqb457jsbkulq24zqq7ifdgad.onion/ -โŒ +โŒ http://ckzuw5misyahmg7j5t5xwwuj3bwy62jfolxyux4brfflramzsvvd3syd.onion/ -โŒ +โŒ http://jebqj47jgxleaiosfcxfibx2xdahjettuydlxbg64azd4khsxv6kawid.onion/ -โŒ +โŒ http://nttr2iupbb6fazdpr2rgbooon2tzbbsvvkagkgkwohhodjzj43stxhad.onion/ -โŒ +โŒ http://nitraeju2mipeziu2wtcrqsxg7h62v5y4eqgwi75uprynkj74gevvuqd.onion/ -โœ… +โœ… http://nitter.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion/ -โœ… +โœ… http://ibsboeui2im5o7dxnik3s5yghufumgy5abevtij5nbizequfpu4qi4ad.onion/ -โœ… +โœ… http://ec5nvbycpfa5k6ro77blxgkyrzbkv7uy6r5cngcbkadtjj2733nm3uyd.onion/ -โŒ +โŒ http://twitter.ap3jtgssd7qn4vfoa62gi2ijddoblslbeuw5dan3xt7myvqpura5i4qd.onion/ -โŒ +โŒ http://twitter.prnoid54e44a4bduq5due64jkk7wcnkxcp5kv3juncm7veptjcqudgyd.onion/ -โŒ +โŒ http://nitter.micohauwkjbyw5meacrb4ipicwvwg4xtzl7y7viv53kig2mdcsvwkyyd.onion/ -โŒ +โŒ http://fbdi323aj3t6hdx4jtkuwxrnafzskquciowu2yu3jizfssaq35aow6ad.onion/ -โœ… +โœ… http://nitterqdyumlovt7tjqpdjrluitgmtpa53qq3idlpgoe4kxo7gs3xvad.onion/ -โœ… +โœ… http://nitter.privpw3tndpkw6pnp3g727zfgfdzbu3k6a7chv226s3xymv2p4eiuqyd.onion/ -โŒ +โŒ http://aaaaaxx74hbzeibageieowryhsqvimbdiitfkfe47tvgawkwkjh3coqd.onion/ -โœ… +โœ… http://wiio4sgs4247brk7hj6qck2jxnvldwfdbguigc5ivpxrsegnliyfvuqd.onion/ -โœ… +โœ… http://qwikxx2erhx6qrymued6ox2qkf2yeogjwypqvzoif4fqkljixasr6oid.onion/ -โœ… +โœ… http://4g47cxugkohbweao2x66nnxxfoe3k7gdfzxej537nhdbwr522sbjxeqd.onion/ -โœ… +โœ… http://nt.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion/ -โœ… +โœ… http://tw.lpoaj7z2zkajuhgnlltpeqh3zyq7wk2iyeggqaduhgxhyajtdt2j7wad.onion -โœ… +โœ… http://r2eqimhkvxboaltbdsectoo3hkf476pyemsdykclexzajbfx5v6ojlyd.onion -โœ… +โœ… http://a5xyidyppowvblric6k6nixgf2eqwnb7zzeaarj7slqbv7tb6ip5t3ad.onion -โœ… +โœ… http://bird.habeehrhadazsw3izbrbilqajalfyqqln54mrja3iwpqxgcuxnus7eid.onion -โœ… +โœ… http://codeine3hsqnnkb3dsu6ft4tunlomr3lmuml5hcoqmfkgiqfv2brdqqd.onion -โœ… +โœ… http://nitter.g4c3eya4clenolymqbpgwz3q3tawoxw56yhzk4vugqrl6dtu3ejvhjid.onion -โœ… +โœ… http://jdadsqkjereqronxzovgvd453snh5jsvo7mukfwt2feth353nobqotad.onion -โœ… +โœ… http://nitter.pjsfkvpxlinjamtawaksbnnaqs2fc2mtvmozrzckxh7f3kis6yea25ad.onion/ -โœ… +โœ… http://twitter.cepyxplublbyw2f4axy4pyztfbxmf63lrt2c7uwv6wl4iixz53czload.onion/ -โœ… +โœ… http://nitter.coffee2m3bjsrrqqycx6ghkxrnejl2q6nl7pjw2j4clchjj6uk5zozad.onion/ -โœ… +โœ… http://nitter.daturab6drmkhyeia4ch5gvfc2f3wgo6bhjrv3pz6n7kxmvoznlkq4yd.onion/ -โœ… +โœ… @@ -2360,157 +3611,157 @@ nitter.himiko.cloud -๐Ÿ‡ง๐Ÿ‡ฌ +๐Ÿ‡ง๐Ÿ‡ฌ 2021-05-03 nitter.jae.fi -๐Ÿ‡ซ๐Ÿ‡ฎ +๐Ÿ‡ซ๐Ÿ‡ฎ Unknown nitter.cc -๐Ÿ‡ท๐Ÿ‡ธ +๐Ÿ‡ท๐Ÿ‡ธ 2021-06 nitter.ortion.xyz -๐Ÿ‡ซ๐Ÿ‡ท +๐Ÿ‡ซ๐Ÿ‡ท 2021-06-07 nitter.40two.app -๐Ÿ‡ณ๐Ÿ‡ฑ +๐Ÿ‡ณ๐Ÿ‡ฑ Unknown nitter.dark.fail -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ Unknown nitter.sugoma.tk -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ Never Online nitter.didw.to -๐Ÿ‡ธ๐Ÿ‡ช +๐Ÿ‡ธ๐Ÿ‡ช 2021-09-24 bird.nogafam.es -๐Ÿ‡ช๐Ÿ‡ธ +๐Ÿ‡ช๐Ÿ‡ธ 2021-10-03 nitter.ethibox.fr -๐Ÿ‡ซ๐Ÿ‡ท +๐Ÿ‡ซ๐Ÿ‡ท Unknown nitter.cattube.org -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2021-10-06 nitter.vxempire.xyz -๐Ÿ‡ช๐Ÿ‡ธ +๐Ÿ‡ช๐Ÿ‡ธ 2021-11-30 n.0x0.st -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2021-12-06 is-nitter.resolv.ee -๐Ÿ‡ฎ๐Ÿ‡ธ +๐Ÿ‡ฎ๐Ÿ‡ธ 2021-12-10 lu-nitter.resolv.ee -๐Ÿ‡ฑ๐Ÿ‡บ +๐Ÿ‡ฑ๐Ÿ‡บ 2021-12-31 nitterrrs6...hid.onion -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ 2022-01-31 nitter.koyu.space -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2022-01-24 nitter.autarkic.org -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ 2022-01-28 nitter.eu.org -๐ŸŒ +๐ŸŒ 2022-02-14 nittereu.moomoo.me -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2022-04-24 twitr.gq -๐Ÿ‡ซ๐Ÿ‡ฎ +๐Ÿ‡ซ๐Ÿ‡ฎ 2022-04-26 nitter.alefvanoon.xyz -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ 2022-04-28 nitter.datatunnel.xyz -๐Ÿ‡ซ๐Ÿ‡ฎ +๐Ÿ‡ซ๐Ÿ‡ฎ 2022-05-12 nitter.silkky.cloud -๐Ÿ‡ซ๐Ÿ‡ฎ +๐Ÿ‡ซ๐Ÿ‡ฎ 2022-05-23 nitter.govt.land -๐ŸŒ +๐ŸŒ 2022-05-04 nitter.mstdn.social -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2022-06-28 nitter.oishi-ra.men -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2022-07-07 nitter.mastodon.pro -๐Ÿ‡จ๐Ÿ‡ญ +๐Ÿ‡จ๐Ÿ‡ญ 2022-07-14 n.hyperborea.cloud -๐Ÿ‡จ๐Ÿ‡ฆ +๐Ÿ‡จ๐Ÿ‡ฆ 2022-07-23 nitter.notraxx.ch -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2022-09-13 nitter.ebnar.xyz -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2022-09-16 @@ -2520,174 +3771,289 @@ twtr.bch.bar -๐ŸŒ +๐ŸŒ 2022-11-02 n.ramle.be -๐Ÿ‡ง๐Ÿ‡ช +๐Ÿ‡ง๐Ÿ‡ช 2022-11-03 nitter.ca -๐Ÿ‡จ๐Ÿ‡ฆ +๐Ÿ‡จ๐Ÿ‡ฆ 2022-11-26 nitter.fprivacy.com -๐Ÿ‡ธ๐Ÿ‡ฌ +๐Ÿ‡ธ๐Ÿ‡ฌ 2023-01-01 nitter.marcopisco.com -๐Ÿ‡ต๐Ÿ‡น +๐Ÿ‡ต๐Ÿ‡น 2023-01-01 fuckthesacklers.network -๐ŸŒ +๐ŸŒ 2023-01-13 bird.wilbvr.me -๐Ÿ‡ณ๐Ÿ‡ฑ +๐Ÿ‡ณ๐Ÿ‡ฑ Never Online nitter.mask.sh -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ 2023-01-29 nitter.drivet.xyz -๐Ÿ‡ซ๐Ÿ‡ท +๐Ÿ‡ซ๐Ÿ‡ท 2023-02-03 nitter.pussthecat.org -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2023-02-09 nitter.namazso.eu -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2023-02-19 nitter.manasiwibi.com -๐Ÿ‡ธ๐Ÿ‡ฌ +๐Ÿ‡ธ๐Ÿ‡ฌ 2023-03-04 nitter.librenode.org -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2023-03-24 nitter.girlboss.ceo -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ 2023-03-20 nitter.foss.wtf -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2023-04-13 nitter.grimneko.de -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2023-04-30 nitter.winscloud.net -๐Ÿ‡น๐Ÿ‡ญ +๐Ÿ‡น๐Ÿ‡ญ 2023-05-13 nitter.dcs0.hu -๐Ÿ‡ญ๐Ÿ‡บ +๐Ÿ‡ญ๐Ÿ‡บ 2023-05-13 nitter.fly.dev -๐ŸŒ +๐ŸŒ Unknown nitter.bus-hit.me -๐Ÿ‡จ๐Ÿ‡ฆ +๐Ÿ‡จ๐Ÿ‡ฆ Unknown nitter.garudalinux.org -๐Ÿ‡ซ๐Ÿ‡ฎ +๐Ÿ‡ซ๐Ÿ‡ฎ Unknown twitter.femboy.hu -๐Ÿ‡ญ๐Ÿ‡บ +๐Ÿ‡ญ๐Ÿ‡บ Unknown nitter.evil.site -๐Ÿ‡ฌ๐Ÿ‡ง +๐Ÿ‡ฌ๐Ÿ‡ง Unknown nitter.priv.pw -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช Unknown nitter.arcticfoxes.net -๐Ÿ‡ฌ๐Ÿ‡ง +๐Ÿ‡ฌ๐Ÿ‡ง Unknown nitter.ktachibana.party -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ Unknown ntr.odyssey346.dev -๐Ÿ‡ซ๐Ÿ‡ท +๐Ÿ‡ซ๐Ÿ‡ท Unknown nitter.plus.st -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ Unknown nitter.kozmik.studio -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ Unknown nitter.sylentpunk.xyz -๐Ÿ‡ฎ๐Ÿ‡ธ +๐Ÿ‡ฎ๐Ÿ‡ธ Unknown twitter.censors.us -๐Ÿ‡บ๐Ÿ‡ธ +๐Ÿ‡บ๐Ÿ‡ธ Unknown nitter.spaceint.fr -๐Ÿ‡ง๐Ÿ‡ช +๐Ÿ‡ง๐Ÿ‡ช Unknown twitter.dr460nf1r3.org -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช Unknown +t.floss.media +๐Ÿ‡ซ๐Ÿ‡ฎ +Unknown + + +nitter.hu +๐Ÿ‡ญ๐Ÿ‡บ +Unknown + + +nitter.catalyst.sx +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +nitter.pw +๐ŸŒ +Unknown + + +twt.funami.tech +๐Ÿ‡ฐ๐Ÿ‡ท +Unknown + + +notabird.site +๐ŸŒ +Unknown + + +nitter.ftw.lol +๐Ÿ‡ฉ๐Ÿ‡ช +Unknown + + +twit.hell.rodeo +๐Ÿ‡ฉ๐Ÿ‡ช +Unknown + + +ntr.frail.duckdns.org +๐Ÿ‡ง๐Ÿ‡ท +Unknown + + +nitter.ir +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +nitter.tokhmi.xyz +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +nitter.instances.cc +๐Ÿ‡ณ๐Ÿ‡ด +Unknown + + +nitter.nachtalb.io +๐Ÿ‡จ๐Ÿ‡ญ +Unknown + + +n.quadtr.ee +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +twitter.owacon.moe +๐Ÿ‡ฏ๐Ÿ‡ต +Unknown + + +nitter.privacytools.io +๐Ÿ‡ธ๐Ÿ‡ช +Unknown + + +nitter.slipfox.xyz +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +n.l5.ca +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +birdsite.xanny.family +๐ŸŒ +Unknown + + +nitter.domain.glass +๐Ÿ‡บ๐Ÿ‡ธ +Unknown + + +nitter.pufe.org +๐Ÿ‡ณ๐Ÿ‡ฟ +2023-07-03 + + nitter.fascinated.cc -๐Ÿ‡ฉ๐Ÿ‡ช +๐Ÿ‡ฉ๐Ÿ‡ช 2023-07-19 + +nitter.riverside.rocks +๐Ÿ‡บ๐Ÿ‡ธ +2023-08-19 + + +n.opnxng.com +๐Ÿ‡ธ๐Ÿ‡ฌ +2023-08-27 +

    Third-party Nitter services

    @@ -2707,6 +4073,10 @@ Farside Randomly picks a working instance for various frontends + +nitter-status +Tracks uptime for Nitter instances + @@ -2714,6 +4084,12 @@
    + @@ -2726,6 +4102,7 @@ + @@ -2830,6 +4207,16 @@ + @@ -2838,5 +4225,3 @@ - - diff --git a/scanner/test_data/instancelist_expected.csv b/scanner/test_data/instancelist_expected.csv new file mode 100644 index 0000000..2e313ad --- /dev/null +++ b/scanner/test_data/instancelist_expected.csv @@ -0,0 +1,76 @@ +domain,url,online,ssl_provider,country +nitter.privacydev.net,https://nitter.privacydev.net,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ท +nitter.adminforge.de,https://nitter.adminforge.de,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +bird.habedieeh.re,https://bird.habedieeh.re,true,Let's Encrypt,๐Ÿ‡จ๐Ÿ‡ฆ +nitter.platypush.tech,https://nitter.platypush.tech,false,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.us.projectsegfau.lt,https://nitter.us.projectsegfau.lt,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +singapore.unofficialbird.com,https://singapore.unofficialbird.com,true,Let's Encrypt,๐Ÿ‡ธ๐Ÿ‡ฌ +nitter.smnz.de,https://nitter.smnz.de,false,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.one,https://nitter.one,true,Let's Encrypt,๐Ÿ‡ธ๐Ÿ‡ช +nitter.fediflix.org,https://nitter.fediflix.org,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +tweet.lambda.dance,https://tweet.lambda.dance,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.mint.lgbt,https://nitter.mint.lgbt,true,Let's Encrypt,๐Ÿ‡ฌ๐Ÿ‡ง +nitter.poast.org,https://nitter.poast.org,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +n.sneed.network,https://n.sneed.network,true,Cloudflare,๐Ÿ‡ฆ๐Ÿ‡บ +nitter.inpt.fr,https://nitter.inpt.fr,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ท +unofficialbird.com,https://unofficialbird.com,true,ZeroSSL,๐Ÿ‡บ๐Ÿ‡ธ +nederland.unofficialbird.com,https://nederland.unofficialbird.com,true,Let's Encrypt,๐Ÿ‡ณ๐Ÿ‡ฑ +nitter.twei.space,https://nitter.twei.space,true,Let's Encrypt,๐Ÿ‡ฆ๐Ÿ‡น +nitter.rawbit.ninja,https://nitter.rawbit.ninja,true,Cloudflare,๐Ÿ‡บ๐Ÿ‡ธ +nitter.bird.froth.zone,https://nitter.bird.froth.zone,true,Let's Encrypt,๐Ÿ‡จ๐Ÿ‡ฆ +twitter.moe.ngo,https://twitter.moe.ngo,true,Google Trust Services LLC,๐Ÿ‡ฎ๐Ÿ‡ฉ +nitter.fdn.fr,https://nitter.fdn.fr,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ท +nitter.onthescent.xyz,https://nitter.onthescent.xyz,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +uk.unofficialbird.com,https://uk.unofficialbird.com,true,Let's Encrypt,๐Ÿ‡ฌ๐Ÿ‡ง +nitter.perennialte.ch,https://nitter.perennialte.ch,true,Google Trust Services LLC + Cloudflare,๐Ÿ‡ฆ๐Ÿ‡บ +nitter.eu.projectsegfau.lt,https://nitter.eu.projectsegfau.lt,true,Let's Encrypt,๐Ÿ‡ฑ๐Ÿ‡บ +nitter.kylrth.com,https://nitter.kylrth.com,true,Let's Encrypt,๐Ÿ‡จ๐Ÿ‡ฆ +nitter.in.projectsegfau.lt,https://nitter.in.projectsegfau.lt,true,Let's Encrypt,๐Ÿ‡ฎ๐Ÿ‡ณ +nitter.privacy.com.de,https://nitter.privacy.com.de,true,ZeroSSL,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.unixfox.eu,https://nitter.unixfox.eu,true,Buypass AS-983163327,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.dafriser.be,https://nitter.dafriser.be,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nt.vern.cc,https://nt.vern.cc,false,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.io.lol,https://nitter.io.lol,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +india.unofficialbird.com,https://india.unofficialbird.com,true,Let's Encrypt,๐Ÿ‡ฎ๐Ÿ‡ณ +t.com.sb,https://t.com.sb,true,ZeroSSL,๐Ÿ‡ช๐Ÿ‡ช +nitter.tux.pizza,https://nitter.tux.pizza,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.weiler.rocks,https://nitter.weiler.rocks,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.nicfab.eu,https://nitter.nicfab.eu,true,Let's Encrypt,๐Ÿ‡ฎ๐Ÿ‡น +nitter.tiekoetter.com,https://nitter.tiekoetter.com,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.salastil.com,https://nitter.salastil.com,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.esmailelbob.xyz,https://nitter.esmailelbob.xyz,true,Let's Encrypt,๐Ÿ‡จ๐Ÿ‡ฆ +nitter.freedit.eu,https://nitter.freedit.eu,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.sethforprivacy.com,https://nitter.sethforprivacy.com,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.kavin.rocks,https://nitter.kavin.rocks,true,Let's Encrypt,๐Ÿ‡ฎ๐Ÿ‡ณ +nitter.services.woodland.cafe,https://nitter.services.woodland.cafe,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.hostux.net,https://nitter.hostux.net,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ท +nitter.1d4.us,https://nitter.1d4.us,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.cz,https://nitter.cz,true,Let's Encrypt,๐Ÿ‡จ๐Ÿ‡ฟ +nitter.nl,https://nitter.nl,true,Let's Encrypt,๐Ÿ‡ณ๐Ÿ‡ฑ +nitter.altgr.xyz,https://nitter.altgr.xyz,true,Cloudflare,๐Ÿ‡จ๐Ÿ‡ฑ +nitter.x86-64-unknown-linux-gnu.zip,https://nitter.x86-64-unknown-linux-gnu.zip,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +tw.artemislena.eu,https://tw.artemislena.eu,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.private.coffee,https://nitter.private.coffee,true,Let's Encrypt,๐Ÿ‡ฆ๐Ÿ‡น +nitter.simpleprivacy.fr,https://nitter.simpleprivacy.fr,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ท +nitter.kling.gg,https://nitter.kling.gg,true,Let's Encrypt,๐Ÿ‡ณ๐Ÿ‡ฑ +nitter.qwik.space,https://nitter.qwik.space,true,Let's Encrypt,๐Ÿ‡ธ๐Ÿ‡ช +nitter.soopy.moe,https://nitter.soopy.moe,true,Let's Encrypt,๐Ÿ‡ญ๐Ÿ‡ฐ +nitter.caioalonso.com,https://nitter.caioalonso.com,false,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.laserdisc.tokyo,https://nitter.laserdisc.tokyo,true,Let's Encrypt,๐Ÿ‡ธ๐Ÿ‡ช +tweet.whateveritworks.org,https://tweet.whateveritworks.org,true,Let's Encrypt + Cloudflare,๐Ÿ‡ฉ๐Ÿ‡ช +jote.lile.cl,https://jote.lile.cl,true,Cloudflare,๐Ÿ‡จ๐Ÿ‡ฑ +nitter.nixnet.services,https://nitter:nitter@nitter.nixnet.services,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +bird.trom.tf,https://bird.trom.tf,false,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.at,https://nitter.at,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.no-logs.com,https://nitter.no-logs.com,true,Let's Encrypt,๐Ÿ‡ธ๐Ÿ‡ช +nitter.it,https://nitter.it,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ฎ +canada.unofficialbird.com,https://canada.unofficialbird.com,true,Let's Encrypt,๐Ÿ‡จ๐Ÿ‡ฆ +nitter.lacontrevoie.fr,https://nitter.lacontrevoie.fr,true,Let's Encrypt,๐Ÿ‡ซ๐Ÿ‡ท +nitter.moomoo.me,https://nitter.moomoo.me,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.projectsegfau.lt,https://nitter.projectsegfau.lt,true,Let's Encrypt,GeoDNS +nitter.oksocial.net,https://nitter.oksocial.net,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.catsarch.com,https://nitter.catsarch.com,true,Let's Encrypt,๐Ÿ‡บ๐Ÿ‡ธ +nitter.datura.network,https://nitter.datura.network,true,Let's Encrypt,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.d420.de,https://nitter.d420.de,true,Cloudflare,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.lunar.icu,https://nitter.lunar.icu,true,Cloudflare,๐Ÿ‡ฉ๐Ÿ‡ช +nitter.nohost.network,https://nitter.nohost.network,true,Let's Encrypt,๐Ÿ‡ฒ๐Ÿ‡ฝ diff --git a/server/templates/about.html.j2 b/server/templates/about.html.j2 index 6e9a328..5514d13 100644 --- a/server/templates/about.html.j2 +++ b/server/templates/about.html.j2 @@ -35,7 +35,7 @@
  • Points is a weighted instance score based on the availability over the last 3h, 30 and 120 days, together with the version.
  • -

    Sourcecode

    +

    Sourcecode

    License: AGPL3

    \ No newline at end of file diff --git a/server/templates/instances.html.j2 b/server/templates/instances.html.j2 index b177071..1bc774e 100644 --- a/server/templates/instances.html.j2 +++ b/server/templates/instances.html.j2 @@ -4,7 +4,6 @@ - Nitter Instance Health @@ -12,16 +11,17 @@

    Nitter Instance Uptime & Health

    About

    -

    Please use /api/v1/instances for bots.

    -

    Last Updated {{last_updated}} UTC.

    +

    Please use /api/v1/instances for bots.

    +

    Last Updated {{last_updated}} UTC.

    + - - + + @@ -30,7 +30,8 @@ {% for host in instances -%} - + +
    InstanceCountry HealthyResponse TimeAverageResponse TimesAverage (ms) RSS Version Points
    {{host.domain}}{{host.domain}}{{host.country}} {%- if host.is_bad_host -%}
    โ“
    @@ -42,7 +43,7 @@
    {%- if host.recent_pings|length > 0 -%} {%- set height = 57 -%} - {%- set width = 182 -%} + {%- set width = 100 -%} {%- set amount = host.recent_pings|length -%} {%- set width_bar = width / amount -%} {%- set offset = 5 -%} diff --git a/src/main.rs b/src/main.rs index cbcab87..fe97afb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -117,6 +117,8 @@ fn read_scanner_cfg() -> miette::Result { .expect("PROFILE_POSTS_MIN must be a positive number"); let rss_content = require_env_str("RSS_CONTENT")?; let additional_hosts: Vec = require_env_vec_str("ADDITIONAL_HOSTS")?; + let additional_host_country = require_env_str("ADDITIONAL_HOSTS_COUNTRY")?; + let rss_content = require_env_str("RSS_CONTENT")?; let bad_hosts: Vec = require_env_vec_str("BAD_HOSTS")?; let referrer = require_env_str("REFERER")?; let auto_mute = require_env_str("AUTO_MUTE")? == "true"; @@ -134,6 +136,7 @@ fn read_scanner_cfg() -> miette::Result { profile_posts_min, rss_content, additional_hosts, + additional_host_country, referrer, ping_range: chrono::Duration::hours(ping_range as _), auto_mute,