wayback_rs/browser/
mod.rs1use async_std::task::sleep;
2use fantoccini::{error::CmdError, Client as FClient, Locator};
3use std::time::Duration;
4
5pub struct Client {
6 underlying: FClient,
7}
8
9impl Client {
10 const LOGIN_URL: &'static str = "https://archive.org/account/login";
11 const SAVE_URL: &'static str = "https://web.archive.org/save";
12 const LOGIN_FORM_LOC: Locator<'static> = Locator::Css("form[name='login-form']");
13 const SAVE_FORM_LOC: Locator<'static> = Locator::Css("#web-save-form");
14 const SAVE_DONE_LOC: Locator<'static> = Locator::XPath(
15 "//div[@id='spn-result']/span/a[contains(@href, '/web/')] | //div[@id='spn-result']/p[@class='text-danger']"
16 );
17 const SAVE_WAIT_MILLIS: u64 = 1000;
18
19 pub fn new(client: FClient) -> Client {
20 Client { underlying: client }
21 }
22
23 pub async fn login(&mut self, username: &str, password: &str) -> Result<(), CmdError> {
24 self.underlying.goto(Self::LOGIN_URL).await?;
25 let form = self.underlying.form(Self::LOGIN_FORM_LOC).await?;
26 form.set_by_name("username", username)
27 .await?
28 .set_by_name("password", password)
29 .await?
30 .submit()
31 .await?;
32
33 Ok(())
34 }
35
36 pub async fn save<'a>(&'a mut self, url: &'a str) -> Result<Option<String>, CmdError> {
37 sleep(Duration::from_millis(Self::SAVE_WAIT_MILLIS)).await;
38 self.underlying.goto(Self::SAVE_URL).await?;
39
40 self.underlying
41 .wait()
42 .forever()
43 .for_element(Self::SAVE_FORM_LOC)
44 .await?;
45 let form = self.underlying.form(Self::SAVE_FORM_LOC).await?;
46 form.set_by_name("url", url)
47 .await?
48 .set_by_name("capture_screenshot", "on")
49 .await?
50 .set_by_name("wm-save-mywebarchive", "on")
51 .await?
52 .set_by_name("email_result", "on")
53 .await?
54 .submit()
55 .await?;
56
57 let result = self
58 .underlying
59 .wait()
60 .forever()
61 .for_element(Self::SAVE_DONE_LOC)
62 .await?;
63 let result_href = result.attr("href").await?;
64
65 Ok(result_href)
66 }
67}