Hallo, Khabrovsk Bürger!
Heute werde ich versuchen, Ihnen zu erklären, wie ein Student einen Bot zum Speichern von Hausaufgaben für VK schreiben kann.
Vorsicht!Ich werde sofort darauf aufmerksam machen, dass es für ernsthafte Projekte unmöglich ist, eine solche Infrastruktur aufzubauen. Dieses gesamte Projekt wurde nur zu Unterhaltungs- und Zeitzwecken sowie für Präsentationen bei allen Arten von Schulprojektkonferenzen erstellt.
Bemerkung17.11.2013 15:55 Uhr
Sie schrieben mir in privaten Nachrichten, dass im gesamten Artikel nicht klar sei, über welche Art von Hausaufgaben sie sprechen.
Ich werde sofort klarstellen, dass alle Aufgaben, über die ich im Artikel spreche, wie in einem normalen Tagebuch ausgefüllt sind und die alten Aufgaben "verschwinden".
Auf diese Weise erhält der Benutzer die Aufgaben, die er ausführen muss.
Der Bot wurde in PHP geschrieben und aus Versuchsgründen habe ich beschlossen, Updates nicht über die CallBack-API-Webhooks, sondern über LongPoll zu erhalten.
Aufgrund der Tatsache, dass ich niemals Bots mit dieser Methode geschrieben habe, um Updates zu erhalten, wurde ich von vagen Zweifeln gequält, ob ich diesen Bot in PHP schreiben könnte, aber am Ende hat alles geklappt. Jetzt gehe ich weiter dazu, wie meine Ideen entstanden sind und wie ich sie umgesetzt habe.
Das erste war im Allgemeinen die Idee, einen Bot zu schreiben, um darin Hausaufgaben zu speichern. Nun, wie man es aufbewahrt. So etwas wie Notizen, aber in VK, da ich selten auf Notizen gehe und sie für mich nicht sehr praktisch sind.
Um einen banalen Bot mit einer Hausaufgabe zu implementieren, habe ich eine Tabelle in der Datenbank erstellt, in der der Name des Gegenstands, die Hausaufgabe selbst und die Anzahl all dieses Glücks festgelegt wurden. Dies ist nicht sehr interessant zu beschreiben, daher werde ich diesen Punkt weglassen, aber ich werde ein
aussagekräftiges ER-Diagramm geben, wie die Datenbank am Anfang ausgesehen hat.

Dann überlegte ich mir, warum ich anderen nicht die Möglichkeit geben sollte, den Bot zu benutzen. Nun, er gab den Leuten diese Gelegenheit. Ich habe die Datenbank ein wenig geändert, aber die Tabelle, um die sich alles dreht, ist fast unverändert geblieben.

Anhand der ER-Tabelle können Sie erkennen, dass jeder Benutzer einer Gruppe angehört. Der Eintritt in eine bestehende Gruppe erfolgt per Token, und für jede neue Gruppe wird ein eindeutiger Token generiert. Und die Aufgaben selbst gehören auch zu der einen oder anderen Gruppe, sodass Benutzer kein Chaos bei den Aufgaben ihrer und der anderer Personen sehen.
Ich habe den Code hinzugefügt, hier gibt es auch nichts Interessantes, prinzipiell nein. Ich habe es nur so gemacht, dass die alten Aufgaben nicht angezeigt werden, um das Ganze nicht manuell zu löschen, aber ich denke, das Schreiben einer SELECT-Abfrage in SQL ist recht einfach.
Und jetzt ist es Zeit für Spaß: Ich habe angefangen, Funktionen hinzuzufügen, die die gesamte Nachrichtenwarteschlange verlangsamen. Deshalb habe ich beschlossen, sie in separaten Skripten abzulegen, da ich momentan kein Multithreading ausführen kann, mich aber für LongPoll entschieden habe. (Und gibt es eine solche Verwendung von PHP?)
Und diese Funktionen: Senden von Nachrichten an alle Mitglieder der Gruppe und Generieren von QR-Codes, in denen der Schlüssel zum Beitritt zur Gruppe verschlüsselt ist.
Dazu habe ich gerade eine weitere Tabelle in der Datenbank angelegt, in die ich den Mailing-Text eingebe und für wen er bestimmt ist. Die Basis nahm schließlich diese Form an.

Die Generierung von QR-Codes erfolgt in der Regel in einem separaten Prozess, der auch Aktualisierungen von VK über ausgehende Nachrichten erhält und prüft, welche Nachricht den Schlüssel zur Gruppe enthält.
Bisher sieht alles mehr oder weniger angemessen aus, aber dann habe ich das relationale Modell gebrochen, indem ich JSON in die Datenbank aufgenommen habe.
Welche Art von JSON kann ich in die Datenbank einfügen? Ich gebe den Attachments-Parameter ein, den ich von VK erhalte, und verarbeite sie dann beim Senden von Nachrichten, um den Hauptprozess nicht zu laden.
Infolgedessen sieht das Ganze so aus.

Über die gleiche Methode habe ich dann Dateianhänge zu Aufgaben im Bot hinzugefügt. Die Aufgabe wird sofort hinzugefügt, und die Dateien werden nach und nach angehängt, wenn sie dem Format und der Größe für Telegram Bot Api entsprechen. Ich lade Dateien über eine Gruppe von Bots zu Telegram hoch und speichere die Datei-ID.
Ich speichere die Dateien im Telegramm, weil der Server, auf dem ich das alles aufbewahre, nicht viel Platz hat und die Erweiterung für mich finanziell sehr schwierig ist.
Die gesamte Datenbank sah nun so aus:

Aber jetzt habe ich eine Aufgabe: Wie gebe ich Dateien an Benutzer zurück? Dann habe ich fast die gleiche Logik wie beim Hinzufügen von Dateien gemacht.

Dann wurde ein weiterer Bot für den Cart hinzugefügt, den ich aber noch nicht beschreiben werde.
Grundsätzlich denke ich, dass die Datenbankstruktur nicht schlecht ist, aber mir gefällt hier etwas nicht. Vielleicht ist es für einige der Neuankömmlinge hilfreich zu sehen, wie Sie die Datenbankstruktur im Laufe der Entwicklung der Idee gestalten können, und es wird interessant für mich, die Kritik an der Organisation meiner Basis zu hören und etwas in Betrieb zu nehmen.
Der Artikel ist klein, kann aber Kritik stürzen.
Klats 1"Voll bis 17 Uhr auf meinem Schreibtisch!"
Nachdem ich das Projekt verteidigt habe, werde ich alle Quellcodes des Bots auf Git veröffentlichen. Es ist keine Sünde, einen Artikel zu schreiben.
Klats 2Einige Ideen, die sich auf das Arbeiten mit Dateien beziehen, wurden mir im Habr-Chat im Warenkorb vorgeschlagen, ich bin dort oft zu sehen.
Klats 3Hier können Sie einen Live-Bot
stecken . Ich freue mich auf Feedback.