Einfach, Slack Bot mit Java zu machen

Hier ist eine einfache Möglichkeit, einen SlackBot in Java zu erstellen

Den vollständigen eingeführten Quellcode finden Sie unter https://github.com/riversun/slacklet-examples.git

API-Token für BOT erhalten

Gehen Sie zuerst hierher und holen Sie sich das API-Token für BOT https://my.slack.com/services/new/bot

slack_reg_01.png

Lockeres Protokoll und Vorbereitung

Das Protokoll ist Websocket-basiertes Slack RTM (Realtime Messaging API) und die Bibliothek ist Simple Slack API. Verwenden Sie eine Wrapper-Bibliothek namens Slacklet basierend auf -slack-api.git.

Slacklet Slacklet kann von Maven / Gradle oder direktem Download von Glas von den folgenden erhalten werden. maven/gradle Slacklet.jar direkt herunterladen

Verbinde BOT mit dem Kanal

Laden Sie zunächst den zuvor erstellten BOT ein, sich einem beliebigen Kanal anzuschließen.

ex00_00_join.png

1. 1. Slack Bot gibt ein Echo zurück

Dies ist ein einfaches Beispiel für die Rückgabe eines Echos, wenn jemand spricht.

Example00.java



public class Example00 {

	public static void main(String[] args) throws IOException {

		String botToken ="API-Token erhalten" ;

		SlackletService slackService = new SlackletService(botToken);

		//Slacklet hinzufügen
		slackService.addSlacklet(new Slacklet() {

			@Override
			public void onMessagePosted(SlackletRequest req, SlackletResponse resp) {
				//Nachricht vom Benutzer gepostet

				//Holen Sie sich den Kanal, in dem die Nachricht gepostet wurde
				SlackChannel channel = req.getChannel();

				if ("random".equals(channel.getName())) {
					// #Wenn es ein zufälliger Kanal wäre

					//Nachrichtentext abrufen
					String content = req.getContent();

					//Senden Sie eine Nachricht von BOT an den Kanal, auf dem die Nachricht veröffentlicht wurde
					resp.reply("「" + content + "Ich sagte.");

				}

			}
		});

		//Slacklet-Service gestartet(Mit Slack verbinden)
		slackService.start();

	}

}

Quellcode für dieses Beispiel

Ausführungsbeispiel

Wenn Sie auf dem Slack "Hallo" sagen, wird das Echo vom BOT zurückgegeben. ex00_01.png

Erläuterung

Erstellen Sie ** SlackletService ** wie oben und fügen Sie ** Slacklet ** mit ** # addSlacklet ** hinzu. ** Slacklet ** ist wie ** Servlet ** und überschreibt die erforderlichen Methoden.

** # onMessagePosted ** wird aufgerufen, wenn ein Benutzer eine Nachricht an einen Kanal sendet. Wenn Sie antworten möchten, indem Sie den Kanal einschränken, identifizieren Sie den Kanalnamen und antworten Sie wie im obigen Beispiel.

Überschreiben Sie ** Slacklet # onDirectMessagePosted **, wenn Sie direkte Nachrichten empfangen möchten, die vom Benutzer an den BOT gesendet wurden:

@Override
public void onDirectMessagePosted(SlackletRequest req, SlackletResponse resp) {
	//Eine direkte Nachricht an BOT wurde gesendet

	String content = req.getContent();

	//Erwähnen Sie den Benutzer, der die Nachricht gesendet hat
	String mention = req.getUserDisp();

	//Antworten Sie dem Benutzer, der die Direktnachricht gesendet hat
	resp.reply(mention + "Vielen Dank für Ihre direkte Nachricht.\n「" + content + "Ich sagte");
}

Quellcode für dieses Beispiel

Ausführungsbeispiel

Wenn Sie wie unten gezeigt eine direkte Nachricht an BOT senden, erhalten Sie eine Antwort.

ex01_00.png

3. 3. Reagiert nur, wenn @ erwähnt

Nachrichtenbenutzer Erwähnen Sie den BOT, wenn Sie beispielsweise ein ** "@ smilebot Hello" ** erhalten und eine Nachricht gepostet haben, wird das ** Slacklet # onMentionedMessagePosted ** wie folgt überschrieben:

@Override
public void onMentionedMessagePosted(SlackletRequest req, SlackletResponse resp) {
	//Eine Nachricht mit einer Erwähnung zu diesem BOT wurde auf einem Kanal veröffentlicht(Beispiel "@smilebot Guten Morgen ")

	String content = req.getContent();

	String mention = req.getUserDisp();
	resp.reply("Hallo," + mention + "Herr. """ + content + "Ich sagte.");
}

Quellcode für dieses Beispiel

Ausführungsbeispiel

Sie erhalten nur dann eine Antwort, wenn Sie den BOT-Namen mit ** @username ** angeben.

ex01_01_mentioned.png

4. Senden Sie eine direkte Nachricht an den Benutzer

Dies ist ein Beispiel für das Senden einer direkten Nachricht vom BOT an den Benutzer. Es wird verwendet, wenn Sie zuerst eine Nachricht von BOT senden möchten, anstatt auf eine Nachricht von einem Benutzer zu antworten.


public class Example02 {

	public static void main(String[] args) throws IOException {

		String botToken ="API-Token erhalten"; 

		SlackletService slackService = new SlackletService(botToken);
		slackService.start();

		//Senden Sie eine direkte Nachricht (keine Antwort) an den Benutzer
		String userName = "riversun";
		slackService.sendDirectMessageTo(userName, "Hallo ~");

		//Verbindung mit Durchhang beenden
		slackService.stop();

	}

}

Quellcode für dieses Beispiel

Ausführungsbeispiel

Bei der Ausführung erhalten Sie eine direkte Nachricht von BOT wie folgt.

ex02_00_direct_left.png

ex02_01_direct.png

5. Senden Sie eine Nachricht an den angegebenen Kanal

public class Example03 {

	public static void main(String[] args) throws IOException {

		String botToken = ResourceBundle.getBundle("credentials").getString("slack.bot_api_token");

		SlackletService slackService = new SlackletService(botToken);
		slackService.start();

		//Senden Sie eine Nachricht (keine Antwort) an einen Kanal
		String channelName = "random";
		slackService.sendMessageTo(channelName, "zufälliger Kanal von allen, Hallo!");

		slackService.stop();

	}

}

Quellcode für dieses Beispiel

Ausführungsbeispiel

** #random ** BOT sendet eine Nachricht an den Kanal. ex03.png

6. Verwenden Sie die Sitzungsfunktion (benutzerspezifischer Kontext)

Slacklet wurde für mehrere Benutzer entwickelt. Ermöglicht einem Benutzer die Interaktion mit dem BOT, während der andere Benutzer unabhängig interagiert. Um dies zu erreichen, gibt es eine Sitzungsfunktion, um verschiedene Zustände für jeden Benutzer zu speichern. Wie beim Servlet ruft ** SlackletRequest .getSession ** die Sitzung ab und enthält den Status darin.


@Override
public void onDirectMessagePosted(SlackletRequest req, SlackletResponse resp) {

	String content = req.getContent();

	//Holen Sie sich eine Sitzung (Sitzung ist für jeden Benutzer einzigartig)
	SlackletSession session = req.getSession();

	//Holen Sie sich eine Ganzzahl zum Zählen der Anzahl der Bemerkungen aus der Sitzung. Wenn noch nichts eingegeben wurde, ist der Standardwert 1.
	Integer num = (Integer) session.getAttribute("num", 1);

	resp.reply(req.getUserDisp() + "Ist" + num + "Das zweite Mal "" + content + "Ich sagte.");

	//Aktualisieren Sie die Sitzung, indem Sie die Anzahl erhöhen
	num++;
	session.setAttribute("num", num);

}

Quellcode für dieses Beispiel

Ausführungsbeispiel

Es sieht so aus, als würde der Dialog fortgesetzt, da er sich an die Anzahl der Gespräche in der Sitzung erinnert. Es wird für jeden Benutzer eindeutig gespeichert. ex04.png

Erweiterungstipps

[** Sitzungspersistenz **] ** Kontext ** ist definitiv erforderlich, wenn ein vollwertiger Dialog implementiert werden soll. ** Kontext ** enthält den interaktiven Status, verschiedene Status usw.

[** Mehrbenutzerunterstützung **] Jeder Benutzer wird in einem separaten Thread verarbeitet, sodass der Dialog mit mehreren Benutzern gleichzeitig verarbeitet werden kann. Ich denke jedoch, dass es besser ist, die Größe der ausführbaren Datei und des Thread-Pools entsprechend der Anzahl der von BOT behandelten Benutzer anzupassen.

[** Protokoll anzeigen **] Wenn Sie Folgendes tun, wird das Protokoll an stderr ausgegeben

org.riversun.xternal.log.Logger.setEnabled(true);

[** Tiefere Expansion **] Unter Slacklet befindet sich eine Erweiterung der Simple Slack API. Wenn Sie tiefer gehen möchten, lesen Sie Simple Slack API.

Recommended Posts

Einfach, Slack Bot mit Java zu machen
Einfacher LINE BOT mit Java Servlet
Wie erstelle ich einen Discord Bot (Java)
Machen Sie einen Blackjack mit Java
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Java - So erstellen Sie JTable
Refactoring: Machen Sie Blackjack in Java
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Einfache Möglichkeit, die Methoden- / Feldliste in Java REPL zu überprüfen
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich habe einen RESAS-API-Client in Java erstellt
Multithreaded passend zur [Java] Vorlage
So erstellen Sie einen Java-Container
SpringBoot + Redis Einfache Demo
Wie man JAVA in 7 Tagen lernt
Protokollausgabe in Datei in Java
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
Versuchen Sie, Yuma in Java zu implementieren
So erstellen Sie ein Java-Array
So verketten Sie Zeichenfolgen mit Java
Einfacher LINE BOT mit Java Servlet Teil 2: Ich habe versucht, Bildnachrichten und Vorlagen zu erstellen
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie, n-ary Addition in Java zu implementieren
So führen Sie eine Basiskonvertierung in Java durch
Ändern Sie die Liste <Optional <T >> in Java in Optional <Liste <T >>
Konvertieren Sie SVG-Dateien in Java in PNG-Dateien
So erzwingen Sie Codierungskonventionen in Java
Einbetten von Janus Graph in Java
[Java] Anfänger wollen Dating machen. 1
Post to Slack von Play Framework 2.8 (Java)
So erhalten Sie das Datum mit Java
Führen Sie TensorFlow in Java aus. Es ist jedoch einfach. .. .. ..
Fügen Sie Word-Dokumenten in Java Fußnoten hinzu
Lassen Sie uns migrieren, um Java komfortabler zu machen
[Java Bronze] 5 Probleme zu beachten
Einfach mit regulären Java-Ausdrücken zu stolpern
Beispiel zum Entpacken einer gz-Datei in Java
Von Java nach C und von C nach Java in Android Studio
Fügen Sie dem Cookie in Java das SameSite-Attribut hinzu
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Partisierung in Java
Ich möchte eine E-Mail in Java senden.
So zeigen Sie eine Webseite in Java an
CORBA scheint in Java SE 11 entfernt zu sein. .. ..
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Änderungen in Java 11
Inkrementierungsverhalten Versuchen Sie, Java zum Problem TypeScript 3-4 zu machen
Janken in Java
So erhalten Sie eine Klasse von Element in Java
Es scheint kein anderes zu geben - wenn in Java
Zeichenfolgenoperation Versuchen Sie, das Java-Problem in TypeScript 9-3 zu ändern
rsync4j - Ich möchte rsync in Java berühren.