Es scheint, dass es eine einfache Bibliothek gibt, die mit der REST-API namens Jersey gespielt werden kann, also habe ich sie verwendet. Um ehrlich zu sein, habe ich versucht, sie richtig zusammenzuhalten, also spiele ich herum, ohne die Details zu kennen.
Die Verbindungsinstanz ist mstdn.jp, und die Client-ID / das Geheimnis und das persönliche Zugriffstoken werden mit Hilfe von Mastodon.py im Voraus vorbereitet. (Da es schwierig war, den Authentifizierungscode zu schreiben ... werde ich es eines Tages versuchen) Es scheint, dass Streaming-Verbindung und Toot selbst mit Zugriffstoken hergestellt werden können.
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import org.glassfish.jersey.media.sse.EventInput;
import org.glassfish.jersey.media.sse.InboundEvent;
import org.glassfish.jersey.media.sse.SseFeature;
public class MainWindow extends JFrame{
private static final String APP_NAME = "TestMastodonClient";
private static final int APP_WIDTH = 640;
private static final int APP_HEIGHT = 480;
//Vorerst mstdn.Ich habe es mit jp gemacht, ändere es entsprechend, wenn ich es mit anderen Instanzen mache
private static final String HOST_MASTODON = "https://mstdn.jp";
//Kunden-ID im Voraus/Werde geheim und zugänglich(Ich bin Mastodon.Ich habe es mit py gemacht)
private static final String MASTODON_ACCESSTOKEN_TOKEN = "Legen Sie hier Ihr eigenes Access Token ab";
JComboBox<String> visibilityComboBox; //Umfang der Veröffentlichung
JTextField tootField;
JButton tootButton;
Client client;
public MainWindow() {
setTitle(APP_NAME);
setSize(APP_WIDTH, APP_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// TLSv1.Ich konnte keine Verbindung zu Streaming herstellen, ohne 2 zu verwenden, also habe ich es geändert.
System.out.println("HTTPS:" + System.getProperty("https.protocols"));
System.setProperty("https.protocols", "TLSv1.2");
System.out.println("HTTPS:" + System.getProperty("https.protocols"));
client = ClientBuilder.newBuilder().register(SseFeature.class).build();
Container container = getContentPane();
JPanel parentPanel = new JPanel();
container.add(parentPanel);
visibilityComboBox = new JComboBox<String>();
visibilityComboBox.addItem("public"); //Veröffentlichung(Komm raus in Union TL)
visibilityComboBox.addItem("unlisted");//Veröffentlichung(Erscheint nicht in Union TL)
visibilityComboBox.addItem("private"); //Privat(Ich kann nur mich und meine Anhänger sehen)
visibilityComboBox.addItem("direct"); //ich verstehe nicht(Ist es wie ein DM auf Twitter?)
parentPanel.add(visibilityComboBox);
tootField = new JTextField(10); //Toot besiegen Für die Eingabe von Zeichenfolgen
parentPanel.add(tootField);
tootButton = new JButton("Toot");
tootButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String msg = tootField.getText();
System.out.println("Toot: " + msg);
//Es scheint einen Header mit Access Token zu machen
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
headers.putSingle("Authorization", "Bearer " + MASTODON_ACCESSTOKEN_TOKEN);
//Versetzen Sie den Text in den Status und den Offenlegungsbereich der Beiträge in Sichtbarkeit
Entity<Form> entity = Entity.entity(new Form().param("status", msg)
.param("visibility",
(String) visibilityComboBox.getSelectedItem()),
MediaType.APPLICATION_FORM_URLENCODED_TYPE);
//werfen
String result = client.target(HOST_MASTODON)
.path("/api/v1/statuses")
.request()
.headers(headers)
.post(entity, String.class);
System.out.println("----------Ausführungsergebnis----------");
System.out.println(result);
//tootField.setText(""); //Wenn Sie das Eingabefeld nach Toot leeren möchten, tun Sie es
}
});
parentPanel.add(tootButton);
//Ich weiß nicht, ob das in Ordnung ist, aber vorerst habe ich Streaming in einem anderen Thread aufgenommen
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("----------Streaming Thread----------");
//Zugriffstoken vorbereiten
MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
headers.putSingle("Authorization", "Bearer " + MASTODON_ACCESSTOKEN_TOKEN);
headers.putSingle("Content-Type", "application/json; charset=UTF-8");
WebTarget target = client.target(HOST_MASTODON);
//Stellen Sie eine Verbindung zu Union TL her
EventInput eventInput = target.path("/api/v1/streaming/public")
.request()
.headers(headers)
.get(EventInput.class);
//Lassen Sie einfach die Konsole weiter empfangen
//JSON Eine anständige Zeichenfolge wird ausgegeben, daher muss ich sie später analysieren
while (!eventInput.isClosed()) {
final InboundEvent inboundEvent = eventInput.read();
if (inboundEvent == null) {
// connection has been closed
System.out.println("----------End of Streaming Thread----------");
break;
}
System.out.println("----------Response----------");
System.out.println(inboundEvent.getName() + "; ");
System.out.println(inboundEvent.readData(String.class));
}
}
}).start();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MainWindow().setVisible(true);
}
});
}
}
Wenn Sie die Union TL erhalten, fließt sie mit einer enormen Geschwindigkeit, sodass es möglicherweise einfacher ist, zu bestätigen, ob Sie sie mit der Home TL versuchen. Nachtrag: ~~ Während Sie weiterhin Streaming JSON in Thread am Ende des obigen Codes abrufen, [15.5.2. Asynchrone SSE-Verarbeitung mit EventSource](https://jersey.java.net/documentation/latest/ Wie in sse.html # d0e12060) gezeigt, scheint es, dass es als onEvent definiert werden kann, also scheint das besser zu sein ~~ Aufgrund der unterschiedlichen Suche scheint EventSource nicht in der Lage zu sein, eine Verbindung mit einem Anforderungsheader herzustellen. Schreiben Sie daher entweder den Code, um ein Ereignis aus der obigen While-Funktion zu generieren, oder schreiben Sie den Code, um den Header mit AccessToken in EventSource einzufügen. Es scheint, dass es korrespondieren wird
Recommended Posts