كيف اكتشفت أن تأشيرتي ليست جاهزة ، رسالة في سلاك

صيام عطلة مايو. منذ 6 أسابيع تقدمت بطلب للحصول على تأشيرة إلى أيرلندا. من المقرر المغادرة في 30 أبريل. يوجد موقع ويب للسفارة يتم فيه نشر قوائم قرارات التأشيرة. يفعلون ذلك يومي الاثنين والخميس. وهنا أجلس يوم الأحد ، 28 أبريل ، لا يوجد حتى الآن حل لتأشيرتي. تعتمد أفعالي الأخرى يوم الاثنين على ما إذا كان بياني سيكون في التقرير الجديد أم لا. إذا لم يكن الأمر كذلك ، سوف تحتاج إلى الذهاب إلى السفارة وفرزها. إذا كان هناك ، ثم سحب مركز التأشيرة. بدا أن الجلوس وتحديث الصفحة طوال اليوم يوم الاثنين كان بمثابة هواية مملة ، لذلك كتبت سيناريو بيثون.



تنويه. أنا لست مبرمجًا ، لكن يمكنني البرنامج. هذا يعني أنه لا يمكنني كتابة شفرة أنيقة وفعالة ، لكن يمكنني الحصول على جهاز البرميل هذا للقيام بما أحتاج إليه.


1. التحقق من الصفحة للحصول على تقرير جديد


إذن ما يجب القيام به:


  1. تحتاج إلى تحليل هذه الصفحة.
  2. ابحث بين التقارير عن تقرير جديد حسب تاريخ جديد (في حالتي ، يمكنك البحث حسب كلمة 24 April ).
  3. الحصول على رابط لهذا التقرير.

رمز الوظيفة كما يلي:


 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 

الآن المزيد حول ما يحدث في هذا الرمز.


أولاً ، نستخدم مكتبة requests ، مما يساعدنا على تنزيل الصفحة المطلوبة. بعد ذلك ، نستخدم مكتبة BeautifulSoup الأخرى ، مما يساعد على تحويل تخطيط الصفحة البرية هذا إلى مظهر أكثر جمالا وملاءمة.


قبل استخدام 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 

بعد:


 <!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 --> 

الآن يمكنك بطريقة ما العيش والعمل مع هذا. على وجه الخصوص ، في حالتي ، div class خاصة يتم استخدامها لروابط التقارير. نرى هذا من الكود المصدر للصفحة: <div class="gen-content-landing__block"> . في الكود الخاص بي ، نبحث عن كل هذه العلامات.


بعد ذلك ، انتقل إلى العلامات التي تم جمعها وابحث عن العلامة التي تحتوي على تاريخ التقرير الجديد: 24 April . إذا تم العثور على هذه النتيجة ، فسنستخرج الرابط منها ونشكل النص الذي تم نشر تقرير جديد فيه.


2. ابحث عن معرف التأشيرة في تقرير جديد


إذن ما الذي يجب عمله الآن هنا:


  1. قم بتنزيل هذا التقرير الجديد.
  2. بتوزيع ملف pdf.
  3. البحث عن هويتي في ذلك.
  4. ابحث عن الحالة المقابلة لها.

رمز الوظيفة كما يلي:


 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 

باستخدام مكتبة requests مرة أخرى ، نقوم بتقديم طلب لهذا التقرير. بعد ذلك ، احفظه محليًا. باستخدام مكتبة PyPDF2 ، نقرأ الملف. بعد ذلك ، نقوم بالفرز بين صفحاته والبحث عن visa_id في صفيف الرمز المميز. ترميز ملف pdf هذا هو أن الرمز التالي بعد visa_id هو حالة visa_id مباشرة: Approved أو Refused . بعد ذلك ، نسلسل النص الحالي بالمعرّف والحالة.


3. إرسال رسالة الحالة في سلاك


حسنا. العثور على البرنامج النصي ، على سبيل المثال ، هويتي ، ولكن يجب عليك إعلامي في مكان ما بشأنه. نحن في شركتنا نستخدم Slack كرسول ، لذلك اعتقدت أنه سيكون من المناسب بالنسبة لي الحصول على إشعار هناك.


يتيح لك هذا الرابط تكوين webhook الخاص بك. هناك يمكنك اختيار القناة أو المستلم الذي ستنشر الرسالة إليه (ربما تتطلب هذه الخطوة منك أن تكون مسؤول WorkSpace). ستتلقى هناك رابطًا فريدًا لعنوان الويب ، والذي يمكن استخدامه في الكود.


 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 

باستخدام مكتبة requests نفسها ، نقوم بتقديم طلب POST مع محتويات text على webhook.


4. استخدام وظائف


تبدو بقية الكود كما يلي:


 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)) 

نقوم بتخصيص القيم لجميع المتغيرات اللازمة ثم نقوم بتشغيل الوظائف الموصوفة.


5. إطلاق وفقا للخطة


تقريبا. لقد كتبت نصًا ، لكن إذا اضطررت إلى سحبه بنفسي في كل مرة ، فلن أكون بعيدًا عن الحالة الأولية ، حيث يتعين علي الجلوس وتحديث الصفحة.


 $ crontab -e 

إضافة سطر إليها:


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

اعتقدت أنه يكفي بالنسبة لي إذا تم تشغيل هذا البرنامج النصي كل 10 دقائق بواسطة cron على خادم مع أوبونتو.


6. الخاتمة


في الساعة 11:50 ، تلقيت رسالة تفيد بأن تقريراً جديداً قد ظهر ، لكن تأشيرتي لم تكن فيه ... وبعد ذلك ذهبت إلى السفارة. أخذها عن طريق العاصفة (لم يردوا على الرسائل والمكالمات لعدة أسابيع) وتلقى في النهاية جواز سفره بتأشيرة.


بشكل عام ، تعتبر مهارة البرمجة مهمة في العالم الحديث ، حتى لو لم تكن مبرمجًا. يسمح لك بأتمتة بعض العمليات الروتينية ، مما يجعل عالمك أكثر راحة. في الواقع ، يمكن ترتيبها في خدمة منفصلة ، حيث يقوم الشخص ببساطة بإدخال هويته وبريده الإلكتروني ، ويتلقى رسالة عن مدى استعداد التأشيرة للبريد الإلكتروني.

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


All Articles