Hinweis: Diese Anleitung geht davon aus, dass Sie einen autorisierten Bot auf einem Discourse-Forum betreiben, möglicherweise unter Verwendung der User API oder eines Admin API Key. Wenn Ihr Bot von den Administratoren blockiert wird, besprechen Sie den Zweck Ihres Bots mit ihnen und versuchen Sie nicht, diese Blockierung zu umgehen.
Würde Ihr Bot besser funktionieren, wenn er auf dem Server ausgeführt wird? Erwägen Sie die Erstellung eines Plugins: Developing Discourse Plugins - Part 1 - Create a basic plugin
Einführung
Diese Anleitung stellt einen Algorithmus für einen Bot-Benutzer vor, um jeden Beitrag zu überprüfen und zu verarbeiten, der auf einem Discourse-Forum veröffentlicht wurde, auf das der Bot-Benutzer Zugriff hat (mit Ausnahme von privaten Nachrichten).
Sie benötigen einen dauerhaften Speicher für eine einzelne Ganzzahl, die höchste erfolgreich verarbeitete Beitrags-ID. Sie könnten diese beispielsweise in Redis oder in einer Textdatei speichern. Die Verwendung von Redis ermöglicht es Ihnen, Message-Bus-Abonnements über Neustarts Ihres Prozesses hinweg beizubehalten.
Es wird dringend empfohlen, ein brandneues Benutzerkonto für den Bot zu erstellen, damit es bei Bedarf Gruppen und privaten Nachrichten hinzugefügt werden kann. Vermeiden Sie die Verwendung des @system-Kontos.
Die folgende Reihe von Algorithmen ist im Stil der WHATWG-Spezifikation geschrieben und baut schrittweise den Algorithmus auf, um kontinuierlich auf neue Beiträge zu überwachen.
Algorithmen-Spezifikationen
Sei die Forum-Basis-URL die URL zur Site ohne abschließenden Schrägstrich – z. B. https://meta.discourse.org oder https://www.contoso.com/forum für Installationen in Unterordnern.
Abrufen der nächsten neuesten Beiträge
Um die nächsten neuesten Beiträge basierend auf einer Ganzzahl höchste gesehene Beitrags-ID und einem Flag ausgelöst durch Message Bus abzurufen, führen Sie diese Schritte aus:
- Sei maximale Antwort-Beitrags-ID das Ergebnis der Addition von fünfzig (50) zur höchsten gesehenen Beitrags-ID.
- Sei Anfrage-URI die Verkettung der Forum-Basis-URL,
/posts.json,?before=und der maximalen Antwort-Beitrags-ID. - Sei Antwort das Ergebnis von
JSON abrufen unter Einhaltung der Ratenlimits mit der Anfrage-URI und den Anmeldeinformationen. - Wenn Antwort ein HTTP-Fehler ist, brechen Sie diese Schritte mit einem Fehler ab.
- Sei Beiträge das JSON-Array am Pfad
latest_postsinnerhalb der Antwort. - Setzen Sie das Flag neue Beiträge gesehen auf nicht gesetzt.
- Führen Sie für jedes JSON-Objekt Beitrag in Beiträge in umgekehrter Reihenfolge diese Schritte aus:
- Sei Beitrags-ID die JSON-Zahl am Pfad
idinnerhalb von Beitrag. - Setzen Sie höchste gesehene Beitrags-ID auf Beitrags-ID.
- Setzen Sie das Flag neue Beiträge gesehen.
Geben Sie Beitrag aus. (
Mit anderen Worten: Senden Sie den Beitrag an die gewünschte benutzerdefinierte Verarbeitung.)- Wenn ausgeben ein Backpressure-Signal zurückgibt, brechen Sie diese Schleife ab.
- Sei Beitrags-ID die JSON-Zahl am Pfad
-
Die obige Schleife wird in umgekehrter Reihenfolge ausgeführt, sodass Ihr Code zuerst die ältesten Beiträge und zuletzt die neuesten Beiträge sieht. - Wenn das Flag neue Beiträge gesehen gesetzt ist:
- Führen Sie die Schritte für
Zustand im Speicher persistent speichern mit höchster gesehener Beitrags-ID aus.
- Führen Sie die Schritte für
- Beenden Sie diese Schritte und geben Sie die höchste gesehene Beitrags-ID zurück.
Eine hohe existierende Beitrags-ID abfragen
Um eine hohe existierende Beitrags-ID abzufragen, führen Sie diese Schritte aus:
- Sei letzte Abfrage-Anfrage-URI die Verkettung der Forum-Basis-URL und
/posts.json. - Sei letzte Abfrage-Antwort das Ergebnis von
JSON abrufen unter Einhaltung der Ratenlimits mit der letzten Abfrage-Anfrage-URI und den Anmeldeinformationen. - Wenn letzte Abfrage-Antwort ein HTTP-Fehler ist, brechen Sie diese Schritte mit einem Fehler ab.
- Sei Abfrage-Beiträge das JSON-Array am Pfad
latest postsinnerhalb der letzten Abfrage-Antwort. - Führen Sie für jedes JSON-Objekt Beitrag in Abfrage-Beiträge folgende Schritte aus:
- Sei Beitrags-ID die JSON-Zahl am Pfad
idinnerhalb von Beitrag. - Beenden Sie diese Schritte und geben Sie Beitrags-ID zurück.
- Sei Beitrags-ID die JSON-Zahl am Pfad
- Brechen Sie diese Schritte mit einem Fehler ab.
Auffüllen ab dem Neuesten
Um ab dem Neuesten aufzufüllen, gegeben eine optionale Ganzzahl höchste gesehene Beitrags-ID, führen Sie diese Schritte aus:
- Sei minimale Beitrags-ID die höchste gesehene Beitrags-ID, falls vorhanden, andernfalls null (0).
- Sei hohe existierende Beitrags-ID das Ergebnis von eine hohe existierende Beitrags-ID abfragen.
- Wenn maximale Beitrags-ID ein Fehler ist, brechen Sie diese Schritte mit einem Fehler ab.
- Führen Sie die Schritte zum Auffüllen basierend auf der minimalen Beitrags-ID und der hohen existierenden Beitrags-ID aus.
Auffüllen
Um aufzufüllen, gegeben zwei Ganzzahlen minimale Beitrags-ID und hohe existierende Beitrags-ID:
- Sei aktuelle minimale Beitrags-ID gleich minimale Beitrags-ID.
- Wiederholen Sie diese Schritte:
- Führen Sie die Schritte zum Abrufen der nächsten neuesten Beiträge basierend auf der aktuellen minimalen Beitrags-ID und einem nicht gesetzten Flag ausgelöst durch Message Bus aus.
- Wenn die Schritte zum Abrufen der nächsten neuesten Beiträge nicht erfolgreich abgeschlossen wurden:
- Aktualisieren Sie den exponentiellen Backoff-Algorithmus mit einem Fehlersignal und warten Sie die angegebene Zeitdauer.
- Fahren Sie mit der nächsten Schleifeniteration fort (ohne die aktuelle minimale Beitrags-ID zu aktualisieren).
- Sei kandidaten-maximale Antwort-Beitrags-ID das Ergebnis der Addition von fünfzig (50) zur aktuellen minimalen Beitrags-ID.
- Wenn die kandidaten-maximale Antwort-Beitrags-ID größer oder gleich der hohen existierenden Beitrags-ID ist,
beenden Sie diese Schritte. - Setzen Sie die aktuelle minimale Beitrags-ID auf die kandidaten-maximale Antwort-Beitrags-ID.
Kontinuierlich auf neue Beiträge überwachen
Um kontinuierlich auf neue Beiträge zu überwachen, führen Sie diese Schritte aus:
- Sei höchste gesehene Beitrags-ID eine nicht gesetzte optionale Ganzzahl.
- Setzen Sie höchste gesehene Beitrags-ID auf das Ergebnis von
Zustand aus dem Speicher wiederherstellen. - Wenn höchste gesehene Beitrags-ID nicht gesetzt ist:
- Setzen Sie anfängliche Beitrags-ID auf das Ergebnis von eine hohe existierende Beitrags-ID abfragen.
- Führen Sie die Schritte für
Zustand im Speicher persistent speichern mit anfänglicher Beitrags-ID aus. - Setzen Sie höchste gesehene Beitrags-ID auf anfängliche Beitrags-ID.
- Setzen Sie Benachrichtigungen auf das Ergebnis der Ausführung der Schritte zum
Abonnement des Message Bus mit einem Kanal von /latest. - Führen Sie die folgenden Schritte wiederholt aus:
- Setzen Sie neue höchste gesehene Beitrags-ID auf das Ergebnis von Abrufen der nächsten neuesten Beiträge, mit dem Flag ausgelöst durch Message Bus gesetzt, wenn ein Message-Bus-Update aufgetreten ist, sowie der höchsten gesehenen Beitrags-ID.
- Wenn die Schritte zum Abrufen der nächsten neuesten Beiträge nicht erfolgreich abgeschlossen wurden:
- Aktualisieren Sie den exponentiellen Backoff-Algorithmus mit einem Fehlersignal und warten Sie die angegebene Zeitdauer.
- Fahren Sie mit der nächsten Schleifeniteration fort.
- Wenn die neue höchste gesehene Beitrags-ID sich von der höchsten gesehenen Beitrags-ID unterscheidet:
- Aktualisieren Sie den exponentiellen Backoff-Algorithmus mit einem Erfolgssignal.
- Setzen Sie die höchste gesehene Beitrags-ID auf die neue höchste gesehene Beitrags-ID.
- Warten Sie auf eine Nachricht auf Benachrichtigungen oder auf ein vom System definierter Timeout. Dieses Timeout muss mindestens 10 Minuten betragen und kann vernünftigerweise bis zu 24 Stunden oder etwas länger reichen.
Algorithmen, die Sie bereitstellen müssen:
JSON abrufen unter Einhaltung der Ratenlimits, unter Angabe einer Anfrage-URI und optionaler Anmeldeinformationen.
- Dies muss automatisch zurücktreten und unter Verwendung des exponentiellen Backoff-Algorithmus und/oder der vom Server bereitgestellten
Retry-After-Informationen bei Auftreten eines 429-Fehlers erneut versuchen.
- Dies muss automatisch zurücktreten und unter Verwendung des exponentiellen Backoff-Algorithmus und/oder der vom Server bereitgestellten
Zustand aus dem Speicher wiederherstellen
Zustand im Speicher persistent speichern, unter Angabe einer Ganzzahl
Abonnement des Message Bus