Compare commits
	
		
			No commits in common. "0f9f06db5394e44131f8c49cdae6e37760453058" and "5f846b18c0ca7850b2b649362ea287baa6d9a315" have entirely different histories.
		
	
	
		
			0f9f06db53
			...
			5f846b18c0
		
	
		|  | @ -1,4 +1,3 @@ | ||||||
| .idea | .idea | ||||||
| target | target | ||||||
| test | test | ||||||
| logs |  | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										14
									
								
								Cargo.toml
								
								
								
								
							
							
						
						
									
										14
									
								
								Cargo.toml
								
								
								
								
							|  | @ -10,13 +10,12 @@ edition = "2021" | ||||||
| 
 | 
 | ||||||
| default = ["pokemmo"] | default = ["pokemmo"] | ||||||
| 
 | 
 | ||||||
| pokemmo = ["screen", "ocr", "joystick", "dep:image", "pokemon", "detector","sms"] | pokemmo = ["screen", "ocr", "joystick", "dep:image", "pokemon", "detector"] | ||||||
| screen = ["dep:screenshots"] | screen = ["dep:screenshots"] | ||||||
| ocr = ["dep:rusty-tesseract", "dep:image"] | ocr = ["dep:rusty-tesseract", "dep:image"] | ||||||
| joystick = ["dep:enigo","dep:rand"] | joystick = ["dep:enigo","dep:rand"] | ||||||
| pokemon = [] | pokemon = [] | ||||||
| detector = ["dep:crossterm"] | detector = ["dep:crossterm"] | ||||||
| sms = [] |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| [lib] | [lib] | ||||||
|  | @ -31,13 +30,4 @@ image = { version = "0.24.6", optional = true } | ||||||
| crossterm = { version = "0.27.0", optional = true } | crossterm = { version = "0.27.0", optional = true } | ||||||
| rusty-tesseract = { version = "1.1.7", optional = true } | rusty-tesseract = { version = "1.1.7", optional = true } | ||||||
| rand = { version = "0.8.5", optional = true } | rand = { version = "0.8.5", optional = true } | ||||||
| 
 | simple-logging = {version = "2.0.2"} | ||||||
| log4rs = {version = "1.2.0"} |  | ||||||
| #sms = {version = "0.1.8", optional = true} |  | ||||||
| futures = "0.3" |  | ||||||
| 
 |  | ||||||
| reqwest = { version = "0.11.18", features = ["json", "blocking"]} |  | ||||||
| chrono = { version = "0.4.24"} |  | ||||||
| ring = "0.16" |  | ||||||
| urlencoding = "2.1.0" |  | ||||||
| base64 = "0.21.5" |  | ||||||
|  | @ -1,26 +0,0 @@ | ||||||
| pub mod logger { |  | ||||||
|     use log4rs::append::file::FileAppender; |  | ||||||
|     use log4rs::Config; |  | ||||||
|     use log4rs::config::{Appender, Logger, Root}; |  | ||||||
|     use log4rs::encode::pattern::PatternEncoder; |  | ||||||
|     use log::LevelFilter; |  | ||||||
| 
 |  | ||||||
|     #[no_mangle] |  | ||||||
|     pub extern "C" fn init_logger(log_file_name: &str, level_filter: LevelFilter) { |  | ||||||
|         let file_path = format!(".\\logs\\{}.log", log_file_name); |  | ||||||
|         let mut config_builder = Config::builder(); |  | ||||||
|         let file = FileAppender::builder() |  | ||||||
|             .encoder(Box::new(PatternEncoder::new("[{d(%Y-%m-%d %H:%M:%S%.3f)}] {(\\({tid}\\)):7.7} {({l}):5.5} {m}{n}"))) |  | ||||||
|             // .encoder(Box::new(PatternEncoder::new("[{d(%Y-%m-%d %H:%M:%S%.3f)}] {(\\({tid}\\)):7.7} {({l}):5.5} {t} {m}{n}")))
 |  | ||||||
|             .build(&file_path) |  | ||||||
|             .unwrap(); |  | ||||||
|         config_builder = config_builder.appender(Appender::builder().build("file", Box::new(file))); |  | ||||||
|         let mut tag_logger = Logger::builder(); |  | ||||||
|         tag_logger = tag_logger.appender("file"); |  | ||||||
|         tag_logger = tag_logger.additive(true); |  | ||||||
|         let wecode_log = tag_logger.clone().build("nezha", level_filter); |  | ||||||
|         config_builder = config_builder.logger(wecode_log); |  | ||||||
|         let config = config_builder.build(Root::builder().build(level_filter)).expect("build log failed"); |  | ||||||
|         let handle_res = log4rs::init_config(config).expect("init log config failed"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| pub(crate) mod logger; |  | ||||||
| pub(crate) mod network; |  | ||||||
|  | @ -1,125 +0,0 @@ | ||||||
| pub(crate) mod network{ |  | ||||||
| 
 |  | ||||||
|     use chrono::{SecondsFormat, Utc}; |  | ||||||
|     use std::collections::HashMap; |  | ||||||
|     use ring::hmac; |  | ||||||
| 
 |  | ||||||
|     /// SMS API 版本
 |  | ||||||
|     const SMS_VERSION: &'static str = "2017-05-25"; |  | ||||||
| 
 |  | ||||||
|     /// 签名算法版本。目前为固定值 `1.0`。
 |  | ||||||
|     const SIGNATURE_VERSION: &'static str = "1.0"; |  | ||||||
| 
 |  | ||||||
|     /// 签名方式。目前为固定值 `HMAC-SHA1`。
 |  | ||||||
|     const SIGNATURE_METHOD: &'static str = "HMAC-SHA1"; |  | ||||||
| 
 |  | ||||||
|     /// 指定接口返回数据的格式。可以选择 `JSON` 或者 `XML`。默认为 `XML`。
 |  | ||||||
|     ///
 |  | ||||||
|     /// 这里选择 `JSON`。
 |  | ||||||
|     const FORMAT: &'static str = "json"; |  | ||||||
| 
 |  | ||||||
|     pub struct Aliyun<'a> { |  | ||||||
|         access_key_id: &'a str, |  | ||||||
|         access_secret: &'a str, |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     impl<'a> Aliyun<'a> { |  | ||||||
| 
 |  | ||||||
|         pub fn new(access_key_id: &'a str, access_secret: &'a str) -> Self { |  | ||||||
|             Self { |  | ||||||
|                 access_key_id, |  | ||||||
|                 access_secret, |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         pub fn send_sms( |  | ||||||
|             &self, |  | ||||||
|             phone_numbers: &'a str, |  | ||||||
|             sign_name: &'a str, |  | ||||||
|             template_code: &'a str, |  | ||||||
|             template_param: &'a str, |  | ||||||
|         ) -> Result<HashMap<String, String>, Box<dyn std::error::Error>> { |  | ||||||
|             let mut params = HashMap::new(); |  | ||||||
| 
 |  | ||||||
|             params.insert("PhoneNumbers", phone_numbers); |  | ||||||
|             params.insert("SignName", sign_name); |  | ||||||
|             params.insert("TemplateCode", template_code); |  | ||||||
|             params.insert("RegionId", "cn-hangzhou"); |  | ||||||
|             params.insert("TemplateParam", template_param); |  | ||||||
|             params.insert("Action", "SendSms"); |  | ||||||
|             params.insert("Version", SMS_VERSION); |  | ||||||
| 
 |  | ||||||
|             // 构造规范化请求字符串
 |  | ||||||
|             let canonicalize_query_string = self.canonicalize_query_string(¶ms); |  | ||||||
| 
 |  | ||||||
|             // 构造签名字符串
 |  | ||||||
|             let signature = self.signature( |  | ||||||
|                 format!( |  | ||||||
|                     "GET&%2F&{}", |  | ||||||
|                     urlencoding::encode(&canonicalize_query_string) |  | ||||||
|                 ) |  | ||||||
|                     .as_bytes(), |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             let url = format!( |  | ||||||
|                 "https://dysmsapi.aliyuncs.com/?{}&Signature={}", |  | ||||||
|                 canonicalize_query_string, signature |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             let client = reqwest::blocking::Client::new(); |  | ||||||
| 
 |  | ||||||
|             let resp= client.get(url).send()?.json::<HashMap<String, String>>()?; |  | ||||||
|             // let resp = reqwest::get(url)
 |  | ||||||
|             //     .await?
 |  | ||||||
|             //     .json::<HashMap<String, String>>()
 |  | ||||||
|             //     .await?;
 |  | ||||||
| 
 |  | ||||||
|             Ok(resp) |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         /// 构造规范化请求字符串
 |  | ||||||
|         ///
 |  | ||||||
|         /// 详见链接: https://help.aliyun.com/document_detail/315526.html#sectiondiv-y9b-x9s-wvp
 |  | ||||||
|         fn canonicalize_query_string(&self, params: &HashMap<&str, &'a str>) -> String { |  | ||||||
|             let now = Utc::now(); |  | ||||||
| 
 |  | ||||||
|             let signature_nonce = now.timestamp_nanos().to_string(); |  | ||||||
|             let timestamp = now.to_rfc3339_opts(SecondsFormat::Secs, true); |  | ||||||
| 
 |  | ||||||
|             let mut all_params = HashMap::new(); |  | ||||||
| 
 |  | ||||||
|             all_params.insert("AccessKeyId", self.access_key_id); |  | ||||||
|             all_params.insert("Format", FORMAT); |  | ||||||
|             all_params.insert("SignatureMethod", SIGNATURE_METHOD); |  | ||||||
|             all_params.insert("SignatureNonce", signature_nonce.as_str()); |  | ||||||
|             all_params.insert("SignatureVersion", SIGNATURE_VERSION); |  | ||||||
|             all_params.insert("Timestamp", timestamp.as_str()); |  | ||||||
| 
 |  | ||||||
|             params.iter().for_each(|(&k, &v)| { |  | ||||||
|                 all_params.insert(k, v); |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             let mut vec_arams: Vec<String> = all_params |  | ||||||
|                 .iter() |  | ||||||
|                 .map(|(&k, &v)| format!("{}={}", k, urlencoding::encode(&v))) |  | ||||||
|                 .collect(); |  | ||||||
| 
 |  | ||||||
|             vec_arams.sort(); |  | ||||||
| 
 |  | ||||||
|             vec_arams.join("&") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         /// 构建签名字符串
 |  | ||||||
|         fn signature(&self, string_to_sign: &[u8]) -> String { |  | ||||||
|             let key = hmac::Key::new( |  | ||||||
|                 hmac::HMAC_SHA1_FOR_LEGACY_USE_ONLY, |  | ||||||
|                 format!("{}&", self.access_secret).as_bytes(), |  | ||||||
|             ); |  | ||||||
| 
 |  | ||||||
|             let sign = hmac::sign(&key, string_to_sign); |  | ||||||
|             base64::encode(sign.as_ref()) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -4,5 +4,3 @@ pub(crate) mod pokemmo; | ||||||
| pub(crate) mod pokemon; | pub(crate) mod pokemon; | ||||||
| pub(crate) mod detector; | pub(crate) mod detector; | ||||||
| pub(crate) mod ocr; | pub(crate) mod ocr; | ||||||
| pub(crate) mod sms; |  | ||||||
| pub(crate) mod base; |  | ||||||
|  | @ -128,7 +128,7 @@ pub mod pokemmo_const_value{ | ||||||
|     #[derive(Debug)] |     #[derive(Debug)] | ||||||
|     pub enum PokemmoStatus { |     pub enum PokemmoStatus { | ||||||
|         // 遇见闪光
 |         // 遇见闪光
 | ||||||
|         MeetTarget, |         MeetShiny, | ||||||
|         // 无状态
 |         // 无状态
 | ||||||
|         Free, |         Free, | ||||||
|         // 加载遇怪动画
 |         // 加载遇怪动画
 | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ pub mod pokemmo { | ||||||
|     use crate::joystick::joystick::joystick::{move_once_by_mode, MoveMode, quick_press}; |     use crate::joystick::joystick::joystick::{move_once_by_mode, MoveMode, quick_press}; | ||||||
|     use crate::ocr::ocr::ocr::find_string_in_image; |     use crate::ocr::ocr::ocr::find_string_in_image; | ||||||
|     use crate::pokemmo::const_value::pokemmo_const_value::{BUTTON_HL_1, BUTTON_HL_2, BUTTON_HL_3, BUTTON_HL_4, GROUP_5_1, GROUP_5_2, GROUP_5_3, GROUP_5_4, GROUP_5_5, LAST_TEXT_AREA, LOGO, PokemmoStatus, SINGLE_BATTLE, TEMP_BATTLE_TEXT_AREA, TEXT_AREA}; |     use crate::pokemmo::const_value::pokemmo_const_value::{BUTTON_HL_1, BUTTON_HL_2, BUTTON_HL_3, BUTTON_HL_4, GROUP_5_1, GROUP_5_2, GROUP_5_3, GROUP_5_4, GROUP_5_5, LAST_TEXT_AREA, LOGO, PokemmoStatus, SINGLE_BATTLE, TEMP_BATTLE_TEXT_AREA, TEXT_AREA}; | ||||||
|     use crate::pokemmo::const_value::pokemmo_const_value::PokemmoStatus::{Free, InBattle, LoadBattle, MeetTarget, Running}; |     use crate::pokemmo::const_value::pokemmo_const_value::PokemmoStatus::{Free, InBattle, LoadBattle, MeetShiny, Running}; | ||||||
|     use crate::screen::screen::screen::{Area, screen_shot}; |     use crate::screen::screen::screen::{Area, screen_shot}; | ||||||
| 
 | 
 | ||||||
|     // 单遇闪光
 |     // 单遇闪光
 | ||||||
|  | @ -28,7 +28,7 @@ pub mod pokemmo { | ||||||
|         loop { |         loop { | ||||||
|             trace!("当前状态:{:?}",status); |             trace!("当前状态:{:?}",status); | ||||||
|             match status { |             match status { | ||||||
|                 PokemmoStatus::MeetTarget => { |                 PokemmoStatus::MeetShiny => { | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 PokemmoStatus::Free => { |                 PokemmoStatus::Free => { | ||||||
|  | @ -37,13 +37,13 @@ pub mod pokemmo { | ||||||
|                     move_index = move_index + 1; |                     move_index = move_index + 1; | ||||||
|                     let text = get_last_string(); |                     let text = get_last_string(); | ||||||
|                     trace!("查询战斗文字 : {}",text); |                     trace!("查询战斗文字 : {}",text); | ||||||
|                     if text.contains("wild") || text.contains("sent") { |                     if text.contains("野生") || text.contains("派出") { | ||||||
|                         info!("遇怪:{}.",text); |                         info!("遇怪:{}.",text); | ||||||
|                         meet_pokemmo = text.clone(); |                         meet_pokemmo = text.clone(); | ||||||
|                         status = LoadBattle; |                         status = LoadBattle; | ||||||
|                     }else { |                     }else { | ||||||
|                         let temp_battle = read_area(TEMP_BATTLE_TEXT_AREA); |                         let temp_battle = read_area(TEMP_BATTLE_TEXT_AREA); | ||||||
|                         if temp_battle.contains("fight") || temp_battle.contains("run"){ |                         if temp_battle.contains("战斗") || temp_battle.contains("逃跑"){ | ||||||
|                             status = LoadBattle; |                             status = LoadBattle; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  | @ -64,20 +64,20 @@ pub mod pokemmo { | ||||||
|                 PokemmoStatus::InBattle => { |                 PokemmoStatus::InBattle => { | ||||||
|                     trace!("检查遇怪种类.."); |                     trace!("检查遇怪种类.."); | ||||||
|                     let text = get_text_list(); |                     let text = get_text_list(); | ||||||
|                     let filter_text: Vec<String> = text.into_iter().filter(|x| x.contains("wild")).collect(); |                     let filter_text: Vec<String> = text.into_iter().filter(|x| x.contains("野生")).collect(); | ||||||
|                     if filter_text.is_empty() { |                     if filter_text.is_empty() { | ||||||
|                         error!("遇怪错误!"); |                         error!("遇怪错误!"); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                     let filter_size = filter_text.len(); |                     let filter_size = filter_text.len(); | ||||||
|                     let pokemon_text = filter_text[filter_size - 1].clone(); |                     let pokemon_text = filter_text[filter_size - 1].clone(); | ||||||
|                     if pokemon_text.contains("horde") { |                     if pokemon_text.contains("怪群") { | ||||||
|                         info!("遇见怪群"); |                         info!("遇见怪群"); | ||||||
|                         let five_names = read_group_5(); |                         let five_names = read_group_5(); | ||||||
|                         for name in five_names { |                         for name in five_names { | ||||||
|                             for key_word in key_words { |                             for key_word in key_words { | ||||||
|                                 if name.contains(key_word) { |                                 if name.contains(key_word) { | ||||||
|                                     status = MeetTarget; |                                     status = MeetShiny; | ||||||
|                                     return; |                                     return; | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|  | @ -88,7 +88,7 @@ pub mod pokemmo { | ||||||
|                         for key_word in key_words { |                         for key_word in key_words { | ||||||
|                             if name.contains(key_word) || meet_pokemmo.contains(key_word) { |                             if name.contains(key_word) || meet_pokemmo.contains(key_word) { | ||||||
|                                 info!("遇见{}",key_word); |                                 info!("遇见{}",key_word); | ||||||
|                                 status = MeetTarget; |                                 status = MeetShiny; | ||||||
|                                 return; |                                 return; | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|  | @ -117,7 +117,7 @@ pub mod pokemmo { | ||||||
|                     let mut last_word = get_last_string(); |                     let mut last_word = get_last_string(); | ||||||
|                     // 读取十次后默认成功
 |                     // 读取十次后默认成功
 | ||||||
|                     let mut times = 0_usize; |                     let mut times = 0_usize; | ||||||
|                     while !last_word.contains("escaped") |                     while !last_word.contains("成功") | ||||||
|                         && !last_word.contains("中逃跑") |                         && !last_word.contains("中逃跑") | ||||||
|                         && !last_word.contains("不能跑") |                         && !last_word.contains("不能跑") | ||||||
|                         && times < 10{ |                         && times < 10{ | ||||||
|  | @ -126,7 +126,7 @@ pub mod pokemmo { | ||||||
|                         thread::sleep(Duration::from_millis(200)); |                         thread::sleep(Duration::from_millis(200)); | ||||||
|                         times = times + 1; |                         times = times + 1; | ||||||
|                     } |                     } | ||||||
|                     if last_word.contains("escaped") || last_word.contains("safely") { |                     if last_word.contains("成功") || last_word.contains("逃跑") { | ||||||
|                         trace!("逃跑成功."); |                         trace!("逃跑成功."); | ||||||
|                         status = Free; |                         status = Free; | ||||||
|                     } else { |                     } else { | ||||||
|  | @ -175,7 +175,7 @@ pub mod pokemmo { | ||||||
|         let image_width = image.width(); |         let image_width = image.width(); | ||||||
|         let image_height = image.height(); |         let image_height = image.height(); | ||||||
|         let dy_image = DynamicImage::from(RgbaImage::from_vec(image_width, image_height, image_data).unwrap()); |         let dy_image = DynamicImage::from(RgbaImage::from_vec(image_width, image_height, image_data).unwrap()); | ||||||
|         let text = find_string_in_image(&dy_image, psm).to_lowercase(); |         let text = find_string_in_image(&dy_image, psm); | ||||||
|         return text; |         return text; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,14 +11,13 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn try_meet_shiny(){ |     fn try_meet_shiny(){ | ||||||
|  |         simple_logging::log_to_file("./test/log/meet_shiny.log",LevelFilter::Info).expect("set log failed"); | ||||||
| 
 | 
 | ||||||
|         let key_words = vec![ |         let key_words = vec![ | ||||||
|             "shiny".to_string(), |             "闪".to_string(), | ||||||
|             // 闪电鸟
 |             "光".to_string(), | ||||||
|             "zapdos".to_string(), |             "雷".to_string(), | ||||||
|             "zap".to_string(), |             "公".to_string(), | ||||||
|             "pdos".to_string(), |  | ||||||
| 
 |  | ||||||
|         ]; |         ]; | ||||||
|         single_meet_shiny(&key_words); |         single_meet_shiny(&key_words); | ||||||
| 
 | 
 | ||||||
|  | @ -27,7 +26,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn print_shortcut() { |     fn print_shortcut() { | ||||||
|         let text = screen_shot(Some(TEXT_AREA)); |         let text = screen_shot(Some(TEMP_BATTLE_TEXT_AREA)); | ||||||
|         print_image(text, "temp_battle_text".to_string()); |         print_image(text, "temp_battle_text".to_string()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -59,15 +58,10 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     #[test] |     #[test] | ||||||
|     fn find_text() { |     fn find_text() { | ||||||
|         let text = screen_shot(Some(TEMP_BATTLE_TEXT_AREA)); |  | ||||||
|         print_image(text, "51".to_string()); |  | ||||||
|         let text = read_area(TEMP_BATTLE_TEXT_AREA); |         let text = read_area(TEMP_BATTLE_TEXT_AREA); | ||||||
|         println!("text in image: {}",text); |         println!("text in image: {}",text); | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -100,53 +94,4 @@ mod tests { | ||||||
|         } |         } | ||||||
|         println!("dis = {}",dis); |         println!("dis = {}",dis); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     #[test] |  | ||||||
|     fn cal_win_influence(){ |  | ||||||
|         let list = vec![ |  | ||||||
|             ("巨钳螳螂",0.4848_f32,0.5072_f32), |  | ||||||
|             ("烈咬陆鲨",0.3482_f32,0.5126_f32), |  | ||||||
|             ("快龙",0.3227_f32,0.5178_f32), |  | ||||||
|             ("宝石海星",0.2184_f32,0.5239_f32), |  | ||||||
|             ("清洗洛托姆",0.2181_f32,0.5174_f32), |  | ||||||
|             ("火神蛾",0.1276_f32,0.4852_f32), |  | ||||||
| 
 |  | ||||||
|         ]; |  | ||||||
| 
 |  | ||||||
|         for (name, usage, win) in list{ |  | ||||||
|             let win_rate = win - 0.5_f32; |  | ||||||
|             let influence = ((win_rate * (usage * usage + 2_f32 * usage + (1_f32 - usage))) - usage * usage ) / (2_f32 * usage * (1_f32 - usage)); |  | ||||||
|             println!("{}, win rate {}, influence {}", name, win_rate, influence); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1,3 +0,0 @@ | ||||||
| mod sms; |  | ||||||
| mod sms_test; |  | ||||||
| 
 |  | ||||||
|  | @ -1,23 +0,0 @@ | ||||||
| 
 |  | ||||||
| #[cfg(feature = "sms")] |  | ||||||
| pub mod sms { |  | ||||||
|     use log::{info, trace}; |  | ||||||
|     use crate::base::network::network::Aliyun; |  | ||||||
| 
 |  | ||||||
|     const ALIYUN_SMS_SERVER_REGION: &str = "cn-hangzhou"; |  | ||||||
|     const ALIYUN_SMS_ACCESS_KEY_ID: &str = "LTAI5t79FAQwjWFsrHM1F3bu"; |  | ||||||
|     const ALIYUN_SMS_ACCESS_KEY_SECRET: &str = "VoAm5sdLUvGMKUuxAWFABhQyEldC4A"; |  | ||||||
|     const ALIYUN_SMS_SIGN_NAME: &str = ""; |  | ||||||
| 
 |  | ||||||
|     // 模板
 |  | ||||||
|     const TEMPLATE_TARGET: &str = "SMS_157282676"; // 目标模板
 |  | ||||||
| 
 |  | ||||||
|     pub(crate) async fn sms_target(target_name: &str, phone: &str) -> Result<(),std::io::Error> { |  | ||||||
|         trace!("sms start."); |  | ||||||
|         let aliyun = Aliyun::new(ALIYUN_SMS_ACCESS_KEY_ID, ALIYUN_SMS_ACCESS_KEY_SECRET); |  | ||||||
|         let resp = aliyun.send_sms("18227630764", "yanweitong", TEMPLATE_TARGET, "").expect("get sms res failed"); |  | ||||||
|         info!("sent resp : {:?}",&resp); |  | ||||||
|         return Ok(()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -1,29 +0,0 @@ | ||||||
| #[cfg(test)] |  | ||||||
| mod tests { |  | ||||||
|     use std::thread; |  | ||||||
|     use std::time::Duration; |  | ||||||
|     use futures::executor::block_on; |  | ||||||
|     use log::{debug, error, info, LevelFilter, trace, warn}; |  | ||||||
|     use crate::base::logger::logger::init_logger; |  | ||||||
|     use crate::sms::sms::sms::sms_target; |  | ||||||
| 
 |  | ||||||
|     #[test] |  | ||||||
|     fn test_send_msg(){ |  | ||||||
| 
 |  | ||||||
|         init_logger("abc", LevelFilter::Trace); |  | ||||||
| 
 |  | ||||||
|         let res = sms_target(&"",&"18227630764"); |  | ||||||
|         block_on(res); |  | ||||||
| 
 |  | ||||||
|         trace!("trace!"); |  | ||||||
|         debug!("debug!"); |  | ||||||
|         info!("info!"); |  | ||||||
|         warn!("warn!"); |  | ||||||
|         error!("error!"); |  | ||||||
| 
 |  | ||||||
|         thread::sleep(Duration::from_secs(10)); |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue