From 20e41d8f65e5d18dd50e450f61691a12f671df66 Mon Sep 17 00:00:00 2001 From: Anders Olsson Date: Wed, 6 Feb 2019 17:08:45 +0100 Subject: [PATCH] Did a lot of things. --- _build.rs | 47 +++ fixtures/eniro/0701807618.html | 123 +++++++ fixtures/hitta/0701807618.html | 106 ++++++ fixtures/konsumentinfo/0701807618.html | 162 +++++++++ fixtures/telefonforsaljare/0701807618.html | 172 ++++++++++ fixtures/vemringde/0701807618.html | 370 +++++++++++++++++++++ src/lib.rs | 5 + src/main.rs | 32 +- src/probe.rs | 7 +- src/probe/eniro.rs | 36 +- src/probe/hitta.rs | 32 +- src/probe/konsument_info.rs | 32 +- src/probe/telefonforsaljare.rs | 36 +- src/probe/vem_ringde.rs | 35 +- 14 files changed, 1118 insertions(+), 77 deletions(-) create mode 100644 _build.rs create mode 100644 fixtures/eniro/0701807618.html create mode 100644 fixtures/hitta/0701807618.html create mode 100644 fixtures/konsumentinfo/0701807618.html create mode 100644 fixtures/telefonforsaljare/0701807618.html create mode 100644 fixtures/vemringde/0701807618.html create mode 100644 src/lib.rs diff --git a/_build.rs b/_build.rs new file mode 100644 index 0000000..374fba8 --- /dev/null +++ b/_build.rs @@ -0,0 +1,47 @@ +use std::env; +use std::fs::read_dir; +use std::fs::DirEntry; +use std::fs::File; +use std::io::Write; +use std::path::Path; + +fn main() { + let out_dir = env::var("OUT_DIR").unwrap(); + let destination = Path::new(&out_dir).join("tests.rs"); + let mut test_file = File::create(&destination).unwrap(); + + // write_header(&mut test_file); + + // let test_data_directories = read_dir("./tests/data/").unwrap(); + + /* + for directory in test_data_directories { + write_test(&mut test_file, &directory.unwrap()); + } + */ +} + +fn write_header(test_file: &mut File) { + write!( + test_file, + r#" +use insta::assert_yaml_snapshot_matches; +use whoareyou::*; +"# + ) + .unwrap(); +} + +fn write_test(test_file: &mut File, directory: &DirEntry) { + let directory = directory.path().canonicalize().unwrap(); + let path = directory.display(); + let test_name = format!("prefix_if_needed_{}", directory.file_name().unwrap().to_string_lossy()); + + write!( + test_file, + include_str!("./tests/test_template"), + name = test_name, + path = path + ) + .unwrap(); +} diff --git a/fixtures/eniro/0701807618.html b/fixtures/eniro/0701807618.html new file mode 100644 index 0000000..9e5601c --- /dev/null +++ b/fixtures/eniro/0701807618.html @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Okänt telefonnummer | 0701807618 | eniro.se + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + diff --git a/fixtures/hitta/0701807618.html b/fixtures/hitta/0701807618.html new file mode 100644 index 0000000..63d9807 --- /dev/null +++ b/fixtures/hitta/0701807618.html @@ -0,0 +1,106 @@ +Vem ringde? | 070-180 76 18

070-180 76 18

Numret tillhör Anders

En man i 30-årsåldern från Hjo.

Mer om Anders
Se Anders adress

Andra format av 070-180 76 18

+46701807618   0046701807618   0701807618   +46 701807618   tlf 701807618   +4670 180 76 18   +4670-180 76 18   tel:+4670-180 76 18   070-180 76 18   070-1807618  
\ No newline at end of file diff --git a/fixtures/konsumentinfo/0701807618.html b/fixtures/konsumentinfo/0701807618.html new file mode 100644 index 0000000..74ae67d --- /dev/null +++ b/fixtures/konsumentinfo/0701807618.html @@ -0,0 +1,162 @@ + + + + + + +Telefon: 0701807618,+46701807618,0046701807618 - Konsumentinfo.se,konsumentinformation, konsument + + + + + + + + + + + + + + + + + + + +
+
+ +Hjälp oss. Ge ett bidrag på valfritt belopp. Vi behöver din hjälp. Läs mer här. + +
+
+
+
+ + +
+
+
+
+
+
+

0701807618

+0046701807618 alt: +46701807618 +
+
+Vi har ingen information om vem numret tillhör. +
+
+
+

Numret har inga anteckningar gjorda av våra besökare.

+
+ +
+ + +
+
+
+
+
+

10 senaste besökta nummer

0765790932 - Vet du något om detta nummer?
0761400942 - Vet du något om detta nummer?
0706423599 - Vet du något om detta nummer?
0798977475 - Vet du något om detta nummer?
0706269427 - Vet du något om detta nummer?
0700719051 - Vet du något om detta nummer?
0734667401 - Vet du något om detta nummer?
0730071731 - Vet du något om detta nummer?
0791577249 - Vet du något om detta nummer?
0763925840 - Vet du något om detta nummer?
Informationen uppdateras varje minut
+
+
+
+funktionen är under uppbyggnad
+
+
+
+funktionen är under uppbyggnad
+
+
+
+ + +
+
+
+
+ +
+ + + + diff --git a/fixtures/telefonforsaljare/0701807618.html b/fixtures/telefonforsaljare/0701807618.html new file mode 100644 index 0000000..21f4c0d --- /dev/null +++ b/fixtures/telefonforsaljare/0701807618.html @@ -0,0 +1,172 @@ + + + + +0701807618 - Har 070-180 76 18 ringt? | Nummerupplysning + +
+
+
+
+ + + + + +
+
+
+ + +

Har 070-180 76 18 ringt dig?

+ + + + +
+ +

Numret är ett mobilnummer och använder operatören Telia Sverige AB.

+
+ + +

De senaste 24 timmarna har 1 personer sökt efter numret 0701807618. Det kan tyda på att numret används av telefonförsäljare. Totalt har minst 2 personer sökt efter numret.

Sökningar efter 0701807618 de senaste två veckorna:

Kommentera ditt samtal från 070-180 76 18 nedan:

+ + +

Har telefonförsäljare från 0701807618 ringt dig?

+ +
+
+ + +
+ + + + + +
+
+ +
+ + + + + + + + + + + + +
+ + +
+ + +
+ +
+ + +
+ +
+ +
+
+ + + +
+ + + + +
+ + + +
+ + +

Tips

+

Om du vill slippa telefonförsäljare hem skaffa ett gratis kontantkort. Det eftersom de ofta kollar ditt nummer på nummerupplysningen och då ringer till kontantkortet i stället. Vi har testat detta erbjudande själva och det är helt gratis utan förpliktelser. +Ett annat tips är att ringa via mobilt bredband & Skype. +
+Telemarketing är ett vanligt jobb bland ungdomar. Eftersom de jobbar provisionsbaserat kan de då och då säga till sin arbetsgivare att de sålt en produkt utan att de gjort det och kunden får då en faktura trots att så inte var överenskommet. Du ska då alltid meddela företaget att du bestrider fakturan. Få det kostnadsfria kontantkortet hemskickat till dörren +.

+ + + + +

+Numret 0701807618 kan även skrivas som 070-1807618 eller 0701-807618.

Internationell formatering av numret:
+46701807618
0046701807618

+ +

Telefonnummer som liknar 0701807618

+
+
+
+ + + + + + +
+
+ + + + diff --git a/fixtures/vemringde/0701807618.html b/fixtures/vemringde/0701807618.html new file mode 100644 index 0000000..b07b11d --- /dev/null +++ b/fixtures/vemringde/0701807618.html @@ -0,0 +1,370 @@ + + + + Har 0701807618 ringt dig? | Vem ringde – missat samtal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + + +
+ +
+
+ + + + +
+ + + + +

Har 0701807618 ringt dig?

+
+
  1. + + + + + +
    +
    +
    +
+
+
+ + +
+

Gilla och dela vår info om 0701807618

+ + + + +
+ + + + + + + +

Inga samtal från 0701807618, har du provat Eniro?

+ +

Varför?

+

Det kan finns flera anledningar:

+
    +
  • Ägaren är en privatperson, har du provat söka på Eniro?
  • +
  • Ägaren av numret använder inte telemarketing i sin verksamhet
  • +
  • Ingen har rapporterat in det + , om du anser att det behöver göras;
    + bli den första, fyll i formuläret under rubriken "Har 0701807618 ringt dig?"
  • +
+ +

Du kan också gå till:

+ + +
    + +
    + +
    + + + + +
    + +
    + + + +
    +
    + +
    +
    +

    Vem ringde

    +
      +
    • Riktnummer 070 = Mobiltelefoner
    • Fyll i vem som ringde till vänster, och spara!
    • +
    +
    +
    +
    +
    +

    Dela med dig av Vemringde.se

    + +

    +
    +
    +

    Annons

    +
    + + + + + +
    +
    +
    + +
    +
    + +
    +
    + +
    + + +
    + + + + + + + diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..7bec293 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,5 @@ +mod context; +mod probe; + +pub use crate::context::Context; +pub use crate::probe::*; diff --git a/src/main.rs b/src/main.rs index c6b3822..fe43451 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,7 @@ use std::process::Command; use fern::colors::{Color, ColoredLevelConfig}; use structopt::StructOpt; - -mod context; -mod probe; - -use crate::context::Context; -use crate::probe::*; +use whoareyou::*; #[derive(Debug, StructOpt)] #[structopt(name = "whoareyou", about = "Search for swedish phone numbers.")] @@ -57,7 +52,7 @@ fn main() { config.apply().expect("failed to init fern"); - let mut probes: Vec> = vec![ + let mut probes: Vec> = vec![ Box::new(Eniro), Box::new(Hitta), Box::new(KonsumentInfo), @@ -77,9 +72,28 @@ fn main() { } else { let mut ctx = Context::new(); + let mut first = true; + for probe in &mut probes { - if let Ok(entry) = probe.search(&mut ctx, &opt.number) { - print!("{}", entry); + let data = if let Some(cache) = ctx.cache_get(probe.provider(), &opt.number) { + String::from_utf8(cache.data).unwrap() + } else if let Ok(data) = probe.fetch(&opt.number) { + ctx.cache_set(probe.provider(), &opt.number, data.as_bytes()) + .expect("wut?! why not?!"); + + data + } else { + continue; + }; + + if let Ok(entry) = probe.parse(&data) { + if first { + print!("{}\n{}", probe.provider(), entry); + + first = false; + } else { + print!("\n{}\n{}", probe.provider(), entry); + } } } } diff --git a/src/probe.rs b/src/probe.rs index be083b0..bbe8214 100644 --- a/src/probe.rs +++ b/src/probe.rs @@ -9,8 +9,6 @@ mod konsument_info; mod telefonforsaljare; mod vem_ringde; -use crate::context::Context; - pub use self::eniro::Eniro; pub use self::hitta::Hitta; pub use self::konsument_info::KonsumentInfo; @@ -79,6 +77,9 @@ impl fmt::Display for Comment { } pub trait Probe { + fn provider(&self) -> &'static str; fn uri(&self, _: &str) -> String; - fn search(&mut self, _: &mut Context, _: &str) -> Result; + + fn fetch(&self, _: &str) -> Result; + fn parse(&self, _: &str) -> Result; } diff --git a/src/probe/eniro.rs b/src/probe/eniro.rs index 1a32cf7..e46abf3 100644 --- a/src/probe/eniro.rs +++ b/src/probe/eniro.rs @@ -1,6 +1,5 @@ use scraper::{Html, Selector}; -use crate::context::Context; use crate::probe::{Entry, Probe}; fn from_html(document: &str) -> Result { @@ -44,23 +43,23 @@ fn from_html(document: &str) -> Result { pub struct Eniro; impl Probe for Eniro { + fn provider(&self) -> &'static str { + "eniro.se" + } + fn uri(&self, number: &str) -> String { format!("https://gulasidorna.eniro.se/hitta:{}", number) } - fn search(&mut self, ctx: &mut Context, number: &str) -> Result { - let body = if let Some(cache) = ctx.cache_get("eniro", &number) { - String::from_utf8(cache.data).unwrap() - } else { - let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap(); + fn fetch(&self, number: &str) -> Result { + reqwest::get(&self.uri(number)) + .map_err(|_| ())? + .text() + .map_err(|_| ()) + } - ctx.cache_set("eniro", &number, body.as_bytes()) - .expect("wut?! why not?!"); - - body - }; - - from_html(&body) + fn parse(&self, data: &str) -> Result { + from_html(&data) } } @@ -146,4 +145,15 @@ mod tests { - 303 denna vecka och 304 totalt. comments: []"###); } + + #[test] + fn test_0701807618() { + let document = include_str!("../../fixtures/eniro/0701807618.html"); + + assert_yaml_snapshot_matches!(from_html(&document), @r###"Ok: + messages: [] + history: + - 0 denna vecka och 1 totalt. + comments: []"###); + } } diff --git a/src/probe/hitta.rs b/src/probe/hitta.rs index 7c7b177..ab63851 100644 --- a/src/probe/hitta.rs +++ b/src/probe/hitta.rs @@ -3,7 +3,6 @@ use log::debug; use regex::Regex; use serde::Deserialize; -use crate::context::Context; use crate::probe::{self, Entry, Probe}; #[derive(Debug, Deserialize)] @@ -97,23 +96,23 @@ fn from_html(document: &str) -> Result { pub struct Hitta; impl Probe for Hitta { + fn provider(&self) -> &'static str { + "hitta.se" + } + fn uri(&self, number: &str) -> String { format!("https://www.hitta.se/vem-ringde/{}", number) } - fn search(&mut self, ctx: &mut Context, number: &str) -> Result { - let body = if let Some(cache) = ctx.cache_get("hitta", &number) { - String::from_utf8(cache.data).unwrap() - } else { - let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap(); + fn fetch(&self, number: &str) -> Result { + reqwest::get(&self.uri(number)) + .map_err(|_| ())? + .text() + .map_err(|_| ()) + } - ctx.cache_set("hitta", &number, body.as_bytes()) - .expect("wut?! why not?!"); - - body - }; - - from_html(&body) + fn parse(&self, data: &str) -> Result { + from_html(&data) } } @@ -282,4 +281,11 @@ mod tests { history: [] comments: []"###); } + + #[test] + fn test_0701807618() { + let document = include_str!("../../fixtures/hitta/0701807618.html"); + + assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~"); + } } diff --git a/src/probe/konsument_info.rs b/src/probe/konsument_info.rs index 5146238..3ca47cf 100644 --- a/src/probe/konsument_info.rs +++ b/src/probe/konsument_info.rs @@ -1,6 +1,5 @@ use scraper::{Html, Selector}; -use crate::context::Context; use crate::probe::{Entry, Probe}; fn from_html(document: &str) -> Result { @@ -33,23 +32,23 @@ fn from_html(document: &str) -> Result { pub struct KonsumentInfo; impl Probe for KonsumentInfo { + fn provider(&self) -> &'static str { + "konsumentinfo.se" + } + fn uri(&self, number: &str) -> String { format!("http://konsumentinfo.se/telefonnummer/sverige/{}", number) } - fn search(&mut self, ctx: &mut Context, number: &str) -> Result { - let body = if let Some(cache) = ctx.cache_get("konsument_info", &number) { - String::from_utf8(cache.data).unwrap() - } else { - let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap(); + fn fetch(&self, number: &str) -> Result { + reqwest::get(&self.uri(number)) + .map_err(|_| ())? + .text() + .map_err(|_| ()) + } - ctx.cache_set("konsument_info", &number, body.as_bytes()) - .expect("wut?! why not?!"); - - body - }; - - from_html(&body) + fn parse(&self, data: &str) -> Result { + from_html(&data) } } @@ -111,4 +110,11 @@ mod tests { assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~"); } + + #[test] + fn test_0701807618() { + let document = include_str!("../../fixtures/konsumentinfo/0701807618.html"); + + assert_yaml_snapshot_matches!(from_html(&document), @"Err: ~"); + } } diff --git a/src/probe/telefonforsaljare.rs b/src/probe/telefonforsaljare.rs index f0eebf8..34e1fe7 100644 --- a/src/probe/telefonforsaljare.rs +++ b/src/probe/telefonforsaljare.rs @@ -3,7 +3,6 @@ use chrono::{DateTime, NaiveDateTime, TimeZone, Utc}; use chrono_tz::Europe::Stockholm; use scraper::{Html, Selector}; -use crate::context::Context; use crate::probe::{Comment, Entry, Probe}; fn stockholm_to_utc(s: &str, fmt: &str) -> Result, ()> { @@ -93,23 +92,23 @@ fn from_html(document: &str) -> Result { pub struct Telefonforsaljare; impl Probe for Telefonforsaljare { + fn provider(&self) -> &'static str { + "telefonforsaljare.nu" + } + fn uri(&self, number: &str) -> String { format!("http://www.telefonforsaljare.nu/telefonnummer/{}/", number) } - fn search(&mut self, ctx: &mut Context, number: &str) -> Result { - let body = if let Some(cache) = ctx.cache_get("telefonforsaljare", &number) { - String::from_utf8(cache.data).unwrap() - } else { - let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap(); + fn fetch(&self, number: &str) -> Result { + reqwest::get(&self.uri(number)) + .map_err(|_| ())? + .text() + .map_err(|_| ()) + } - ctx.cache_set("telefonforsaljare", &number, body.as_bytes()) - .expect("wut?! why not?!"); - - body - }; - - from_html(&body) + fn parse(&self, data: &str) -> Result { + from_html(&data) } } @@ -222,4 +221,15 @@ mod tests { - Du är den första de senaste 24 timmarna som söker efter detta nummer. Det tyder på att numret inte används av telefonförsäljare. Totalt har minst 22 personer sökt efter numret. comments: []"###); } + + #[test] + fn test_0701807618() { + let document = include_str!("../../fixtures/telefonforsaljare/0701807618.html"); + + assert_yaml_snapshot_matches!(from_html(&document), @r###"Ok: + messages: [] + history: + - De senaste 24 timmarna har 1 personer sökt efter numret 0701807618. Det kan tyda på att numret används av telefonförsäljare. Totalt har minst 2 personer sökt efter numret. + comments: []"###); + } } diff --git a/src/probe/vem_ringde.rs b/src/probe/vem_ringde.rs index 93d7a9f..b2f2336 100644 --- a/src/probe/vem_ringde.rs +++ b/src/probe/vem_ringde.rs @@ -3,7 +3,6 @@ use std::str; // use log::debug; use scraper::{Html, Selector}; -use crate::context::Context; use crate::probe::{Entry, Probe}; fn from_html(document: &str) -> Result { @@ -36,23 +35,23 @@ fn from_html(document: &str) -> Result { pub struct VemRingde; impl Probe for VemRingde { + fn provider(&self) -> &'static str { + "vemringde.se" + } + fn uri(&self, number: &str) -> String { format!("http://vemringde.se/?q={}", number) } - fn search(&mut self, ctx: &mut Context, number: &str) -> Result { - let body = if let Some(cache) = ctx.cache_get("vem_ringde", &number) { - String::from_utf8(cache.data).unwrap() - } else { - let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap(); + fn fetch(&self, number: &str) -> Result { + reqwest::get(&self.uri(number)) + .map_err(|_| ())? + .text() + .map_err(|_| ()) + } - ctx.cache_set("vem_ringde", &number, body.as_bytes()) - .expect("wut?! why not?!"); - - body - }; - - from_html(&body) + fn parse(&self, data: &str) -> Result { + from_html(&data) } } @@ -132,4 +131,14 @@ mod tests { history: [] comments: []"###); } + + #[test] + fn test_0701807618() { + let document = include_str!("../../fixtures/vemringde/0701807618.html"); + + assert_yaml_snapshot_matches!(from_html(&document), @r###"Ok: + messages: [] + history: [] + comments: []"###); + } }