Bot telegram yang memonitor domain

Halo untuk penghuni Habr.

Dalam proses belajar PHP, saya datang dengan ide untuk berlatih menulis beberapa bot dalam PHP, tanpa menggunakan kerangka kerja.

Pilihan jatuh pada bot, yang akan menerima informasi tentang masa pakai domain (whois), kemudian mendapatkan tanggal pendaftaran dari sana dan menambahkan domain ini ke basis data (mysql), dengan selanjutnya mengikat pengguna dan pemberitahuan di telegram.

Kode sumber di repositori saya di gita.

Saya ingin menggunakan struktur MVC , yang menurut saya tidak sepenuhnya benar, karena pandangan tidak terlibat dan ini tidak bisa lagi disebut mvc, tapi oh well ...

Struktur aplikasi




Controllers - Tautan yang menghubungkan model dan logika aplikasi.
Model - File "logika bisnis" dari aplikasi (saya mencoba "menjejalkan" seluruh sql di sini).
Core - Aplikasi "core" file.
Perpustakaan - Perpustakaan menggunakan perpustakaan untuk mem-parsing informasi nama domain.

Routing


File perutean (routes.php) terletak di direktori inti .
2 alamat ditambahkan dalam aplikasi:

/ bot - Telegramm pergi ke alamat ini (Anda perlu mengatur webhook ke alamat uri / bot ini).
/ check - Di alamat ini, wget istirahat dengan cron 1 per hari (pukul 12), lebih lanjut tentang itu nanti.

Botcontroller


Setelah transisi ke pengontrol ini, kami mendapatkan nilai dari isi permintaan POST , dan mendekode sebagai array.

json_decode(file_get_contents('php://input'), JSON_OBJECT_AS_ARRAY); 

php: // input - dapatkan isi permintaan POST

Checkercontroller


Setelah transisi ke pengontrol ini, skrip dipicu yang memeriksa semua domain dan sertifikat ssl yang ditambahkan untuk kedaluwarsa, dengan interval:

  • tanggal saat ini
  • 2 hari
  • 7 hari
  • 30 hari

Dan mengirimkan pemberitahuan jika tanggal kedaluwarsa domain dan sertifikat ssl berakhir.

Menambahkan Pengguna


Ketika pengguna menulis pesan ke bot telegram webhook, mengirimkannya ke situs web kami, maka kami menerima pesan dalam format json, yang perlu kami dekode dan konversikan ke array untuk pekerjaan lebih lanjut.



Kami akan bekerja dengan susunan pesan.

Dapatkan dari pesan array ['chat'] : id , first_name
dimana:

id - id obrolan
first_name - Nama pengguna

Dan dari susunan pesan ['teks'] , kita mendapatkan perintah yang dikirim oleh pengguna.

Kami menemukan pengguna di tabel pengguna, jika dia tidak ada, buat

 //   $sql= "SELECT user_id FROM users WHERE chat_id=?"; $stmt = $db->prepare($sql); $stmt->execute([$chat_id]); $rows = $stmt->fetch(PDO::FETCH_ASSOC); return (int)$rows['user_id']; 

 //   $sql = 'INSERT INTO users (user_name, chat_id) VALUES (:user_name, :chat_id)'; $insert = $db->prepare($sql); $insert->execute([':user_name' => $name, ':chat_id' => $chat_id]); return true; 

Menambahkan Domain dan SSL


Saat mengirim perintah / addDomain url ke bot, kami mendapatkan url domain dari perintah dan mendapatkan data pendaftaran domain menggunakan pustaka ini .

Dapatkan domainnya


Kami mendapatkan jawaban dalam bentuk teks:



Dengan menggunakan ekspresi reguler , kami mendapatkan tanggal pendaftaran domain darinya.

 preg_match('/Registry\sExpiry\sDate:\s(.*)\\r/', $date, $matches); if (!$matches[1]){ preg_match('/paid-till:\s*(.*)\\n/', $date, $matches); } $matches[1] = $this->formatDate($matches[1]); return $matches[1]; 

Dapatkan SSL


Saya memutuskan untuk mendapatkan sertifikat SSL menggunakan openssl untuk linux.

 $getDomainSSL = shell_exec("echo | openssl s_client -servername $url -connect $url:443 2>/dev/null | openssl x509 -noout -dates"); preg_match('~notAfter=(\w+)\s(\d+)\s.+\s(\d+)~', $getDomainSSL, $matches); $date = $matches[2].$matches[1].$matches[3]; $date = date("Ymd", strtotime($date)); $date = str_replace('.','-',$date); return $date; 

Jadi kita mendapatkan:

 echo | openssl s_client -servername google.com -connect google.com:443 2>/dev/null | openssl x509 -noout -dates notBefore=Jan 7 15:47:12 2020 GMT notAfter=Mar 31 15:47:12 2020 GMT 

Parsing hasilnya menggunakan ekspresi reguler

 preg_match('~notAfter=(\w+)\s(\d+)\s.+\s(\d+)~', $getDomainSSL, $matches); 



Tetap hanya menambahkan data ke tabel.

 $sql = 'INSERT INTO domains (domain_name, date_start, date_end, date_end_ssl) VALUES (:domain_name, :date_start, :date_end, :date_end_ssl)'; $insert = $db->prepare($sql); $insert->execute([':domain_name' => $url, ':date_end' => $exp, ':date_end_ssl' => $ssl_date]); 

Kami mengikat domain dan ssl ke pengguna


Data yang diperoleh hanya perlu direkam dalam tabel perantara agar tidak "menggandakan" domain.

 $sql = 'INSERT INTO domain_users (user_id, domain_id) VALUES (:user_id, :domain_id)'; $insert = $db->prepare($sql); $insert->execute([':user_id' => $user_id, ':domain_id' => $domain_id]); 

Memeriksa Tanggal Berakhir Domain


Ketika wget pergi ke alamat / periksa, semua domain dan sertifikat ssl dengan tanggal kedaluwarsa dipilih, dan jika ada, itu mengirim pesan obrolan yang mengikat domain ini.

 $db = $this->db; $sql= " SELECT user_name, chat_id, domain_name, date_end FROM domain_users JOIN users USING (user_id) JOIN domains USING (domain_id) WHERE ( domains.date_end = CURDATE() OR domains.date_end = CURDATE() + INTERVAL 2 DAY OR domains.date_end = CURDATE() + INTERVAL 7 DAY OR domains.date_end = CURDATE() + INTERVAL 30 DAY ) "; $stmt = $db->prepare($sql); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

CRON


Mahkota dalam proyek ini diperlukan untuk mengatur transisi ke alamat '/ centang', setiap hari pukul 12:00.

 crontab -e 0 12 * * * wget url/check 

Proxy Tor


Beberapa kata tentang mengirim pesan ke telegram.

Sayangnya, di wilayah negara saya (Rusia), mereka memblokir telegram, termasuk apinya.
Saya harus menggunakan proxy, pilihan saya jatuh pada proxy (sejak proyek terakhir).

Itu hanya perlu diinstal.

 sudo apt-get install tor 

Kemudian proxy akan tersedia di port 9050.

 curl_setopt($myCurl, CURLOPT_PROXYTYPE, 7); curl_setopt($myCurl, CURLOPT_PROXY, "127.0.0.1:9050"); 

Terima kasih semua telah membaca artikel ini!

Ini adalah artikel pertama saya, jadi jangan menilai dengan ketat :)

Mengomentari posting ini, saya dengan senang hati akan menerima kritik.

Kode sumber proyek di repositori github saya :)

Source: https://habr.com/ru/post/id485392/


All Articles