Bagaimana saya mengetahui bahwa visa saya belum siap, sebuah pesan di Slack

Puasa untuk liburan Mei. 6 minggu yang lalu saya mengajukan permohonan visa ke Irlandia. Keberangkatan dijadwalkan untuk 30 April. Ada situs web kedutaan tempat daftar keputusan visa diterbitkan . Mereka melakukan ini pada hari Senin dan Kamis. Dan di sini saya duduk pada hari Minggu, 28 April, masih belum ada solusi untuk visa saya. Dan tindakan saya selanjutnya pada hari Senin tergantung pada apakah pernyataan saya akan ada di laporan baru atau tidak. Jika tidak, Anda harus pergi ke kedutaan dan menyelesaikannya. Jika ada, maka tarik pusat visa. Duduk dan memperbarui halaman sepanjang hari pada hari Senin tampak seperti hobi yang membosankan, jadi saya menulis skrip Python.



Penafian. Saya bukan seorang programmer, tetapi saya dapat memprogram. Ini berarti bahwa saya tidak dapat menulis kode yang elegan dan efisien, tetapi saya dapat meminta organ barel ini untuk melakukan apa yang saya butuhkan darinya.


1. Memeriksa halaman untuk laporan baru


Jadi apa yang perlu dilakukan:


  1. Anda perlu menguraikan halaman ini.
  2. Temukan di antara laporan yang baru dengan tanggal yang baru (dalam kasus saya, Anda dapat mencari berdasarkan kata 24 April ).
  3. Dapatkan tautan ke laporan ini.

Kode fungsi adalah sebagai berikut:


 def check_report(url, div_class, date): embassy_page = requests.get(url) page_text = BeautifulSoup(embassy.text, 'lxml') tags = page_text.findAll('div', {"class": div_class}) text = '' report_url = '' for tag in tags: tag_soup = BeautifulSoup(tag.text, 'lxml') report = s(text=re.compile(date)) if len(report) > 0: text = 'New report published' report_url = 'https://www.dfa.ie' + tag.find('a').attrs['href'] return text, report_url 

Sekarang, lebih lanjut tentang apa yang terjadi dalam kode ini.


Pertama, kami menggunakan perpustakaan requests , yang membantu kami mengunduh halaman yang diperlukan. Kemudian, kami menggunakan pustaka BeautifulSoup lain, yang membantu mengubah tata letak halaman liar ini menjadi tampilan yang lebih indah dan nyaman.


Sebelum menggunakan BeautifulSoup :


 '<!DOCTYPE html>\r\n\r\n<html lang="en">\r\n <head>\r\n <META http-equiv="X-UA-Compatible" content="IE=edge">\r\n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\t\r\n\t<meta name="viewport" content="initial-scale=1">\r\n \r\n \r\n \r\n \r\n \r\n <!-- Static Meta data -->\r\n \r\n\t<!-- <meta name="DC.Creator" content="Department of Foreign Affairs" />\r\n\t<meta name="DC.Publisher" content="Department of Foreign Affairs" /> \r\n\t<meta name="DC.Format" content="text/xhtml" /> \r\n\t<meta name="DC.Copyright" content="All material (c) copyright 2012 Department of Foreign Affairs" /> \r\n\t<meta name="DC.Source" content="Department of Foreign Affairs" /> \r\n\t<meta name="DC.Language" content="en" />\r\n\t<meta name="DC.Author" content="Department of Foreign Affairs" /> -->\r\n\r\n\r\n<meta name="author" content="Department of Foreign Affairs">\r\n<meta name="google-site-verification" content="HHtulupgM8GXpd9YYDjoXUb6MiU7_mGTkHixUrVPFYQ" />\r\n \r\n\t<title>Weekly Decision Report - Department of Foreign Affairs and Trade</title>\r\n <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> \r\n <link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/font-defs.css" />\t<!-- 2017 font-defs.css --> \r\n\t<link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/style.css" />\t<!-- 2017 style.css -->\r\n <link rel="stylesheet" type="text/css" media="print" href="/media/dfa-2017/style-assets/css/print.css" />\t<!-- 2017 print.css -->\r\n 

Setelah:


 <!DOCTYPE html> <html lang="en"> <head> <meta content="IE=edge" http-equiv="X-UA-Compatible"/> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="initial-scale=1" name="viewport"/> <!-- Static Meta data --> <!-- <meta name="DC.Creator" content="Department of Foreign Affairs" /> <meta name="DC.Publisher" content="Department of Foreign Affairs" /> <meta name="DC.Format" content="text/xhtml" /> <meta name="DC.Copyright" content="All material (c) copyright 2012 Department of Foreign Affairs" /> <meta name="DC.Source" content="Department of Foreign Affairs" /> <meta name="DC.Language" content="en" /> <meta name="DC.Author" content="Department of Foreign Affairs" /> --> <meta content="Department of Foreign Affairs" name="author"/> <meta content="HHtulupgM8GXpd9YYDjoXUb6MiU7_mGTkHixUrVPFYQ" name="google-site-verification"/> <title>Weekly Decision Report - Department of Foreign Affairs and Trade</title> <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/> <link href="/media/dfa-2017/style-assets/css/font-defs.css" media="screen" rel="stylesheet" type="text/css"/> <!-- 2017 font-defs.css --> <link href="/media/dfa-2017/style-assets/css/style.css" media="screen" rel="stylesheet" type="text/css"/> <!-- 2017 style.css --> 

Sekarang Anda bisa hidup dan bekerja dengan ini. Khususnya, dalam kasus saya, kami akan mencari div class khusus yang digunakan untuk tautan ke laporan. Kami melihat ini dari kode sumber halaman: <div class="gen-content-landing__block"> . Dalam kode saya, kami mencari semua tag tersebut.


Selanjutnya, buka tag yang terkumpul dan cari tag yang berisi tanggal laporan baru: 24 April . Jika hasil seperti itu ditemukan, maka kami mengekstrak tautan darinya dan membentuk teks bahwa laporan baru telah diterbitkan.


2. Cari id visa dalam laporan baru


Jadi apa yang perlu dilakukan sekarang di sini:


  1. Unduh laporan baru ini.
  2. Parsing file pdf.
  3. Temukan id saya di dalamnya.
  4. Temukan status yang sesuai dengannya.

Kode fungsi adalah sebagai berikut:


 def check_visa(report_url, filename, visa_id, text): pdf = requests.get(report_url) file_path = Path(filename) file_path.write_bytes(pdf.content) pdfFileObj = open(filename, 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj, strict=False) for pageNum in range(0, pdfReader.numPages): page = str(pdfReader.getPage(pageNum).extractText().encode('utf-8')).split('\\n') if visa_id in page: visa_index = page.index(visa_id) status = page[visa_index + 1] text = text + '\t' + visa_id + '\t' + status return text 

Menggunakan pustaka requests lagi, kami membuat permintaan untuk laporan ini. Selanjutnya, simpan secara lokal. Menggunakan pustaka PyPDF2 , PyPDF2 membaca file. Setelah itu, kami menyortir halaman-halamannya dan mencari visa_id di token array. Markup file pdf ini sedemikian rupa sehingga token setelah visa_id berikutnya adalah status visa_id secara langsung: Approved atau Refused . Selanjutnya, kami menggabungkan teks yang ada dengan id dan status.


3. Mengirim pesan status di Slack


Bagus Script menemukan, katakanlah, id saya, tetapi Anda perlu memberi tahu saya di suatu tempat tentang hal itu. Kami di perusahaan kami menggunakan Slack sebagai messenger, jadi saya pikir akan lebih mudah bagi saya untuk mendapatkan notifikasi di sana.


Tautan ini memungkinkan Anda untuk mengonfigurasi webhook Anda. Di sana Anda dapat memilih saluran atau penerima yang akan dikirimi pesan (mungkin perlu menjadi admin WorkSpace untuk langkah ini). Di sana Anda akan menerima url unik untuk webhook, yang dapat digunakan dalam kode.


 def send_to_slack(webhook_url, text): post = {"text": "{0}".format(text)} json_data = json.dumps(post) req = requests.post(webhook_url, data=json_data.encode('ascii'), headers={'Content-Type': 'application/json'}) return req.status_code 

Menggunakan perpustakaan requests sama, kami membuat permintaan POST dengan konten text di webhook.


4. Penggunaan fungsi


Sisa kode terlihat seperti ini:


 url = 'https://www.dfa.ie/irish-embassy/russia/visas/weekly-decision-report/' div_class = 'gen-content-landing__block' date = '24 April' filename = 'weekly_report.pdf' visa_id = '38644112' webhook_url = 'https://hooks.slack.com/services/...' text, report_url = check_report(url, div_class, date) if text != '': text = check_visa(report_url, filename, visa_id, text) print(send_to_slack(webhook_url, text)) 

Kami menetapkan nilai untuk semua variabel yang diperlukan dan kemudian menjalankan fungsi yang ditentukan.


5. Luncurkan sesuai rencana


Ok Saya menulis sebuah skrip, tetapi jika saya harus menariknya sendiri setiap kali, maka saya tidak jauh dari keadaan awal, di mana saya harus duduk dan memperbarui halaman.


 $ crontab -e 

Menambahkan baris ke sana:


 */10 * * * * python3 /home/ubuntu/embassy.py >/dev/null 2>&1 

Saya pikir itu sudah cukup bagi saya jika skrip ini dijalankan setiap 10 menit dengan cron di server dengan ubuntu.


6. Kesimpulan


Pada 11:50, saya menerima pesan bahwa sebuah laporan baru telah muncul, tetapi visa saya tidak ada di dalamnya ... Setelah itu saya pergi ke kedutaan. Dia mengambilnya dengan badai (mereka tidak menjawab surat dan panggilan selama beberapa minggu) dan sebagai hasilnya menerima paspornya dengan visa.


Secara umum, keterampilan pemrograman penting di dunia modern, bahkan jika Anda bukan seorang programmer. Ini memungkinkan Anda untuk mengotomatiskan beberapa operasi rutin Anda, yang membuat dunia Anda sedikit lebih nyaman. Bahkan, itu bisa diatur dalam layanan terpisah, di mana seseorang hanya memasukkan id dan email-nya, dan dia menerima pesan tentang kesiapan visa untuk mengirim email.

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


All Articles