extern crate serde;
extern crate ureq;
use serde::{Deserialize, Serialize};
use std::env;
use std::fs;
use std::path::Path;
use ureq::get;
#[derive(Deserialize, Serialize, Debug, Default)]
pub struct ApiResult {
agent: String,
}
pub fn get_agent(url: &str, token: &String) -> String {
match get(&url).set("apikey", token).call() {
Ok(req) => {
let req: ApiResult = req
.into_json()
.expect("Authorization not granted! Make sure to set a valid API key.");
req.agent
}
Err(e) => {
panic!("{:?}", e)
}
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let build_enabled = env::var("BUILD_ENABLED").map(|v| v == "1").unwrap_or(false);
if build_enabled {
let base_api =
env::var("API_URL").unwrap_or("https://api.spider.cloud/data/user_agents".into());
let token: String = match env::var("APILAYER_KEY") {
Ok(key) => key,
Err(_) => {
println!("You need a valid {} API key to gather agents!", base_api);
"".to_string()
}
}
.to_string();
let windows_ie_desktop_agent = format!("{base_api}?windows=true&tablet=false&mobile=false&mac=false&linux=false&ie=true&firefox=false&desktop=true&chrome=false&android=false");
let windows_firefox_desktop_agent = format!("{base_api}?windows=true&tablet=false&mobile=false&mac=false&linux=false&ie=false&firefox=true&desktop=true&chrome=false&android=false");
let windows_chrome_desktop_agent = format!("{base_api}?windows=true&tablet=false&mobile=false&mac=false&linux=false&ie=false&firefox=false&desktop=true&chrome=true&android=false");
let mac_firefox_desktop_agent = format!("{base_api}?windows=false&tablet=false&mobile=false&mac=true&linux=false&ie=false&firefox=true&desktop=true&chrome=false&android=false");
let mac_chrome_desktop_agent = format!("{base_api}?windows=false&tablet=false&mobile=false&mac=true&linux=false&ie=false&firefox=false&desktop=true&chrome=true&android=false");
let linux_firefox_desktop_agent = format!("{base_api}?windows=false&tablet=false&mobile=false&mac=false&linux=true&ie=false&firefox=true&desktop=true&chrome=false&android=false");
let linux_chrome_desktop_agent = format!("{base_api}?windows=false&tablet=false&mobile=false&mac=false&linux=true&ie=false&firefox=false&desktop=true&chrome=true&android=false");
let android_firefox_agent = format!("{base_api}?windows=false&tablet=false&mobile=false&mac=false&linux=false&ie=true&firefox=true&desktop=true&chrome=false&android=true");
let android_chrome_agent = format!("{base_api}?windows=false&tablet=false&mobile=false&mac=false&linux=false&ie=true&firefox=true&desktop=true&chrome=false&android=true");
let windows_ie_desktop_agent: String = get_agent(&windows_ie_desktop_agent, &token);
let windows_firefox_desktop_agent: String =
get_agent(&windows_firefox_desktop_agent, &token);
let windows_chrome_desktop_agent: String = get_agent(&windows_chrome_desktop_agent, &token);
let mac_firefox_desktop_agent: String = get_agent(&mac_firefox_desktop_agent, &token);
let mac_chrome_desktop_agent: String = get_agent(&mac_chrome_desktop_agent, &token);
let linux_firefox_desktop_agent: String = get_agent(&linux_firefox_desktop_agent, &token);
let linux_chrome_desktop_agent: String = get_agent(&linux_chrome_desktop_agent, &token);
let android_firefox_agent: String = get_agent(&android_firefox_agent, &token);
let android_chrome_agent: String = get_agent(&android_chrome_agent, &token);
let dest_path = Path::new(&"./src").join("ua_list.rs");
let agents = format!(
r#"/// static list of agents pre-built
pub const STATIC_AGENTS: &'static [&'static str; 9] = &[
"{}",
"{}",
"{}",
"{}",
"{}",
"{}",
"{}",
"{}",
"{}"
];
/// user agent list
pub fn agents() -> [&'static str; 9] {{
STATIC_AGENTS.to_owned()
}}
"#,
windows_ie_desktop_agent,
windows_firefox_desktop_agent,
windows_chrome_desktop_agent,
android_firefox_agent,
mac_firefox_desktop_agent,
mac_chrome_desktop_agent,
android_chrome_agent,
linux_firefox_desktop_agent,
linux_chrome_desktop_agent,
);
fs::write(&dest_path, agents).unwrap();
let chrome_agent_list: Vec<ApiResult> =
match get(&format!("{base_api}?chrome=true&list=true"))
.set("apikey", &token)
.call()
{
Ok(req) => {
let req: Vec<ApiResult> = req
.into_json()
.expect("Authorization not granted! Make sure to set a valid API key.");
req
}
Err(e) => {
panic!("{:?}", e)
}
};
let dest_path = Path::new(&"./src").join("chrome_ua_list.rs");
let mut chrome_devices = format!("/// List of real Chrome User-Agents.\n Duplicates may be stored to increase chances of getting the most relevant agent.\npub const STATIC_CHROME_AGENTS: &'static [&'static str; {}] = &[\n", chrome_agent_list.len());
for device in chrome_agent_list {
chrome_devices.push_str(&format!(" \"{}\",\n", device.agent));
}
chrome_devices.push_str("];");
fs::write(dest_path, chrome_devices).unwrap();
println!("cargo:rerun-if-changed=build.rs");
}
Ok(())
}