use http_req::{
request::{Method, Request},
uri::Uri,
};
use lazy_static::lazy_static;
use urlencoding::encode;
lazy_static! {
static ref WEB_SCRAPER_API_PREFIX: String = String::from(
std::option_env!("WEB_SCRAPER_API_PREFIX")
.unwrap_or("https://web-scraper.flows.network/api")
);
}
extern "C" {
fn get_flows_user(p: *mut u8) -> i32;
fn get_flow_id(p: *mut u8) -> i32;
}
unsafe fn _get_flows_user() -> String {
let mut flows_user = Vec::<u8>::with_capacity(100);
let c = get_flows_user(flows_user.as_mut_ptr());
flows_user.set_len(c as usize);
String::from_utf8(flows_user).unwrap()
}
unsafe fn _get_flow_id() -> String {
let mut flow_id = Vec::<u8>::with_capacity(100);
let c = get_flow_id(flow_id.as_mut_ptr());
if c == 0 {
panic!("Failed to get flow id");
}
flow_id.set_len(c as usize);
String::from_utf8(flow_id).unwrap()
}
pub async fn get_page_text(url: &str) -> Result<String, String> {
unsafe {
let flows_user = _get_flows_user();
let flow_id = _get_flow_id();
let mut writer = Vec::new();
let uri = format!(
"{}/{}/{}/get_page_text?url={}",
WEB_SCRAPER_API_PREFIX.as_str(),
flows_user,
flow_id,
encode(url),
);
let uri = Uri::try_from(uri.as_str()).unwrap();
match Request::new(&uri).method(Method::GET).send(&mut writer) {
Ok(res) => {
if res.status_code().is_success() {
Ok(String::from_utf8_lossy(&writer).into_owned())
} else {
let err = String::from_utf8_lossy(&writer);
Err(err.into_owned())
}
}
Err(e) => Err(e.to_string()),
}
}
}