Wie ich herausfand, dass mein Visum noch nicht fertig ist, eine Nachricht in Slack

Fasten für die Maiferien. Vor 6 Wochen habe ich ein Visum für Irland beantragt. Die Abreise ist für den 30. April geplant. Es gibt eine Botschaftswebsite, auf der Listen mit Visumentscheidungen veröffentlicht werden . Sie tun dies montags und donnerstags. Und hier sitze ich am Sonntag, 28. April, es gibt noch keine Lösung für mein Visum. Und meine weiteren Maßnahmen am Montag hängen davon ab, ob meine Erklärung im neuen Bericht enthalten sein wird oder nicht. Wenn nicht, müssen Sie zur Botschaft gehen und das klären. Wenn ja, ziehen Sie das Visumzentrum. Das Sitzen und Aktualisieren der Seite den ganzen Tag am Montag schien ein langweiliger Zeitvertreib zu sein, also schrieb ich ein Python-Skript.



Haftungsausschluss. Ich bin kein Programmierer, aber ich kann programmieren. Dies bedeutet, dass ich keinen eleganten und effizienten Code schreiben kann, aber ich kann diese Drehorgel dazu bringen, das zu tun, was ich brauche.


1. Überprüfen Sie die Seite auf einen neuen Bericht


Was muss also getan werden:


  1. Sie müssen diese Seite analysieren.
  2. Suchen Sie unter den Berichten einen neuen nach einem neuen Datum (in meinem Fall können Sie nach dem Wort 24 April suchen).
  3. Holen Sie sich einen Link zu diesem Bericht.

Der Funktionscode lautet wie folgt:


 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 

Nun mehr darüber, was in diesem Code passiert.


Zunächst verwenden wir die requests , mit deren Hilfe wir die erforderliche Seite herunterladen können. Dann verwenden wir eine andere BeautifulSoup Bibliothek, mit deren Hilfe dieses wilde Seitenlayout schöner und bequemer gestaltet werden kann.


Vor der Verwendung von 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 

Nachher:


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

Jetzt können Sie irgendwie damit leben und arbeiten. In meinem Fall werden wir insbesondere nach einer speziellen div class suchen, die für Links zu Berichten verwendet wird. Wir sehen dies aus dem Quellcode der Seite: <div class="gen-content-landing__block"> . In meinem Code suchen wir nach all diesen Tags.


Gehen Sie als Nächstes die gesammelten Tags durch und suchen Sie nach dem Tag, der das Datum des neuen Berichts enthält: 24 April . Wenn ein solches Ergebnis gefunden wird, extrahieren wir den Link daraus und bilden den Text, dass ein neuer Bericht veröffentlicht wurde.


2. Suchen Sie in einem neuen Bericht nach einer Visa-ID


Was muss jetzt hier getan werden:


  1. Laden Sie diesen neuen Bericht herunter.
  2. Analysiert die PDF-Datei.
  3. Finde meinen Ausweis darin.
  4. Suchen Sie den entsprechenden Status.

Der Funktionscode lautet wie folgt:


 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 

Wenn wir die requests erneut verwenden, stellen wir eine Anfrage an diesen Bericht. Speichern Sie es anschließend lokal. Mit der PyPDF2 Bibliothek lesen PyPDF2 die Datei. Danach sortieren wir die Seiten und suchen im Token-Array nach visa_id . Das Markup dieser PDF-Datei ist so, dass das nächste Token nach visa_id direkt der visa_id : Approved oder Refused . Als nächstes verketten wir den vorhandenen Text mit ID und Status.


3. Senden einer Statusmeldung in Slack


Gut. Das Skript hat beispielsweise meine ID gefunden, aber Sie müssen mich irgendwo darüber informieren. Wir in unserer Firma verwenden Slack als Messenger, daher dachte ich, es wäre praktisch für mich, dort eine Benachrichtigung zu erhalten.


Über diesen Link können Sie Ihren Webhook konfigurieren. Dort können Sie den Kanal oder den Empfänger auswählen, an den die Nachricht gesendet werden soll (für diesen Schritt muss möglicherweise ein WorkSpace-Administrator erforderlich sein). Dort erhalten Sie eine eindeutige URL für den Webhook, die im Code verwendet werden kann.


 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 

Unter Verwendung derselben requests wir eine POST-Anforderung mit dem text von webhook.


4. Verwendung von Funktionen


Der Rest des Codes sieht folgendermaßen aus:


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

Wir weisen allen notwendigen Variablen Werte zu und führen dann die vorgeschriebenen Funktionen aus.


5. Nach Plan starten


Ok Ich habe ein Skript geschrieben, aber wenn ich es jedes Mal selbst abrufen muss, bin ich nicht weit vom ursprünglichen Zustand entfernt, in dem ich sitzen und die Seite aktualisieren müsste.


 $ crontab -e 

Fügte eine Zeile hinzu:


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

Ich dachte, es reicht mir, wenn dieses Skript alle 10 Minuten von cron auf einem Server mit Ubuntu ausgeführt wird.


6. Fazit


Um 11:50 Uhr erhielt ich eine Nachricht, dass ein neuer Bericht erschienen war, aber mein Visum war nicht darin ... Danach ging ich zur Botschaft. Er eroberte es im Sturm (sie beantworteten mehrere Wochen lang keine Briefe und Anrufe) und erhielt daraufhin seinen Pass mit einem Visum.


Im Allgemeinen ist die Programmierkenntnis in der modernen Welt wichtig, auch wenn Sie kein Programmierer sind. Es ermöglicht Ihnen, einige Ihrer Routinevorgänge zu automatisieren, was Ihre Welt ein wenig komfortabler macht. Tatsächlich könnte dies sogar in einem separaten Dienst arrangiert werden, bei dem eine Person einfach ihren Ausweis und ihre E-Mail-Adresse eingibt und eine Nachricht über die Bereitschaft eines Visums für E-Mails erhält.

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


All Articles