Essayé l'API Toot et Streaming de Mastodon en Java

Ce que j'ai essayé

--Mastodon semble être capable de Toot à partir de son propre code comme Twitter --Il semble que Python et Ruby aient des bibliothèques, mais je ne trouve pas Java. ――J'ai essayé de le battre et j'ai pu diffuser Toot et Union TL

code

Il semble qu'il existe une bibliothèque facile à utiliser avec l'API REST appelée Jersey, alors je l'ai utilisée. Pour être honnête, j'ai essayé de les coller correctement, donc je déconne sans connaître les détails.

L'instance de connexion est mstdn.jp, et l'id / secret client et le jeton d'accès personnel sont préparés à l'avance à l'aide de Mastodon.py. (Comme il était difficile d'écrire le code d'authentification ... je vais l'essayer un jour) Il semble que la connexion en streaming et Toot lui-même puissent être effectués avec un jeton d'accès.

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;

  //Pour le moment mstdn.Je l'ai fait avec jp, changez-le de manière appropriée lorsque vous le faites avec d'autres instances
  private static final String HOST_MASTODON = "https://mstdn.jp";
  
  //Identifiant client à l'avance/Obtenez le secret et l'accès(Je suis Mastodon.Je l'ai fait avec py)
  private static final String MASTODON_ACCESSTOKEN_TOKEN = "Mettez votre propre jeton d'accès ici";

  JComboBox<String> visibilityComboBox; //Portée de la publication
  JTextField tootField;
  JButton tootButton;
  
  Client client;
  
  public MainWindow() {
    setTitle(APP_NAME);
    setSize(APP_WIDTH, APP_HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    // TLSv1.Je ne pouvais pas me connecter à Streaming sans utiliser 2, alors je l'ai changé.
    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");  //Libération(Sortez à Union TL)
    visibilityComboBox.addItem("unlisted");//Libération(N'apparaît pas dans Union TL)
    visibilityComboBox.addItem("private"); //privé(Je ne peux que me voir et mes followers)
    visibilityComboBox.addItem("direct");  //Je ne comprends pas(Est-ce comme un DM sur Twitter?)
    parentPanel.add(visibilityComboBox);
    
    tootField = new JTextField(10); //Defeat Toot pour l'entrée de chaîne de caractères
    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);
        
        //Il semble faire un en-tête avec Access Token
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        headers.putSingle("Authorization", "Bearer " + MASTODON_ACCESSTOKEN_TOKEN);
        
        //Mettre le texte en état et la plage de divulgation des articles en visibilité
        Entity<Form> entity = Entity.entity(new Form().param("status", msg)
                                            .param("visibility", 
                                                    (String) visibilityComboBox.getSelectedItem()), 
                                                    MediaType.APPLICATION_FORM_URLENCODED_TYPE);

        //jeter
        String result = client.target(HOST_MASTODON)
                              .path("/api/v1/statuses")
                              .request()
                              .headers(headers)
                              .post(entity, String.class);
        
        System.out.println("----------Résultat d'exécution----------");
        System.out.println(result);
        
        //tootField.setText(""); //Si vous voulez vider le champ de saisie après Toot, faites-le
      }
    });
    parentPanel.add(tootButton);
    
    //Je ne sais pas si ça va, mais pour le moment, j'ai repris Streaming dans un autre fil
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("----------Streaming Thread----------");

        //Préparer le jeton d'accès
        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);

        //Connectez-vous à Union TL
        EventInput eventInput = target.path("/api/v1/streaming/public")
                                      .request()
                                      .headers(headers)
                                      .get(EventInput.class);
        
        //Laissez simplement la console continuer à recevoir
        //JSON Une chaîne de caractères décente sort, donc je dois l'analyser plus tard
        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);
      }
    });
  }
}

Lorsque vous recevez le Union TL, il coule à un rythme énorme, il peut donc être plus facile de confirmer si vous l'essayez avec Home TL. Addendum: ~~ Tout en continuant à récupérer Streaming JSON dans Thread à la fin du code ci-dessus, [15.5.2. Traitement SSE asynchrone avec EventSource](https://jersey.java.net/documentation/latest/ Comme indiqué dans sse.html # d0e12060), il semble qu'il puisse être défini comme onEvent, donc cela semble être mieux ~~ En raison de diverses recherches, EventSource semble ne pas pouvoir se connecter avec un en-tête de demande tel quel, alors écrivez le code pour générer un événement à partir du While ci-dessus, ou écrivez le code pour placer l'en-tête avec AccessToken dans EventSource d'une manière ou d'une autre. Il semble que cela correspondra

Recommended Posts

Essayé l'API Toot et Streaming de Mastodon en Java
J'ai essayé la métaprogrammation avec Java
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
J'ai essayé le nouveau yuan à Java
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de créer une compétence Alexa avec Java
API Zabbix en Java
J'ai essayé d'implémenter la notification push Firebase en Java
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
J'ai essayé d'utiliser l'instruction Extended for en Java
J'ai essayé de passer Java Silver en 2 semaines sans connaître Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai fait une roulette à Java.
API Java Stream en 5 minutes
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
J'ai essayé de résumer les bases de kotlin et java
Enfant orienté objet!? J'ai essayé le Deep Learning avec Java (édition d'essai)
Ce que j'ai appris en Java (partie 4) Branchement conditionnel et répétition
J'ai essayé de faire coexister Java Optional et la clause de garde
Comment appeler et utiliser l'API en Java (Spring Boot)
[Java] J'ai essayé le modificateur d'accès public et l'accès au champ non spécifié [Eclipse]
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
Conseils d'utilisation de Salesforce SOAP et de l'API Bulk en Java
J'ai créé un client RESAS-API en Java
Générer AWS Signature V4 en Java et demander l'API
J'ai envoyé un e-mail en Java
J'ai comparé les constructeurs PHP et Java
Ce que j'ai appris en Java (partie 1) Flux de développement Java et présentation
J'ai créé un PDF avec Java.
Exemple d'encodage et de décodage en Java
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
Générer l'URL de l'API CloudStack en Java
J'ai écrit le théorème de Gordobach en java
J'ai essayé de mettre Domino11 dans CentOS7
Classe StringBuffer et StringBuilder en Java
J'ai essayé le framework Java "Quarkus"
Hit l'API de Zaim (OAuth 1.0) en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Comprendre equals et hashCode en Java
J'ai fait une annotation en Java.
J'ai essayé de résumer les méthodes de Java String et StringBuilder
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
JPA (API de persistance Java) dans Eclipse
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai comparé Java et Ruby FizzBuzz.
Bonjour tout le monde en Java et Gradle
J'ai essayé d'utiliser Google HttpClient de Java
J'ai appelé l'analyse de la syntaxe de l'API COTOHA 100 fois en Java pour mesurer les performances.