Bir safar «tel:» kabi havolalarni bosganimda, Windows menga Skype orqali qo’ng’iroq qilishni taklif qilishini payqadim. Lekin men Skype dan foydalanmayman! Biroq, men jismoniy IP telefondan foydalanaman. Ba’zida bo’lgani kabi, siz biron bir veb-saytdan raqamni dangasalik bilan terasiz va hatto uni noto’g’ri yozishga ham ulgurasiz… Havolani bir marta bosish bilan qo’ng’iroq qilish qanchalik ajoyib bo’lardi? Va ma’lum bo’lishicha, bu butunlay mumkin, chunki Fanvil kabi qurilmalar HTTP so’rovini emulyatsiya qilishni qo’llab-quvvatlaydi. Faqat ma’lum havolalarga qo’ng’iroqlarni aniqlaydigan va terilgan raqamni qurilmaga uzatadigan kichik dastur yozish qoladi.
Dasturlash tilini tanlash
Dasturni nimaga qo’llashim kerak? Menga darhol Pythondan foydalanishni maslahat berishdi. Lekin la’nati, nega bunday arzimas narsa uchun Windowsga interpretator o’rnatishim kerak? Men asosan dasturni hech qanday maxsus bog’liqliklarni talab qilmaydigan .exe fayli sifatida yozmoqchi edim. Keyin esa C++ ning yosh va istiqbolli raqobatchisi Rust bilan uzoq vaqtdan beri tanishishni xohlaganimni esladim.
Bu voqea shunchaki ajoyib edi, chunki kerakli dastur juda oddiy va chuqur immersiyani talab qilmaydi, bu oddiy «salom dunyosi» o’rniga birinchi jang tajribasi uchun juda mos keladi =)
Atrof-muhitni tayyorlash
Va bu yerda, menimcha, boshqa ko’rsatmalarni takrorlamayman, shunchaki menga mos kelganiga havola beraman. Aslida, u tilni o’rganish bo’yicha kursni ham o’z ichiga oladi.
Aslida, kod.
Tizim boshqaruvchisi notanish tilda dastur yozishi shart bo’lganda nima qiladi? To’g’ri! Nusxalash hamma narsa. :) Lekin bu holda, ChatGPT juda katta yordam berdi va taxminan 20-urinishda men undan amalda ishlaydigan kodni ko’chirib olishga muvaffaq bo’ldim. Albatta, bu faqat qismlarga bo’lindi, lekin men o’zimning ko’p qismini qo’shmadim. Men faqat kompilyator aniq shikoyat qilayotgan ba’zi qismlarni tuzatdim.
Natija quyidagicha bo’ldi:
<pre class="wp-block-syntaxhighlighter-code">#![windows_subsystem = "windows"] // Объявляем, что мы на винде. В ином случае получится консольное приложение.
use std::env;
use reqwest;
use regex::Regex;
extern crate toml;
use std::fs;
use toml::Value;
use native_dialog::MessageType;
use native_dialog::MessageDialog;
use std::error::Error;
fn show_error(error_message: &str) { // Функция для отображения ошибок
let result = MessageDialog::new()
.set_type(MessageType::Error)
.set_title("Ошибка")
.set_text(error_message)
.show_alert();
if let Err(err) = result {
eprintln!("Ошибка при отображении диалогового окна: {:?}", err);
}
}
#[tokio::main] // тут что-то про асинхронность. :)
async fn main() -> Result<(), Box<dyn Error>> {
if let Ok(current_exe) = env::current_exe() { // тут мы проверяем, где находится исполнимый файл
if let Some(parent_dir) = current_exe.parent() { // для того, чтобы....
let path = format!("{}\\config.toml", parent_dir.to_string_lossy()); // Подхватить лежащий рядом конфиг.
let config_contents = fs::read_to_string(path)?; // Читаем файл
let config: Value = toml::from_str(&config_contents)?; // Парсим
let url2 = config["url"].to_string(); // Используем то, что там написано.
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
let re = Regex::new(r"\D+").unwrap();
let phone_number = re.replace_all(&args[1], "");
let url = format!("{}{}",url2.trim_matches('\"'), phone_number);
let response = reqwest::get(&url).await?; // Отправляем номер методом GET
let response_text = response.text().await?;
} else {
show_error("Нет номера телефона для обработки!"); // Внезапно, прогу запустили без параметров.
}
}
}
Ok(()) // Всем спасибо, все свободны.
}</pre> Keyingi: Cargo.toml. Bu yerda dasturimiz, shuningdek, versiyalarga bog’liqlik haqida ba’zi ma’lumotlar mavjud.
[package]
name = "caller"
version = "0.1.0"
edition = "2021"
metadata = "icon.ico"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
reqwest = "0.11"
tokio = { version = "1", features = ["full"] }
log = "0.4"
regex = "1.4"
toml = "0.8.0"
native-dialog = "0.6.4"
[build-dependencies]
winres = "0.1"
[build]
target = "x86_64-pc-windows-gnu" Nazariy jihatdan, hamma narsa yaxshi qurilishi kerak, lekin agar biror narsa noto’g’ri bo’lsa, manba kod arxivini bu yerdan yuklab olishingiz mumkin . Agar uni o’zingiz yaratishga dangasa bo’lsangiz, tayyor dasturiy ta’minot arxivi bu yerda .
Biz dasturni tel: va sip: kabi havolalarga bog’laymiz:
G’alati bo’lsa ham, men rejamning eng chalkash qismiga duch keldim. Men shunchaki Windowsga maxsus dasturim bilan havolalarni ochishni qanday aytishni bilmasdim. Lekin kompyuterimda buni allaqachon bajaradigan dastur mavjud bo’lganligi sababli (menimcha, bu mikrosip edi), men registrni o’rganib chiqib, buni amalga oshirishi mumkin bo’lgan yozuvlarni qidirishga qaror qildim. Natija quyidagicha bo’ldi:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\caller]
@="C:\\Program Files\\Fanvil\\"
[HKEY_CURRENT_USER\Software\caller\Capabilities]
"ApplicationDescription"="Phone Adaptor"
"ApplicationName"="caller"
[HKEY_CURRENT_USER\Software\caller\Capabilities\UrlAssociations]
"tel"="caller"
"callto"="caller"
"sip"="caller"
[HKEY_CURRENT_USER\Software\RegisteredApplications]
"caller"="SOFTWARE\\caller\\Capabilities"
[HKEY_CURRENT_USER\Software\Classes\caller]
@="Internet Call Protocol"
[HKEY_CURRENT_USER\Software\Classes\caller\DefaultIcon]
@="C:\\Program Files\\Fanvil\\caller.exe,0"
[HKEY_CURRENT_USER\Software\Classes\caller\shell]
[HKEY_CURRENT_USER\Software\Classes\caller\shell\open]
[HKEY_CURRENT_USER\Software\Classes\caller\shell\open\command]
@="\"C:\\Program Files\\Fanvil\\caller.exe\" \"%1\"" Yuqorida sanab o’tilgan yo’llarga asoslanib, men dasturning o’zini qayerga joylashtirganimni tushunishingiz mumkin.
Dastur yonida raqamni o’tkazish uchun URL manzilini o’z ichiga olgan config.toml fayli bo’lishi kerak. Mening holatimda, uning tarkibi quyidagicha ko’rinadi:
# config.toml
url = "http://admin:пароль@192.168.0.10/cgi-bin/ConfigManApp.com?key=" Bu yerda 192.168.0.10 telefonning IP-manzili bo’lib, parol va login allaqachon tozalangan… Telefonda URL orqali terish funksiyasi yoqilgan bo’lishi kerak.
