Compare commits
	
		
			2 Commits
		
	
	
		
			5f846b18c0
			...
			0f9f06db53
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 0f9f06db53 | |
|  | 972f378389 | 
|  | @ -1,3 +1,4 @@ | ||||||
| .idea | .idea | ||||||
| target | target | ||||||
| test | test | ||||||
|  | logs | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										14
									
								
								Cargo.toml
								
								
								
								
							
							
						
						
									
										14
									
								
								Cargo.toml
								
								
								
								
							|  | @ -10,12 +10,13 @@ edition = "2021" | ||||||
| 
 | 
 | ||||||
| default = ["pokemmo"] | default = ["pokemmo"] | ||||||
| 
 | 
 | ||||||
| pokemmo = ["screen", "ocr", "joystick", "dep:image", "pokemon", "detector"] | pokemmo = ["screen", "ocr", "joystick", "dep:image", "pokemon", "detector","sms"] | ||||||
| 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] | ||||||
|  | @ -30,4 +31,13 @@ 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" | ||||||
|  | @ -0,0 +1,26 @@ | ||||||
|  | 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"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | pub(crate) mod logger; | ||||||
|  | pub(crate) mod network; | ||||||
|  | @ -0,0 +1,125 @@ | ||||||
|  | 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,3 +4,5 @@ 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 { | ||||||
|         // 遇见闪光
 |         // 遇见闪光
 | ||||||
|         MeetShiny, |         MeetTarget, | ||||||
|         // 无状态
 |         // 无状态
 | ||||||
|         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, MeetShiny, Running}; |     use crate::pokemmo::const_value::pokemmo_const_value::PokemmoStatus::{Free, InBattle, LoadBattle, MeetTarget, 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::MeetShiny => { |                 PokemmoStatus::MeetTarget => { | ||||||
|                     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("野生") || text.contains("派出") { |                     if text.contains("wild") || text.contains("sent") { | ||||||
|                         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("战斗") || temp_battle.contains("逃跑"){ |                         if temp_battle.contains("fight") || temp_battle.contains("run"){ | ||||||
|                             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("野生")).collect(); |                     let filter_text: Vec<String> = text.into_iter().filter(|x| x.contains("wild")).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("怪群") { |                     if pokemon_text.contains("horde") { | ||||||
|                         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 = MeetShiny; |                                     status = MeetTarget; | ||||||
|                                     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 = MeetShiny; |                                 status = MeetTarget; | ||||||
|                                 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("成功") |                     while !last_word.contains("escaped") | ||||||
|                         && !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("成功") || last_word.contains("逃跑") { |                     if last_word.contains("escaped") || last_word.contains("safely") { | ||||||
|                         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); |         let text = find_string_in_image(&dy_image, psm).to_lowercase(); | ||||||
|         return text; |         return text; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,13 +11,14 @@ 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![ | ||||||
|             "闪".to_string(), |             "shiny".to_string(), | ||||||
|             "光".to_string(), |             // 闪电鸟
 | ||||||
|             "雷".to_string(), |             "zapdos".to_string(), | ||||||
|             "公".to_string(), |             "zap".to_string(), | ||||||
|  |             "pdos".to_string(), | ||||||
|  | 
 | ||||||
|         ]; |         ]; | ||||||
|         single_meet_shiny(&key_words); |         single_meet_shiny(&key_words); | ||||||
| 
 | 
 | ||||||
|  | @ -26,7 +27,7 @@ mod tests { | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn print_shortcut() { |     fn print_shortcut() { | ||||||
|         let text = screen_shot(Some(TEMP_BATTLE_TEXT_AREA)); |         let text = screen_shot(Some(TEXT_AREA)); | ||||||
|         print_image(text, "temp_battle_text".to_string()); |         print_image(text, "temp_battle_text".to_string()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -58,10 +59,15 @@ 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); | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -94,4 +100,53 @@ 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); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | mod sms; | ||||||
|  | mod sms_test; | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | 
 | ||||||
|  | #[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(()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | #[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