--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
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