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:
- Sie müssen diese Seite analysieren.
- Suchen Sie unter den Berichten einen neuen nach einem neuen Datum (in meinem Fall können Sie nach dem Wort
24 April
suchen). - 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 \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
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"/> <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"/>
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:
- Laden Sie diesen neuen Bericht herunter.
- Analysiert die PDF-Datei.
- Finde meinen Ausweis darin.
- 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.