P-042025auch persönlich

Wohnungssuche-Bot.

Liest die private Zimmerbörse des Studierendenwerks aus, filtert die neuen Angebote und merkt sie sich in SQLite, damit keines doppelt bearbeitet wird — schickt dann eine passende E-Mail an jedes Angebot mit Adresse und mir eine Nachricht per Telegram.

Eine Vorlage, jedes Mal ein anderer Brief

Jedes Inserat bekommt innerhalb von Minuten eine E-Mail. Kein Serienbrief: die Seite wird nach einem Namen durchsucht, und die Adresse steht fett darin, denn ein Vermieter erkennt in einer Zeile, ob ein Mensch seine Anzeige gelesen hat. Ändere die Felder und sieh der Anrede zu.

Kein Name auf der Seite — Ersatz greift

Sehr geehrte/r {{name}},

ich habe Ihre Anzeige für das Zimmer in {{address}} gelesen und würde mich sehr gerne darauf bewerben.

Ich studiere Mechatronik und Informationstechnik am KIT, bin Nichtraucher und ruhig, und könnte kurzfristig einziehen. Gerne besichtige ich das Zimmer zu einem Zeitpunkt, der Ihnen passt.

Vielen Dank für Ihre Zeit.

Mit freundlichen Grüßen,
Danylo Khobta

Was rausgeht

Sehr geehrte/r Damen und Herren, ich habe Ihre Anzeige für das Zimmer in Sophienstraße 42, 76135 Karlsruhe gelesen und würde mich sehr gerne darauf bewerben. Ich studiere Mechatronik und Informationstechnik am KIT, bin Nichtraucher und ruhig, und könnte kurzfristig einziehen. Gerne besichtige ich das Zimmer zu einem Zeitpunkt, der Ihnen passt. Vielen Dank für Ihre Zeit. Mit freundlichen Grüßen, Danylo Khobta

Das Einsetzen selbst ist unspektakulär — Platzhalter in doppelten geschweiften Klammern, gefüllt und per SMTP von meiner eigenen Adresse verschickt. Entscheidend ist, welches Feld fehlen darf. Die Adresse steht immer auf der Seite, also immer im Brief. Der Name oft nicht, und einen zu raten wäre schlimmer als die höfliche Ersatzanrede.

Die Seite, die sich wehrt

Die Inserate liegen hinter einem Login in der privaten Zimmerbörse des Studierendenwerks, und die Seite kommt serverseitig gerendert als schlichtes Markup an — kaum Klassen, kaum Struktur, nichts zum Auswählen. Es gibt nichts abzufragen, also werden die Daten per Muster herausgezogen.

In diesem Projekt habe ich reguläre Ausdrücke tatsächlich gelernt, aus Notwendigkeit statt aus Interesse, und es hat sich als eines der übertragbarsten Dinge erwiesen, die ich mitgenommen habe — mir fallen ständig Stellen auf, wo sie hingehören.

Fünf Minuten, auf dem Weg zu zehn

Neue Inserate werden alle fünf Minuten geprüft. Ich habe vor, auf zehn zu verlangsamen, und der Grund ist nicht die Last: eine E-Mail, die in derselben Sekunde eintrifft, in der die Anzeige online geht, liest sich wie eine Maschine, und ein Vermieter, der sich abgefertigt fühlt, antwortet nicht. Erster zu sein ist weniger wert als glaubwürdig zu sein.

Zum Verlangsamen ist Platz, weil die Konkurrenz keine anderen Bots sind. Die Börse hat keine Filter, markiert neue Inserate nicht und sortiert kaum — von Hand mitzuhalten heißt also, Hunderte Einträge erneut zu lesen, um die paar geänderten zu finden. Die meisten Studierenden geben sie auf. Genau darin liegt der Vorteil, und fünf Minuten sind längst mehr davon als nötig.

Warum die Ergebnisse in Telegram landen

Jedes neue Inserat wird in SQLite gespeichert, damit keines doppelt bearbeitet wird — und eine Datenbank in einem Container auf einem Server nützt genau dann nichts, wenn man sie braucht. Wenn ein Vermieter wegen einer Wohnung zurückruft, darf die Antwort keinen Laptop und keine SSH-Sitzung voraussetzen.

Also geht jedes Inserat zusätzlich als Telegram-Nachricht an mich: die wichtigen Angaben und ein Link. Damit ist die Suche schon in meiner Tasche. Ein Vermieter nennt eine Straße, ich suche sie im Chat, und ich weiß, über welche Anzeige wir reden, bevor der Satz zu Ende ist. Fehlermeldungen kommen über denselben Kanal.

Daraus wurde der andere Bot

Sowohl die Telegram-Schicht als auch der Scraper entstanden zuerst hier und wurden dann unverändert im Anny Platzbuchung weiterverwendet. In diesem Projekt habe ich gemerkt, dass erst die zweite Verwendung etwas dazu macht, das man ordentlich bauen sollte.

Es hat funktioniert. Ein Monat vom Start bis zum unterschriebenen Vertrag, in der Saison, in der jede und jeder andere in der Stadt dieselben Zimmer sucht.

Das Repository ist privat. Auf Anfrage gehe ich den Code gerne durch.

Stack

PythonSQLitePlaywrightTelegram Bot APISMTPDocker
Alle Projekte