Facile à créer Slack Bot avec Java

Voici un moyen simple de créer un SlackBot en Java

Le code source complet introduit peut être trouvé à https://github.com/riversun/slacklet-examples.git

Obtention d'un jeton API pour BOT

Tout d'abord, allez ici et obtenez le jeton API pour BOT https://my.slack.com/services/new/bot

--Une fois que vous avez choisi un nom d'utilisateur BOT, cliquez sur Ajouter une intégration de bot

slack_reg_01.png

Protocole et préparation Slack

Le protocole est Slack RTM basé sur Websocket (API de messagerie en temps réel) et la bibliothèque est Simple Slack API. Utilisez une bibliothèque d'encapsuleurs appelée Slacklet basée sur -slack-api.git).

Slacklet Slacklet peut être obtenu à partir de maven / gradle ou téléchargement direct de jar à partir de ce qui suit. maven/gradle Télécharger slacklet.jar directement

Rejoignez BOT sur la chaîne

Tout d'abord, invitez le BOT que vous avez créé précédemment à rejoindre n'importe quelle chaîne.

ex00_00_join.png

1. 1. Slack bot renvoyant un écho

Ceci est un exemple simple de retour d'un écho tel qu'il est lorsque quelqu'un parle.

Example00.java



public class Example00 {

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

		String botToken ="Jeton d'API obtenu" ;

		SlackletService slackService = new SlackletService(botToken);

		//Ajouter un slacklet
		slackService.addSlacklet(new Slacklet() {

			@Override
			public void onMessagePosted(SlackletRequest req, SlackletResponse resp) {
				//Message publié par l'utilisateur

				//Obtenez la chaîne sur laquelle le message a été publié
				SlackChannel channel = req.getChannel();

				if ("random".equals(channel.getName())) {
					// #Si c'était un canal aléatoire

					//Obtenir le corps du message
					String content = req.getContent();

					//Envoyer un message du BOT au canal sur lequel le message a été publié
					resp.reply("「" + content + "J'ai dit.");

				}

			}
		});

		//Lancement du service slacklet(Connectez-vous à Slack)
		slackService.start();

	}

}

Code source de cet exemple

Exemple d'exécution

Si vous dites "Bonjour" sur le Slack, il sera renvoyé en écho du BOT. ex00_01.png

La description

Créez ** SlackletService ** comme ci-dessus et ajoutez ** Slacklet ** avec ** # addSlacklet **. ** Slacklet ** est comme ** Servlet **, remplaçant les méthodes requises.

** # onMessagePosted ** est appelé lorsqu'un utilisateur publie un message sur une chaîne. Si vous souhaitez répondre en limitant le canal, identifiez le nom du canal et répondez comme dans l'exemple ci-dessus.

2. Recevoir un message direct

Remplacez ** Slacklet # onDirectMessagePosted ** si vous souhaitez recevoir des messages directs publiés sur le BOT par l'utilisateur:

@Override
public void onDirectMessagePosted(SlackletRequest req, SlackletResponse resp) {
	//Un message direct adressé à BOT a été publié

	String content = req.getContent();

	//Obtenir la mention de l'utilisateur qui a envoyé le message
	String mention = req.getUserDisp();

	//Répondre à l'utilisateur qui a envoyé le message direct
	resp.reply(mention + "Merci pour votre message direct.\n「" + content + "J'ai dit");
}

Code source de cet exemple

Exemple d'exécution

Si vous envoyez un message direct au BOT comme indiqué ci-dessous, vous recevrez une réponse.

ex01_00.png

3. 3. Réagit uniquement lorsque @ mentionné

Utilisateur du message Mentionnez le BOT, par exemple, si vous souhaitez recevoir un ** "@ smilebot Hello" ** et publier un message remplacera le ** Slacklet # onMentionedMessagePosted ** comme suit:

@Override
public void onMentionedMessagePosted(SlackletRequest req, SlackletResponse resp) {
	//Un message avec une mention à ce BOT a été publié sur une chaîne(Exemple "@smilebot Bonjour ")

	String content = req.getContent();

	String mention = req.getUserDisp();
	resp.reply("Bonjour," + mention + "M. "" + content + "J'ai dit.");
}

Code source de cet exemple

Exemple d'exécution

Vous ne recevrez une réponse que lorsque vous mentionnerez le nom du BOT avec ** @username **.

ex01_01_mentioned.png

4. Envoyer un message direct à l'utilisateur

Ceci est un exemple d'envoi d'un message direct du BOT à l'utilisateur. Il est utilisé lorsque vous souhaitez d'abord envoyer le message à partir du BOT au lieu de répondre au message de l'utilisateur.


public class Example02 {

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

		String botToken ="Jeton d'API obtenu"; 

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

		//Envoyer un message direct (pas une réponse) à l'utilisateur
		String userName = "riversun";
		slackService.sendDirectMessageTo(userName, "Bonjour ~");

		//Connexion d'extrémité avec mou
		slackService.stop();

	}

}

Code source de cet exemple

Exemple d'exécution

Une fois exécuté, vous recevrez un message direct de BOT comme celui-ci.

ex02_00_direct_left.png

ex02_01_direct.png

5. Envoyer un message au canal spécifié

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();

		//Envoyer un message (pas une réponse) à une chaîne
		String channelName = "random";
		slackService.sendMessageTo(channelName, "canal aléatoire de tout le monde, Bonjour!");

		slackService.stop();

	}

}

Code source de cet exemple

Exemple d'exécution

** #random ** BOT envoie un message à la chaîne. ex03.png

6. Utiliser la fonction de session (contexte spécifique à l'utilisateur)

Slacklet est conçu pour le multi-utilisateur. Permet à un utilisateur d'interagir avec le BOT tandis que l'autre utilisateur interagit indépendamment. Pour ce faire, il existe une fonction de session permettant de conserver différents états pour chaque utilisateur. Comme avec le servlet, ** SlackletRequest .getSession ** obtient la session et y conserve l'état.


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

	String content = req.getContent();

	//Obtenir une session (la session est unique à chaque utilisateur)
	SlackletSession session = req.getSession();

	//Obtenez un entier pour compter le nombre de remarques de la session. Si rien n'est encore entré, la valeur par défaut est 1.
	Integer num = (Integer) session.getAttribute("num", 1);

	resp.reply(req.getUserDisp() + "Est" + num + "La deuxième fois "" + content + "J'ai dit.");

	//Mettre à jour la session en incrémentant le nombre de fois
	num++;
	session.setAttribute("num", num);

}

Code source de cet exemple

Exemple d'exécution

Il semble que le dialogue se poursuive car il se souvient du nombre de conversations dans la session. Il est stocké uniquement pour chaque utilisateur. ex04.png

Conseils d'expansion

[** Persistance de session **] ** Le contexte ** est absolument nécessaire lors de la mise en œuvre d'un dialogue à part entière. ** Contexte ** contient le statut interactif, divers statuts, etc.

L'implémentation par défaut de Slacklet conserve la session en mémoire, donc vous l'oubliez lorsque vous quittez le programme. Si vous souhaitez conserver la session, implémentez SletPersistManager qui inclut le code de persistance. Ensuite, définissez-le avec ** SlackletService # setSessionPersistenceManager **.

[** Assistance multi-utilisateurs **] Chaque utilisateur est traité dans un thread séparé afin que le dialogue avec plusieurs utilisateurs puisse être traité en même temps, mais je pense qu'il est préférable d'ajuster la taille de l'exécutable et du pool de threads de manière appropriée en fonction du nombre d'utilisateurs gérés par BOT.

[** Afficher le journal **] Si vous procédez comme suit, le journal sera envoyé vers stderr

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

[** Expansion plus profonde **] Ci-dessous Slacklet se trouve une extension de l 'API Simple Slack. Si vous souhaitez approfondir, vous pouvez vous référer à Simple Slack API.

Recommended Posts

Facile à créer Slack Bot avec Java
Facile à créer LINE BOT avec Java Servlet
Comment créer un robot Discord (Java)
Faites un blackjack avec Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Java - Comment créer JTable
Refactoring: faire du Blackjack en Java
J'ai essayé de créer une fonction de connexion avec Java
Un moyen simple de vérifier la liste des méthodes / champs dans Java REPL
Je voulais juste créer une propriété réactive en Java
J'ai créé un client RESAS-API en Java
Multithread pour s'adapter au modèle [Java]
Comment créer un conteneur Java
SpringBoot + Redis Démo facile à faire
Comment apprendre JAVA en 7 jours
Enregistrer la sortie dans un fichier en Java
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Essayez d'implémenter Yuma en Java
Comment créer un tableau Java
Comment concaténer des chaînes avec Java
Facile à créer LINE BOT avec Java Servlet Partie 2: J'ai essayé des messages image et des modèles
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Référence Java à comprendre dans la figure
Essayez d'implémenter l'ajout n-aire en Java
Comment faire une conversion de base en Java
Remplacez List <Optional <T >> par Optional <List <T >> en Java
Convertir des fichiers SVG en fichiers PNG en Java
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
[Java] Les débutants veulent faire des rencontres. 1er
Publier sur Slack à partir de Play Framework 2.8 (Java)
Comment obtenir la date avec Java
Faites TensorFlow en Java. C'est facile, cependant. .. .. ..
Ajouter des notes de bas de page aux documents Word en Java
Migrons pour rendre Java plus confortable
[Java Bronze] 5 problèmes à garder à l'esprit
Facile à parcourir avec les expressions régulières Java
Exemple pour décompresser le fichier gz en Java
De Java à C et de C à Java dans Android Studio
Ajouter l'attribut SameSite au cookie en Java
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
Deux façons de démarrer un thread en Java + @
J'ai essayé de faire une authentification de base avec Java
Partition en Java
Je souhaite envoyer un e-mail en Java.
Comment afficher une page Web en Java
CORBA semble avoir été supprimé dans Java SE 11. .. ..
Code pour échapper aux chaînes JSON en Java
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Essayez de créer un babillard en Java
Changements dans Java 11
Comportement incrémenté Essayez de créer un problème Java TypeScript 3-4
Janken à Java
Comment obtenir une classe depuis Element en Java
Il ne semble pas y avoir d'autre-si en java
Opération de chaîne de caractères Essayez de changer le problème Java en TypeScript 9-3
rsync4j --Je veux toucher rsync en Java.