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:
- Anda perlu menguraikan halaman ini.
- Temukan di antara laporan yang baru dengan tanggal yang baru (dalam kasus saya, Anda dapat mencari berdasarkan kata
24 April
). - 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 \r\n \r\n\t\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 \r\n\t<link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/style.css" />\t\r\n <link rel="stylesheet" type="text/css" media="print" href="/media/dfa-2017/style-assets/css/print.css" />\t\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"/> <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"/> <link href="/media/dfa-2017/style-assets/css/style.css" media="screen" rel="stylesheet" type="text/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:
- Unduh laporan baru ini.
- Parsing file pdf.
- Temukan id saya di dalamnya.
- 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.