添加天梯(暂时还不是)
This commit is contained in:
parent
df7ba9484d
commit
41d22824a9
1
rust-namer/.gitignore
vendored
Normal file
1
rust-namer/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
target
|
1457
rust-namer/Cargo.lock
generated
Normal file
1457
rust-namer/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
12
rust-namer/Cargo.toml
Normal file
12
rust-namer/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "rust-namer"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = { version = "1.0", features = ["backtrace"] }
|
||||||
|
serde = { version = "1.0", features = ["serde_derive"] }
|
||||||
|
serde_json = "1.0"
|
||||||
|
tokio = { version = "1.36.0", features = ["full"] }
|
||||||
|
|
||||||
|
thirtyfour = "0.31.0"
|
21
rust-namer/insert.js
Normal file
21
rust-namer/insert.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
let has_done_target = document.getElementById('done_target');
|
||||||
|
if (has_done_target) {
|
||||||
|
has_done_target.display = 'none';
|
||||||
|
has_done_target.done = 'false';
|
||||||
|
} else {
|
||||||
|
let target = document.createElement("div", style = "display: none;");
|
||||||
|
target.id = "done_target";
|
||||||
|
target.style.display = "none";
|
||||||
|
document.body.appendChild(target);
|
||||||
|
}
|
||||||
|
// 监听消息
|
||||||
|
window.addEventListener('message', function (event) {
|
||||||
|
console.log('Received message:', event.data, event);
|
||||||
|
if (event.data.hasOwnProperty("all")) {
|
||||||
|
// 为 done_target 添加 done=true 属性
|
||||||
|
let done_target = document.getElementById('done_target');
|
||||||
|
done_target.setAttribute('done', 'true');
|
||||||
|
done_target.win_data = event.data;
|
||||||
|
console.log('done_target:', done_target);
|
||||||
|
}
|
||||||
|
});
|
16
rust-namer/src/main.rs
Normal file
16
rust-namer/src/main.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
use anyhow::Result;
|
||||||
|
|
||||||
|
mod runner;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<()> {
|
||||||
|
let web_runner = runner::WebDriverRunner::init("https://shenjack.top:82/md5").await?;
|
||||||
|
|
||||||
|
let result = web_runner.raw_flight("aaaaaaa\nnnnnn".to_string()).await?;
|
||||||
|
|
||||||
|
println!("{}", result.str_without_pic());
|
||||||
|
|
||||||
|
web_runner.quit().await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
97
rust-namer/src/runner.rs
Normal file
97
rust-namer/src/runner.rs
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use thirtyfour::prelude::*;
|
||||||
|
|
||||||
|
const INSERT_JS: &str = include_str!("../insert.js");
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct WinData {
|
||||||
|
pub all: Vec<Vec<Vec<String>>>,
|
||||||
|
pub winners: Vec<String>,
|
||||||
|
pub pic: String, // base64 img
|
||||||
|
#[serde(rename = "firstKill")]
|
||||||
|
pub first_kill: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WinData {
|
||||||
|
pub fn str_without_pic(&self) -> String {
|
||||||
|
format!(
|
||||||
|
"Winners: {:?}\nFirst Kill: {:?}\nAll: {:?}",
|
||||||
|
self.winners, self.first_kill, self.all
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TeamRunner {
|
||||||
|
pub time_out: Duration,
|
||||||
|
/// 每个队伍的成员, 队伍名
|
||||||
|
pub teams: Vec<(String, Vec<String>)>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TeamRunner {
|
||||||
|
// pub fn builder
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct WebDriverRunner {
|
||||||
|
pub driver: WebDriver,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for WebDriverRunner {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "Runner")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WebDriverRunner {
|
||||||
|
pub async fn init(target_url: impl AsRef<str>) -> Result<Self> {
|
||||||
|
let caps = DesiredCapabilities::edge();
|
||||||
|
let driver = WebDriver::new("http://localhost:9515", caps).await?;
|
||||||
|
driver.goto(target_url.as_ref()).await?;
|
||||||
|
driver.execute(INSERT_JS, vec![]).await?;
|
||||||
|
// insert.js
|
||||||
|
// 预备环境
|
||||||
|
|
||||||
|
Ok(Self { driver })
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn raw_flight(&self, teams: String) -> Result<WinData> {
|
||||||
|
let done_target = self.driver.find(By::Id("done_target")).await?;
|
||||||
|
let go_btn = self.driver.find(By::ClassName("goBtn")).await?;
|
||||||
|
let fast_forward_btn = self.driver.find(By::Id("fastBtn")).await?;
|
||||||
|
let name_input = self.driver.find(By::Id("input_name")).await?;
|
||||||
|
|
||||||
|
name_input.send_keys(teams).await?;
|
||||||
|
|
||||||
|
go_btn.click().await?;
|
||||||
|
tokio::time::sleep(std::time::Duration::from_millis(100)).await; // 等一会
|
||||||
|
fast_forward_btn.click().await?;
|
||||||
|
|
||||||
|
done_target
|
||||||
|
.wait_until()
|
||||||
|
.has_attribute("done", "true")
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let win_data = self
|
||||||
|
.driver
|
||||||
|
.execute("return arguments[0].win_data", vec![done_target.to_json()?])
|
||||||
|
.await?;
|
||||||
|
let win_data: WinData = serde_json::from_value(win_data.json().to_owned())?;
|
||||||
|
Ok(win_data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn flight(&self, teams: Vec<Vec<String>>) -> Result<WinData> {
|
||||||
|
let done_target = self.driver.find(By::Id("done_target")).await?;
|
||||||
|
let go_btn = self.driver.find(By::ClassName("goBtn")).await?;
|
||||||
|
let fast_forward_btn = self.driver.find(By::Id("fastBtn")).await?;
|
||||||
|
let name_input = self.driver.find(By::Id("input_name")).await?;
|
||||||
|
todo!("flight")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn quit(self) -> Result<()> {
|
||||||
|
self.driver.quit().await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user