wayback_rs/browser/
mod.rs

1use 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}