Versuchte Mastodons Toot- und Streaming-API in Java

Was ich versucht habe

Code

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

Versuchte Mastodons Toot- und Streaming-API in Java
Ich habe versucht, Metaprogrammierung mit Java
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Zabbix API in Java
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ich habe versucht, Java Silver in 2 Wochen zu bestehen, ohne Java zu kennen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe ein Roulette in Java gemacht.
Java Stream API in 5 Minuten
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Objektorientiertes Kind !? Ich habe Deep Learning mit Java ausprobiert (Testversion)
Was ich in Java gelernt habe (Teil 4) Bedingte Verzweigung und Wiederholung
Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Aufrufen und Verwenden der API in Java (Spring Boot)
[Java] Ich habe versucht, den öffentlichen und nicht angegebenen Feldzugriffsmodifikator aufzurufen. [Eclipse]
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
Ich habe einen RESAS-API-Client in Java erstellt
Generieren Sie AWS Signature V4 in Java und fordern Sie die API an
Ich habe eine E-Mail in Java gesendet
Ich habe PHP- und Java-Konstruktoren verglichen
Was ich in Java gelernt habe (Teil 1) Java-Entwicklungsablauf und Überblick
Ich habe ein PDF mit Java erstellt.
Beispiel für Codierung und Decodierung in Java
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Generieren Sie die CloudStack-API-URL in Java
Ich habe Gordobachs Theorem in Java geschrieben
Ich habe versucht, Domino11 in CentOS7 zu integrieren
StringBuffer- und StringBuilder-Klasse in Java
Ich habe das Java-Framework "Quarkus" ausprobiert.
Treffen Sie Zaims API (OAuth 1.0) in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Verstehe gleich und hashCode in Java
Ich habe eine Anmerkung in Java gemacht.
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
JPA (Java Persistence API) in Eclipse
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe Java und Rubys FizzBuzz verglichen.
Hallo Welt in Java und Gradle
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe die COTOHA-API-Syntaxanalyse 100 Mal in Java aufgerufen, um die Leistung zu messen.