diff --git a/src/main.rs b/src/main.rs index cd7c44f..9632dbf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,52 @@ struct Query { } async fn google(client: &Client, search: &str) -> Vec { - todo!() + let mut headers = HeaderMap::new(); + headers.insert("content-type", "application/x-www-form-urlencoded".parse().unwrap()); + headers.insert("Accept-Language", "en-US,en;q=0.9".parse().unwrap()); + headers.insert("Referer", "https://google.com/".parse().unwrap()); + + let request = client + .request(Method::GET, "https://google.com/search") + .headers(headers) + .query(&[("q", search)]) + .build() + .unwrap(); + let dom = client.execute(request) + .await + .unwrap() + .text() + .await + .unwrap(); + + #[cfg(debug_assertions)] + fs::write("google-debug.html", &dom).unwrap(); + + let html = Html::parse_document(&dom); + let search_result = Selector::parse("#search > #rso > div").unwrap(); + + let mut buf = Vec::new(); + + for result in html.select(&search_result) { + let title_selector = Selector::parse("h3").unwrap(); + let title = result.select(&title_selector).next().expect("Failed to get title"); + + let preview_selector = Selector::parse("span").unwrap(); + let preview = result.select(&preview_selector).next().expect("Failed to get title"); + + let a = title.attr("href").unwrap().to_string(); + let title = title.inner_html(); + let desc = preview.inner_html(); + + let sr = SearchResult { + a, + title, + desc + }; + buf.push(sr); + } + + buf } async fn ddg(client: &Client, search: &str) -> Vec { @@ -47,6 +92,7 @@ async fn ddg(client: &Client, search: &str) -> Vec { .await .unwrap(); + #[cfg(debug_assertions)] fs::write("ddg-debug.html", &ddg_dom).unwrap(); let html = Html::parse_document(&ddg_dom); @@ -94,6 +140,7 @@ async fn search(input: Form) -> Template { Template::render("results", context! { ddg: ddg(&client, clean).await, + google: google(&client, clean).await, last_search: clean }) }