Ошибка при попытке аутентификации на сайте
Я пытаюсь спарсить данные с сайта https://agenda.sime.md/ords/f?p=104:6 . Для этого необходимо авторизоваться. Я пытаюсь сделать это с помощью get и post запросов с помощью библиотеки reqwest и scraper. К сожалению при отправки конечного post запроса в ответ вместо redirect-url и coockie необходимых для доступа к конечной странице с данными я получаю "{\"error\":\"ERR-7620 Could not determine workspace for application ().\",\"addInfo\":\"Contact your application administrator.\",\"pageSubmissionId\":\"148993550275082927598434522305660063648\"}"
.
Как я понимаю сайт работает на библиотеке orecle-apex
Мой код на rust по отправке запроса:
#[tokio::main]
async fn main() {
// Отправляю Get запрос дабы получить instance, salt и тд необходимые для post зароса
let url = "https://agenda.sime.md/ords/wwv_flow.accept";
let mut headers = HeaderMap::new();
headers.insert(USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0".parse().unwrap());
let client = Client::new();
let page_1 = client.get("https://agenda.sime.md/ords/f?p=104:6::::::")
.headers(headers.clone())
.send()
.await
.unwrap();
headers.insert(COOKIE, page_1.headers().get(SET_COOKIE).unwrap().clone());
// Парсинг страницы и получение необходимых данных
let raw_html = page_1.text().await.unwrap();
let html = Html::parse_document(&raw_html);
let instance = html.select(&Selector::parse(r#"input[name="p_instance"]"#).unwrap())
.next()
.unwrap()
.value()
.attr("value")
.unwrap();
let page_submission_id = html.select(&Selector::parse(r#"input[name="p_page_submission_id"]"#).unwrap())
.next()
.unwrap()
.value()
.attr("value")
.unwrap();
let salt = html.select(&Selector::parse(r#"input[id="pSalt"]"#).unwrap())
.next()
.unwrap()
.value()
.attr("value")
.unwrap();
let regex = Regex::new(r#"f\?p=.+',\{"#).unwrap();
let dialog_url = html.select(&Selector::parse(r#"button[id="buttonCopii"]"#).unwrap())
.next()
.unwrap()
.value()
.attr("onclick")
.unwrap();
let capture = regex.find(dialog_url).unwrap().as_str();
let dialog_url = &capture[0..capture.len()-3].replace("\\u0026", "&");
// Подготовка заголовков необходимых для дальнейших запросов
//println!("{},{},{},{}",instance, page_submission_id, dialog_url, salt);
headers.insert(ACCEPT, "application/json, text/javascript, */*; q=0.01".parse().unwrap());
headers.insert(ACCEPT_ENCODING, "gzip, deflate, br".parse().unwrap());
headers.insert(ACCEPT_LANGUAGE, "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3".parse().unwrap());
headers.insert(REFERER, "https://agenda.sime.md/ords/https://agenda.sime.md/ords/f?p=104:6::::::".parse().unwrap());
headers.insert(CONTENT_LENGTH, "999".parse().unwrap());
headers.insert(ORIGIN, "https://agenda.sime.md".parse().unwrap());
headers.insert(CONNECTION, "keep-alive".parse().unwrap());
// Второй Get запросы дабы получить user_type и другой информации необходимой для отправки Post запроса
let page_2 = client
.get(format!(r#"https://agenda.sime.md/ords/{}"#, dialog_url))
.headers(headers.clone())
.send()
.await
.unwrap();
// Парсинг данных
let raw_html = page_2.text().await.unwrap();
let html = Html::parse_document(&raw_html);
let user_type = html.select(&Selector::parse(r#"input[data-for="P101_USER_TYPE"]"#).unwrap())
.next()
.unwrap()
.value()
.attr("value")
.unwrap();
let user_type_name = html.select(&Selector::parse(r#"input[data-for="P101_USER_TYPE_NAME"]"#).unwrap())
.next()
.unwrap()
.value()
.attr("value")
.unwrap();
let protected = html.select(&Selector::parse(r#"input[id=pPageItemsProtected]"#).unwrap())
.next()
.unwrap()
.value()
.attr("value")
.unwrap();
//println!("{}\n{}", user_type, user_type_name);
// Подготовка заголовков и тела Post запроса
*headers.get_mut(REFERER).unwrap() = format!("https://agenda.sime.md/ords/https://agenda.sime.md/ords/{}", dialog_url).parse().unwrap();
let mut content = HashMap::new();
content.insert("p_flow_id", "104");
content.insert("p_flow_step_id", "101");
content.insert("p_instance", instance);
content.insert("p_debug", "");
content.insert("p_request","LOGIN");
content.insert("p_reload_on_submit","S");
content.insert("p_page_submission_id", page_submission_id);
content.insert("p_json",&format!(r#"p_json=%7B%22pageItems%22%3A%7B%22itemsToSubmit%22%3A%5B%7B%22n%22%3A%22P101_USER_TYPE%22%2C%22v%22%3A%222%22%2C%22ck%22%3A%22{}%22%7D%2C%7B%22n%22%3A%22P101_USER_TYPE_NAME%22%2C%22v%22%3A%22Autentificare+elev%22%2C%22ck%22%3A%22{}%22%7D%2C%7B%22n%22%3A%22P101_USERNAME%22%2C%22v%22%3A%22/login/%22%7D%2C%7B%22n%22%3A%22P101_PASSWORD%22%2C%22v%22%3A%22/*password*/%22%7D%5D%2C%22protected%22%3A%22{}%22%2C%22rowVersion%22%3A%22%22%2C%22formRegionChecksums%22%3A%5B%5D%7D%2C%22salt%22%3A%22{}%22%7D"#, user_type, user_type_name, protected, salt));
// Отправка Post запроса
let res = client.get(url)
.headers(headers)
.send()
.await
.unwrap();
println!("{:?}", res.text().await.unwrap());
}
В поле p_json пароль был заменён на /password/ а логин на /login/ соответственно
Я пытался найти информацию по соответствующей ошибке но ничего найти не смог, предполагаю что плохо искал