[JAVA] Ein Memorandum über die Erstellung eines Bots, der automatisch RTs erstellt und auf Twitter4J automatisch twittert

Hallo, ist eine Person der Technologie verantwortlich für Zucker Haato Support Bot. "Shuga Heart" ist der Spitzname von "Sato Shin", der Figur, die in den Idol Master Cinderella Girls vorkommt.

image.png

Shuga Heart Support Bot ist ein inoffizieller Bot, der Satos Herz unterstützt.

Da ich ein Programm für automatische RT und automatisches Twittern auf Twitter4J erstellt habe, werde ich einen Artikel veröffentlichen, damit er als Referenz für andere Ps oder als Referenz verwendet werden kann, wenn ich ihn später erstelle.

Was zu machen

Von einem Bekannten, der den Bot betreibt "Ich möchte, dass Sie automatisch RT-Tweets mit den Wörtern" #Satoshin "und" Shugaha "senden." "Ich möchte, dass du das Bild erst um 8:10 twitterst." Ich wurde gefragt.

Ersteres kann leicht mit RTbot und letzteres mit Botbird erreicht werden. ・ RTbot funktioniert nicht gut ・ Ich möchte eine andere Funktion als nur Suche und RT (schwarze Liste usw.) ・ Es ist schwierig, Tweets einzeln in Botbird zu registrieren. ・ Ich hasse es, seltsame URLs zu haben, wenn ich Bilder twittere ・ Ich benutze nicht gerne mehrere Webdienste Aus diesem Grund habe ich beschlossen, meinen eigenen Bot zu machen. ~~ Es ist ein Ärger, aber es ist nicht gut ~~

Wie man einen Bot macht

Der allgemeine Ablauf besteht darin, die API zu registrieren → den Code zu schreiben.

Registrieren Sie die API

Informationen zur API-Registrierung finden Sie unter hier oder hier oder bei Google .. Obwohl es auf Englisch geschrieben ist, habe ich mein Bestes versucht, etwas wie "Ich möchte einen Bot machen, um Shugaha zu einem Aschenputtel-Mädchen zu machen und so etwas wie das zu tun, was ich in ↑ geschrieben habe" zu schreiben. Ich habe es geschafft, Englisch auf Highschool-Niveau zu bekommen, also musste ich nicht zu gut vorbereitet sein. Im schlimmsten Fall denke ich, ich sollte mein Bestes mit Google Übersetzung oder so etwas tun.

Ich hätte vorerst eine Textaufnahme machen sollen ...

Mach einen Bot

Ich arbeite viel mit Java bei der Arbeit, deshalb habe ich beschlossen, es mit Twitter4J zu erstellen, das die Twitter-API von Java aus verarbeiten kann.

無題.png

Die Verwendung ist auf der obersten Seite beschrieben, und alle einfachen Vorgänge sind in Codebeispiel geschrieben. Schauen Sie also bitte dort nach. Es ist eine Bibliothek, die es schon seit 310 Jahren gibt. Wenn Sie also googeln, können Sie so viele Informationen erhalten, wie Sie möchten.

Such- und RT-Tweets

Sie können die Suchergebnisse von Tweets mit dem folgenden Code erhalten.

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("Ich habe nach Tweets gesucht.");
} catch (TwitterException e) {
	e.printStackTrace();
	System.err.println("Suche nach Tweets fehlgeschlagen.");
}

Sie können die Anzahl der mit Query # setCount (int) durchsuchten Tweets ändern. Die Obergrenze liegt bei 100. Normalerweise liegt die Obergrenze bei 100, aber es scheint, dass Sie durch Angabe der Seite bis zu 1500 erreichen können. Es ist in [hier] geschrieben (http://www.mwsoft.jp/programming/java/twitter4j.html). Ich habe es nicht erwähnt, weil ich dachte, ich müsste nicht zu diesem Punkt zurückkehren, um nach dem Support-Bot zu suchen.

Sie können RT auch von QueryResult mit dem folgenden Code ausführen. (Ich mache auch automatische Likes)

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 die folgenden Tweets");
		System.out.println("tweetID:" + tweetId);
		System.out.println(status.getUser().getName() + ":" + status.getText());
		return true;
	} catch (TwitterException e) {
	//	e.printStackTrace();
	}

	//Warten Sie 1 Sekunde, damit Sie sich nicht über die Twitter-API ärgern
	Thread.sleep(1000);
}

Es wird wie folgt auf der Konsole angezeigt.

RT die folgenden Tweets
tweetID:1065539453798637568
Sushiko?illustrator?:Dereste Shugaha! (Letztes Bild)
#Dereste#Shin Sato https://t.co/EUdJBZQ0YQ

Übrigens, wenn Sie versuchen, einen Tweet, den Sie bereits RT / gemocht haben, zu RT / mögen, tritt eine Ausnahme auf. Wenn Sie es automatisch drehen, tritt es häufig auf, also drücke ich es. Es scheint, dass Sie sehen können, ob RT mit Status # isRetweetedByMe () abgeschlossen wurde, aber wenn Sie Status aus den Tweet-Suchergebnissen holen, funktioniert dies nicht gut. (Bitte sag mir, wie es geht > <)

Dies war genug, als ich RT der Tweet mit "#Sato Shin" war, aber als ich RT den Tweet mit "Shugaha" startete, geriet der Bot außer Kontrolle und ich schrieb den folgenden Code vor RT Ich habe es reingelegt.

	//Spielen Sie Tweets ab, die keine Tweets mit Bildern sind
	if (status.getMediaEntities().length == 0) {
		continue;
	}

	//Ich spiele auch die Lippe
	if (status.getInReplyToScreenName() != null) {
		continue;
	}

Schlange: Spielen Sie einen bestimmten Tweet

In isAllowed (Status), das zuvor im Code von RTTweet.java auskommentiert wurde, wird Jackson verwendet, um Tweets abzuspielen oder nicht abzuspielen.

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");
	}

NG-Benutzer, NG-Tweet-ID, NG-Wort werden in der JSON-Datei festgelegt, NG-Benutzer ist er selbst und NG-Wort ist "R18" oder "NSFW". Es ist ein Bot für alle Altersgruppen, daher kann man ihm nicht helfen. (Ursprünglich habe ich der NG-Tweet-ID NSFW-Tweets hinzugefügt, aber ich verwende sie jetzt nicht.)

Übrigens sind die ersten 3 Zeilen von SearchTweet # isAllowed (Status), aber bei der Suche nach Tweets scheint nicht nur der RT-Quell-Tweet, sondern auch "ein anderer Benutzer RT dieser Tweet" im Status enthalten zu sein, also die RT-Quelle Der Tweet und die Tweet-ID sowie der Benutzer sind unterschiedlich und können durchrutschen. In diesem Fall versuche ich, den RT-Original-Tweet zu erhalten.

Tweet das Bild

Um 8:10 twittere ich das folgende Bild.

無題2.png

Sie können ein Bild mit dem folgenden Code twittern.

TweetSender.java


Twitter twitter = TwitterFactory.getSingleton();

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

Status status = twitter.updateStatus(update);

Die Bilder werden zusammen in einem geeigneten Ordner gespeichert, und die Dateinamen der getwitterten Bilder werden in einem Array in der JSON-Datei gespeichert, damit sich die Bilder nicht überlappen.

python


//Bringen Sie eine Liste der Bilddateinamen in das Verzeichnis
File dir = new File(folderPath);
File[] fileList = dir.listFiles();

//Bringen Sie eine Liste von json mit und ordnen Sie sie nicht verwendeten Bildern zu
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();

	//Schreiben Sie an 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-Ausgabe OK!");
	}

	break;
}

return picPath;

Operation

Alles was Sie tun müssen, ist den obigen automatischen RT / automatischen Tweet zu einem bestimmten Zeitpunkt zu erstellen. Im Fall des Shuga Heart Support-Bots wird beispielsweise automatisch um 8:10 Uhr getwittert, danach alle 30 Minuten automatisch RTs gesendet und gegen 25:00 Uhr gestoppt. (Code weggelassen)

abschließend

Der Code mag ein wenig schlecht sein, aber selbst Anfänger von Java können Bots erstellen, während sie sich Beispiele ansehen und googeln. Daher sollten andere Idol-Ps auf jeden Fall Bots erstellen und die Nachbarschaft des verantwortlichen Idols beleben. Bitte versuche. Wenn möglich, stimmen Sie bitte für ** Shin Sato bei den allgemeinen Wahlen zum Cinderella Girl und für Sanan Miyoshi, der für die Technologie bei den allgemeinen Wahlen verantwortlich ist. ** ** **

image.png

Recommended Posts

Ein Memorandum über die Erstellung eines Bots, der automatisch RTs erstellt und auf Twitter4J automatisch twittert
[Ruby on Rails] Ein Memorandum mit Layoutvorlagen