[JAVA] Un mémorandum de création d'un bot qui RTs automatiquement et tweets automatiquement sur Twitter4J

Bonjour, est une personne de technologie en charge de le bot de support de sucre Haato. "Shuga Heart" est le surnom de "Sato Shin", le personnage qui apparaît dans les Idol Master Cinderella Girls.

image.png

Le bot Shuga Heart Support est un bot non officiel pour soutenir le cœur de Sato.

Depuis que j'ai créé un programme de RT et de tweets automatiques sur Twitter4J, je publierai un article afin de pouvoir l'utiliser comme référence pour d'autres Ps ou quand je le ferai plus tard.

Quoi faire

D'une connaissance qui dirige le bot "Je veux que vous diffusiez automatiquement les tweets contenant les mots" #Satoshin "et" Shugaha "." "Je veux que vous tweetiez l'image juste à 8h10" Quelqu'un m'a demandé.

Le premier peut être facilement réalisé en utilisant RTbot et le second en utilisant Botbird. ・ RTbot ne fonctionne pas bien ・ Je veux une fonction autre que la recherche et la RT (liste noire, etc.) ・ Il est difficile d'enregistrer les tweets dans Botbird un par un. ・ Je déteste avoir des URL étranges lorsque je tweet des images ・ Je n'aime pas utiliser plusieurs services Web Pour cette raison, j'ai décidé de créer mon propre bot. ~~ C'est un problème, mais ce n'est pas bon ~~

Comment faire un bot

Le flux général est d'enregistrer l'API → écrire le code.

Enregistrez l'API

Pour l'enregistrement de l'API, voir ici ou ici ou google .. Bien qu'il soit écrit en anglais, j'ai fait de mon mieux pour écrire quelque chose comme "Je veux faire un robot pour faire de Shugaha une fille de Cendrillon et faire quelque chose comme ce que j'ai écrit dans ↑". J'ai réussi à obtenir un anglais de niveau secondaire, donc je n'ai pas eu à être trop préparé. Au pire, je pense que je devrais faire de mon mieux avec la traduction Google ou quelque chose comme ça.

J'aurais dû prendre une photo de texte pour l'instant ...

Faire un bot

Je gère beaucoup Java au travail, j'ai donc décidé de le créer en utilisant Twitter4J, qui peut gérer l'API Twitter depuis Java.

無題.png

L'utilisation est écrite sur la première page, et toutes les opérations simples sont écrites dans Exemple de code, alors jetez un œil là-bas. C'est une bibliothèque qui existe depuis 310 ans, donc si vous la recherchez sur Google, vous pouvez obtenir autant d'informations que vous le souhaitez.

Tweets de recherche et de RT

Vous pouvez obtenir les résultats de la recherche des tweets avec le code suivant.

SearchTweet.java


Twitter twitter = TwitterFactory.getSingleton();
Query query = new Query(searchWord);
query.setCount(count);
QueryResult result = null;
try {
	result = twitter.search(query);
//	System.out.println("J'ai cherché des tweets.");
} catch (TwitterException e) {
	e.printStackTrace();
	System.err.println("Échec de la recherche de tweets.");
}

Vous pouvez modifier le nombre de tweets recherchés avec Query # setCount (int). La limite supérieure est de 100. Normalement, la limite supérieure est de 100, mais il semble que vous pouvez obtenir jusqu'à 1500 en spécifiant la page. Il est écrit en ici. Je ne l'ai pas mentionné car je pensais que je n'avais pas besoin de revenir sur ce point pour rechercher le bot d'assistance.

Vous pouvez également RT à partir de QueryResult avec le code suivant. (Je fais aussi des likes automatiques)

RTTweet.java


Twitter twitter = TwitterFactory.getSingleton();
for (Status status : result.getTweets()) {
	long tweetId = status.getId();

//	if (!isAllowed(status)) {
//		continue;
//	}

	try {
		twitter.createFavorite(tweetId);
	} catch (TwitterException e) {
	//	e.printStackTrace();
	}

	try {
		twitter.retweetStatus(tweetId);
		System.out.println("RT les tweets suivants");
		System.out.println("tweetID:" + tweetId);
		System.out.println(status.getUser().getName() + ":" + status.getText());
		return true;
	} catch (TwitterException e) {
	//	e.printStackTrace();
	}

	//Attendez 1 seconde pour ne pas vous fâcher avec l'API Twitter
	Thread.sleep(1000);
}

Il sera affiché sur la console comme ceci.

RT les tweets suivants
tweetID:1065539453798637568
Sushiko?illustrator?:Dereste Shugaha! (Photo précédente)
#Dereste#Shin Sato https://t.co/EUdJBZQ0YQ

En passant, si vous essayez de RT / aimer un tweet que vous avez déjà RT / aimé, une exception se produira. Si vous le tournez automatiquement, cela se produira fréquemment, alors je le serre. Il semble que vous puissiez voir si RT a été complété avec Status # isRetweetedByMe (), mais si vous apportez Status à partir des résultats de recherche de tweet, cela ne fonctionne pas bien. (Veuillez me dire comment le faire > <)

C'était suffisant quand j'étais RT le tweet avec "#Sato Shin", mais quand j'ai commencé RT le tweet avec "Shugaha", le bot est devenu incontrôlable, j'ai donc écrit le code suivant avant RT Je l'ai mis.

	//Lisez des tweets qui ne sont pas des tweets avec des images
	if (status.getMediaEntities().length == 0) {
		continue;
	}

	//Je joue aussi la lèvre
	if (status.getInReplyToScreenName() != null) {
		continue;
	}

Serpent: jouer un tweet spécifique

Dans isAllowed (Status) qui a été commenté dans le code de RTTweet.java précédemment, jackson est utilisé pour lire ou non les tweets.

SearchTweet#isAllowed(Status)


if (status.isRetweet()) {
	status = status.getRetweetedStatus();
}

String user = status.getUser().getScreenName();
for (JsonNode node : blackListUtil.getNGUsers()) {
	if (user.equals(node.asText())) {
		return false;
	}
}

long tweetId = status.getId();
for (JsonNode node : blackListUtil.getNGTweetId()) {
	if (tweetId == node.asLong()) {
		return false;
	}
}

String tweetText = status.getText();
for (JsonNode node : blackListUtil.getNGWord()) {
	if (tweetText.contains(node.asText())) {
		return false;
	}
}

return true;

BlackListUtil.java


	private ObjectMapper mapper;
	private JsonNode root;

	public BlackListUtil() {
		mapper = new ObjectMapper();
		try {
			root = mapper.readTree(new File("WEB-INF/blacklist.json"));
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public JsonNode getNGUsers() {
		return root.get("users");
	}

	public JsonNode getNGTweetId() {
		return root.get("tweetId");
	}

	public JsonNode getNGWord() {
		return root.get("word");
	}

L'utilisateur NG, l'ID de tweet NG, le mot NG sont définis dans le fichier JSON, l'utilisateur NG est lui-même et le mot NG est "R18" ou "NSFW". C'est un robot pour tous les âges, donc ça ne peut pas être aidé. (À l'origine, j'ai ajouté des tweets NSFW à l'ID de tweet NG, mais je ne l'utilise pas maintenant)

Soit dit en passant, ce sont les 3 premières lignes de SearchTweet # isAllowed (Status), mais lors de la recherche de tweets, il semble que non seulement le tweet de la source RT mais aussi "un autre utilisateur a RT ce tweet" est inclus dans le statut, donc la source RT Le tweet, l'identifiant du tweet et l'utilisateur sont différents et peuvent passer. Dans ce cas, j'essaye d'obtenir le tweet original de RT.

Tweet l'image

À 8h10, je tweete l'image suivante.

無題2.png

Vous pouvez tweeter une image avec le code suivant.

TweetSender.java


Twitter twitter = TwitterFactory.getSingleton();

StatusUpdate update = new StatusUpdate(text);
update = update.media(new File(picPath));

Status status = twitter.updateStatus(update);

Les images sont enregistrées ensemble dans un dossier approprié et les noms de fichier des images tweetées sont enregistrés dans un tableau dans le fichier JSON afin que les images ne se chevauchent pas.

python


//Apportez une liste de noms de fichiers image dans le répertoire
File dir = new File(folderPath);
File[] fileList = dir.listFiles();

//Apportez une liste de json et faites-la correspondre avec des images inutilisées
String picPath = null;
out : for (File file : fileList) {
	for (JsonNode node : root.get("tweetedFile")) {
		if (node.asText().equals(file.getName())) {
			continue out;
		}
	}

	if (used) {
		
	}

	picPath = file.toString();

	//Ecrire à json
	ObjectNode objectNode = root.deepCopy();
	ArrayNode arrayNode = root.withArray("tweetedFile");
	arrayNode.add(file.getName());
	objectNode.set("tweetedFile", arrayNode);

	ObjectWriter writer = mapper.writer();
	writer.writeValue(Paths.get("WEB-INF/picUtil.json").toFile(), objectNode);
//	System.out.println("picUtil.json sortie OK!");
	}

	break;
}

return picPath;

Opération

Tout ce que vous avez à faire est de créer le tweet RT / automatique ci-dessus à un moment précis. Par exemple, dans le cas du bot Shuga Heart Support, il tweete automatiquement à 8h10, puis effectue une RT automatique environ toutes les 30 minutes et s'arrête vers 25h00. (Code omis)

en conclusion

Le code est peut-être un peu pauvre, mais même les débutants en Java peuvent créer des bots en regardant des échantillons et en les recherchant sur Google, de sorte que d'autres idoles P peuvent également créer des bots et animer le quartier de l'idole en charge. S'il vous plaît essayez. Si possible, veuillez voter pour ** Shin Sato pour l'élection générale de Cinderella Girl et Sanan Miyoshi, qui est en charge de la technologie pour l'élection générale de voix. ** **

image.png

Recommended Posts

Un mémorandum de création d'un bot qui RTs automatiquement et tweets automatiquement sur Twitter4J
[Ruby on Rails] Un mémorandum de modèles de mise en page
[Rails] Volume qui affiche les favoris et une liste de favoris