
Hintergrund
Vor einem Jahr habe ich beschlossen, einen Telegramm-Bot zu erstellen, um das beliebte Neujahrsspiel „Secret Santa“ zu spielen. Ich war von der Tatsache inspiriert, dass wir uns vor ein paar Jahren bei der Arbeit als Unternehmen entschieden haben, dieses Spiel zu spielen (es schien sehr cool zu sein), und außerdem verfolge ich seit langem den
ADM-Club auf Habré. Im Oktober-November letzten Jahres wurde mir klar, dass ich dieses Jahr wieder zwischen meiner eigenen Firma spielen musste, aber diesmal ohne die Namen herauszuziehen, die auf einem Stück Papier von der Weihnachtsmannmütze geschrieben waren, sondern eher technisch oder so. Da sich alle in einem Telegramm befanden und es für mich sehr interessant war, dort einen Bot zu schreiben, habe ich mich dazu entschlossen, dies auf dieser Plattform zu tun
Übrigens habe ich vor einem Jahr bereits einen Artikel über dieses Projekt auf Habré geschrieben, aber ich habe nichts über die Implementierung gesagt. Ich habe aus gutem Grund nicht gesprochen, weil es eine Schande war oder so :) Das Projekt wurde nur für die Firma bei der Arbeit vorbereitet (15-20 Personen bei maximaler Geschwindigkeit), aber es stellte sich heraus, dass das Projekt in anderen Kreisen nach ein paar Artikeln über Ressourcen "geschossen" wurde. Außerdem machten populärere Ressourcen selbst Werbung für mich (ich wusste nicht einmal davon, bevor ein großer Zustrom von Menschen aus dem Nichts kam).
Einen Monat lang habe ich ohne eine einzige Investition in Werbung über 5000 zufriedene Spieler versammelt und mich wirklich in dieses Projekt verliebt. Aber neben all seinen Vorteilen gab es ein großes Minus in ihm, und dies ist die Umsetzung.
Wie war es vor einem Jahr?
Es war lustig, dass ich einen Knopf im Bot hatte "Join the Room". Ja, genau das ist es, was sich anschließt. Sie haben mir geschrieben, um diesen Grammatikfehler zu beheben, aber ich habe es nicht riskiert, und deshalb :) Als Nächstes habe ich einen Code aus der letztjährigen Version des Bots eingefügt.
elseif ($user['state'] == 7) { if (mb_stripos($textMessage, '') !== false) { if (!empty($user['santa_for_user_id'])) { $text = ' , '; } else { $text = "! - , "; $db->updateState($userId, 8); } }
Der ganze Bot - es war eine riesige index.php-Datei, die von der mb_stripos-Funktion lebte. Darüber hinaus gab es viele identische "ifics". Das heißt mb_stripos ($ textMessage, 'join')! == false kann mehrmals auftreten. Wenn Sie das Wort „Verbinden“ in der Schaltfläche in „Verbinden“ ändern und vergessen, eine Art Iftschik zu ändern (was wiederum sehr viel ist), kann alles verstreuen. Woran es nicht sofort erkennbar sein mag (nur ein Bot wird in bestimmten Szenarien nicht so reagieren, wie er sollte). Nachdem ich den Text geändert hatte, begannen die Benutzer zu schreiben, dass der Bot in einem bestimmten Szenario nicht wie gewünscht reagiert. Ich wollte kein weiteres Risiko eingehen und dachte, dass der Fehler nicht so kritisch ist :) Im Prinzip verstehst du. Wenn es einen Knopf gab, zum Beispiel "Find random Santa", dann habe ich mich über mb_stripos an das Wort "random" gewöhnt. Es hat Spaß gemacht, wenn ein ähnlicher Button mit ähnlichem Text auftauchte und wenn es nicht nötig war, wurde alles unnötig, wenn (wenn zum Beispiel sowohl dort als auch dort das Wort "zufällig" steht) :)
Übrigens, haben Sie $ user ['state'] bemerkt? Zu diesem Zeitpunkt habe ich „Status“ eingeführt, um zu verstehen, in welchem Status sich der Benutzer gerade befindet. Wollte er sich zum Beispiel dem Raum anschließen oder etwas erschaffen, oder wollte er ein einziges Spiel spielen? Und für jeden Staat gab es einen eigenen Satz von Ifchi, der auch wichtig war, nicht zu zerbrechen.
Die Cron-Datei lag übrigens neben der index.php und konnte direkt unter dem Browser ausgeführt werden (anscheinend hat es mich dann nicht wirklich gestört). Als ich plötzlich eine Art "Staat" hinzufügen wollte (ich wünschte, ich wollte das nicht), musste ich mich in diese Stadt stürzen ... und natürlich kam beim ersten Versuch nichts heraus. All dies lag auch am billigsten Hosting für 1 US-Dollar pro Monat, was mich zur Hölle schicken könnte, wenn viele Leute zur Hauptverkehrszeit anfingen zu schreiben.
Es war mit Sicherheit eine Hölle für einen Programmierer :)
Was ich dieses Jahr beschlossen habe
In diesem Jahr habe ich mich natürlich entschlossen, den Bot umzuschreiben (da es im letzten Jahr eine erhebliche Nachfrage gab). Ich wollte in den alten Code gehen und herausfinden, wie es in diesem Jahr war, um die Geschäftslogik zu übertragen. Leider konnte ich den alten Code nicht zu 70% selbst herausfinden, obwohl ich dann versuchte, Kommentare für mich im Code zu hinterlassen, um mir in einem Jahr selbst zu helfen :)
Ich beschloss, mich nur an die Hauptszenarien zu erinnern und dort etwas Neues hinzuzufügen. Er begann mit der Frage: "Was soll man zum Schreiben von Architektur verwenden, damit man später nicht weint?" Nach
langen Recherchen fiel die Wahl auf
Botman . Wir haben kleine Artikel über Habré darüber. Kurz gesagt, Botman ist eine sehr coole Sache. Es kann sowohl auf einem "sauberen" installiert werden, und Sie können die Assembly sofort mit Laravel installieren (ja, es ist ein Botman installiert, der sofort über Laravel installiert wird). Ich habe mich für diese Version entschieden, da Laravel deutlich besser ist als noch vor einem Jahr :) Es bietet die Möglichkeit, aus der "Box" heraus zu cachen, bequemes Routing, Handwerker, Middleware, Komfort, die Möglichkeit, mit der Datenbank zu arbeiten und andere Vorteile.
Wenn Sie Laravel plötzlich nicht mehr mögen, können Sie jedes andere Framework verwenden und Botman darauf installieren, oder Sie können das Framework überhaupt nicht verwenden . Übrigens, Botman basiert auf ReactPHP, was cool ist :)
Als nächstes werde ich die Vorteile von Botman beschreiben:
Es gibt eine einzige botman.php-Datei, in der Sie alle Befehle beschreiben können. Ein Beispiel:
$botman->hears('/start', function (BotMan $bot) { $bot->startConversation(new StartConversation()); })->stopsConversation();
Beim Schreiben des Befehls / start wird StartConversation gestartet (das von der abstrakten Conversation-Klasse erben sollte) und die run () -Methode implementiert.
Fragen werden ganz bequem gestellt, zum Beispiel:
$question = Question::create(" , ?")->addButtons([Button::create('')->value('create'), Button::create('')->value('join')]); $this->ask($question, function (Answer $answer) { if ($answer->isInteractiveMessageReply()) { if ($answer->getValue() == 'join') {
Beachten Sie, dass wir bei Button einen Wert festlegen und später daran festhalten können? Das heißt, vor Ihren Augen ist der Fehler mit dem "Join" behoben, weil ich mich an value () klammere :)
Übrigens können Sie weiterhin die Methode isInteractiveMessageReply verwenden, mit der die Frage beantwortet wird, ob Sie beim Beantworten der dem Benutzer gestellten Frage Text geschrieben oder auf die interaktive Schaltfläche geklickt haben.
Botman hat geholfen, die Zustände loszuwerden. Ich kann eine andere Fragemethode in der Fragemethode erstellen. Wenn zum Beispiel eine Person auf "beitreten" geklickt hat, mache ich einfach eine weitere Frage in dieser Option.
Hier sind einige weitere Methoden (aus einer sehr großen Anzahl), die der Botman zur Verfügung stellt, die leicht aus dem Namen zu verstehen sind:
$ this-> repeat ($ question);
$ this-> bot-> typesAndWaits ($ secondsToWait);
$ this-> bot-> reply ($ reply);
Der Mörder der Botman-Funktionen ist, dass ein Code auf vielen Plattformen ausgeführt werden kann. Das heißt, Sie können Ihren Code schreiben und ihn zunächst nur für Telegramm ausführen. Entscheiden Sie dann, dass Sie immer noch den Facebook-Manager aufrufen möchten und sich nicht mit dem Facebook-SDK befassen müssen. Die Botman-Entwickler haben dies bereits für Sie erledigt. Sie müssen nur
den Treiber installieren und die Token-API Ihres Facebook Messenger-Bots in .env einstellen. Alle Funktionen werden automatisch im Facebook Messenger ausgeführt.
Botman unterstützt nicht nur Facebook Messenger und Telegramm, diese Liste enthält auch Slack, Skype, WeChat (eine vollständige Liste finden Sie auf ihrer Website).
Außerdem ist der "Held des Anlasses" dafür berühmt, dass er bereits die Papa-Tests / Botman (Sie können Unit-Tests schreiben, Ihre Kappe) sowie eine gute Dokumentation hat. Es ist schwierig, alle Vorteile zu nennen, da ich offensichtlich nicht mit allen zusammengearbeitet habe. Ich erinnere mich nicht an alles, aber ich denke, dass das, was ich beschrieben habe, bereits ausreichen sollte, um mich zumindest für sie zu interessieren :)
Na gut, aber werden wir auf dem Hosting wieder für 1 $ hosten?
Nein, dieses Jahr ist alles ernst. Hosting für $ 10 pro Monat und eine kostenlose Domain mit Ref. Nur ein Scherz :)
Ich beschloss, mein Wissen über Docker zu erweitern, kaufte VPS auf DigitalOcean und startete das Projekt in Docker. Es ist ziemlich gut gelaufen, obwohl ich es fast zum ersten Mal gemacht habe.
Überraschenderweise ist der Hafenarbeiter nie gestürzt .
Mit VPS natürlich cooler :)
Als Hafenarbeiter war es viel bequemer, die Entwicklung durchzuführen (Versionierung auf dem Mädchen und auf dem Produkt wurde beibehalten).
Das Lustige ist, dass ich, als ich bezahlte Funktionen im Bot einführte, ein Upgrade vom Zahlungssystem bekommen musste. Das Zahlungssystem schickte mir ständig meinen Antrag auf ein Upgrade zurück und sagte: "Die Website ist inaktiv." Arbeitete für mich, arbeitete für Freunde (wir kommen aus der Ukraine), arbeitete aber nicht für Leute aus der Russischen Föderation. Ohne zu zögern stellte ich fest, dass Roskomnadzor die IP-Adresse meines Tropfens vor einem Jahr noch verboten hatte (viele DigitalOcean-Server wurden zu diesem Zeitpunkt von der ILV beschädigt). Dann haben sie sich auch dafür entschieden.
Worauf steht dein Bot?
Und ich rate jedem, diesen speziellen Stack zu verwenden, wenn er seine Bots in PHP schreibt (um sich später nicht wie ich selbst ins Bein zu schießen).
Was ist neu im Bot?
Der Weihnachtsmann lernte anzurufen
Sie können einen Anruf vom Weihnachtsmann bestellen! Er wird dich sogar verstehen und dir zuhören :)
Der Weihnachtsmann ruft die angegebene Nummer (aus den USA) an und stellt Fragen, z. B. „Wie haben Sie sich im Jahr verhalten?“, „Was möchten Sie für das neue Jahr?“, „Kennen Sie das Gedicht?“ Usw. Wenn der Benutzer sagt, dass er den Reim nicht kennt, folgt der Weihnachtsmann einem anderen Fragenszenario. Wenn er sagt, dass er es weiß, bittet der Weihnachtsmann Sie, den Reim zu erzählen diese Wunschliste an den Benutzer, der den Anruf bestellt hat (plötzlich war das Kind von seinen Eltern im Zimmer geschlossen, aber irgendwie müssen sie herausfinden, was er den Weihnachtsmann gefragt hat?). Der Weihnachtsmann sendet auch die Audioaufnahme des Anrufs mit dem Weihnachtsmann als Andenken :)
Jetzt können Sie herausfinden, wer Ihr Weihnachtsmann ist.
Zrada? Das widerspricht dem Namen des Spiels "Secret Santa", nicht wahr? Im Prinzip ja. ABER letztes Jahr waren meine Drogen von der Anzahl der Leute, die ihren Weihnachtsmann wissen wollten, zerrissen. "Wird der Chef mir ein Geschenk geben?", "Jemand hat uns kein Geschenk für jemanden gegeben, können Sie sagen, wer sie hätte geben sollen?" Und so weiter. Jetzt gibt es eine solche Gelegenheit, aber was auch immer es war - ein solches Vergnügen wird bei 5,99 $ herauskommen :)
Schlussfolgerungen
Sie sollten nicht hoffen, dass Ihr Projekt immer klein sein wird. Es ist nicht nötig, eine index.php mit ein paar ifs zu erstellen, auch wenn das Projekt mit nur ein paar ifs beginnt (ich kenne genug von diesen Projekten). Besser gleich machen. Selbst wenn Sie mehr Zeit damit verbringen, haben Sie den Vorteil, dass Sie, wenn Sie das Projekt dringend ändern / logisch ergänzen müssen, nicht darüber nachdenken müssen, wie Sie ifas ändern müssen, damit der Bot nicht herunterfällt, wie sich für mich herausstellte :). Dieser Ansatz (mit ifas) lehrt Sie auch, alle anderen Entscheidungen zu treffen (nicht die beste Fähigkeit, stimme zu). Nun, natürlich, denken Sie an sich selbst, Sie müssen später in diesen Code einsteigen, und Sie müssen damit umgehen, und dann wird es nicht sehr süß sein :(
Den ganzen guten Code, schreibe deine Chat-Bots und schreibe auch deine Projekte. Das ist großartig!
Am Ende möchte ich daran erinnern, dass ich irgendwo gelesen habe, dass:
Wenn Sie wüssten, dass Ihre Lieblingsprojekte (Facebook, VK usw.) so angelegt sind, dass sie kurz vor dem Absturz stehen, wären Sie überrascht. Ja, in diesem Jahr haben alle mit Vergnügen gespielt und sich nicht einmal vorgestellt, was in diesem Bot vor sich geht (ich selbst war schockiert, wie er diesen Dezember überlebt hat :)).
Wenn du spielen willst -
Wellcome :)