Publiez régulièrement des images de tweets sur Twitter avec AWS Lambda + Java

Aperçu

Utilisez les polices Google Noto pour dessiner le japonais sur les images

Code source

Liste des fichiers

--pom.xml: Construire le fichier de configuration pour Maven --ImageTweet.java: classe Java qui effectue le traitement principal --NotoSansCJKjp-Regular.otf: fichier de police contenant des caractères japonais --fukidashi.png: Fichier image de fond de l'image à publier sur Twitter

├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── ImageTweet.java
        └── resources
            ├── font
            │   └── NotoSansCJKjp-Regular.otf
            └── image
                └── fukidashi.png

ImageTweet.java

package com.example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.conf.ConfigurationBuilder;

import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

public class ImageTweet implements RequestHandler<Map<String, Object>, Map<String, Object>> {

  /**
   *Il s'agit du point d'entrée lors de l'exécution en tant qu'application Java autonome.
   *
   * @param args premier élément[0]Un tableau avec une chaîne à tweeter
   */
  public static void main(String[] args) {
    Map<String, Object> output = new ImageTweet().invoke(new HashMap<String, Object>());
    System.out.println(output);
  }

  /**
   *Point d'entrée lors de l'exécution de la fonction AWS Lambda(Méthode du gestionnaire)est.
   *
   * @param input Données d'entrée
   * @param context Objet de contexte AWS Lambda
   * @renvoyer les données de sortie
   */
  @Override
  public Map<String, Object> handleRequest(Map<String, Object> input, Context context) {
    return invoke(input);
  }

  /**
   *Tweet
   *
   * @Param input Texte à tweeter
   */
  public Map<String, Object> invoke(Map<String, Object> input) {
    Map output = new HashMap<String, Object>();
    try {
      //Assemblez le texte pour tweeter
      String text = LocalDateTime.now(ZoneId.of("JST", ZoneId.SHORT_IDS))
        .format(DateTimeFormatter.ofPattern("année M mois d jour H heure m minute s seconde"));

      //Chemin du fichier image
      String imagePath = "image/fukidashi.png ";
      //Nom du fichier image
      String imageFileName = new File(imagePath).getName();
      //Nom du format d'image
      String imageFormatName = "png";
      //Charger le fichier image
      BufferedImage image = getImageFromResource(imagePath);

      //Lire le fichier de police
      String fontPath = "font/NotoSansCJKjp-Regular.otf";
      Font font = getFont(fontPath);

      //Traiter l'image(Dessiner du texte)
      Graphics2D g = image.createGraphics();
      g.setColor(Color.BLUE);
      g.setFont(font.deriveFont(30.0f));
      g.drawString(text, image.getWidth() / 4, image.getHeight() / 2);
      g.dispose();
      //Obtenir des données d'image
      InputStream imageBody = createInputStream(image, imageFormatName);

      //Obtenir des variables d'environnement
      Map<String, String> env = System.getenv();

      //Tweet
      TwitterFactory tf = getTwitterFactory(env);
      Status status = tweet(tf, text, imageFileName, imageBody);

      //Créer des données de sortie
      output.put("result", status);
    } catch (Exception e) {
      output.put("error", e);
    }

    return output;
  }

  /**
   *Chargez le fichier de police.
   *
   * @param path Chemin du fichier de police
   * @objet de police de retour
   * @jette FontFormatException s'il n'y a pas de données de police requises
   * @lève IOException si une erreur se produit
   */
  private Font getFont(String path) throws FontFormatException, IOException {
    ClassLoader cl = getClass().getClassLoader();
    try (InputStream input = cl.getResourceAsStream(path)) {
      //La taille par défaut des objets Java Font est 12
      return Font.createFont(Font.TRUETYPE_FONT, input).deriveFont(12.0f);
    }
  }

  /**
   *Chargez le fichier image.
   *
   * @param path Chemin du fichier image
   * @objet image de retour
   * @lève IOException si une erreur se produit
   */
  private BufferedImage getImageFromResource(String path) throws IOException {
    ClassLoader cl = getClass().getClassLoader();
    URL url = cl.getResource(path);
    return ImageIO.read(url);
  }

  /**
   *Obtient la chaîne d'octets des données d'image.
   *
   * @objet image image param
   * @param formatName Nom du format d'image
   * @return Chaîne d'octets de données d'image
   * @lève IOException si une erreur se produit
   */
  private InputStream createInputStream(BufferedImage image, String formatName) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    ImageIO.write(image, formatName, output);
    return new ByteArrayInputStream(output.toByteArray());
  }

  /**
   *Obtient l'objet TwitterFactory.
   *
   * @variable d'environnement param env
   * @renvoyer l'objet TwitterFactory
   */
  private TwitterFactory getTwitterFactory(Map<String, String> env) {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    //Obtenir les informations d'identification Twitter à partir des variables d'environnement
    cb.setDebugEnabled(true)
      .setOAuthConsumerKey(env.get("TWITTER_CONSUMER_KEY"))
      .setOAuthConsumerSecret(env.get("TWITTER_CONSUMER_SECRET"))
      .setOAuthAccessToken(env.get("TWITTER_ACCESS_TOKEN"))
      .setOAuthAccessTokenSecret(env.get("TWITTER_ACCESS_TOKEN_SECRET"));
    return new TwitterFactory(cb.build());
  }

  /**
   *Publiez un tweet avec une image.
   *
   * @param text Texte à tweeter
   * @param imageFileName Nom du fichier de l'image à inclure dans le tweet
   * @param imageBody Données d'image à inclure dans les tweets
   * @renvoyer l'objet Status à la suite d'un tweet
   * @lance TwitterException si une erreur se produit
   */
  private Status tweet(TwitterFactory tf, String text, String imageFileName, InputStream imageBody) throws TwitterException {
    Twitter twitter = tf.getInstance();
    StatusUpdate status = new StatusUpdate(text);
    status.setMedia(imageFileName, imageBody);
    return twitter.updateStatus(status);
  }
}

pom.xml

Fichier de configuration pour la construction avec Maven.

--Match Java version 1.8 pris en charge par AWS Lambda --Introduisez la bibliothèque aws-lambda-java-core pour AWS Lambda --Introduisez maven-shadow-plugin pour générer des fichiers JAR, y compris des bibliothèques

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>image-tweet</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>image-tweet</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core -->
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.twitter4j/twitter4j-core -->
    <dependency>
      <groupId>org.twitter4j</groupId>
      <artifactId>twitter4j-core</artifactId>
      <version>4.0.7</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- https://maven.apache.org/plugins/maven-shade-plugin/ -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

image de fond

Dans ce programme, une image fukidashi est préparée comme arrière-plan de l'image à tweeter.

image-tweet-00.png

Génération de fichiers JAR

Construisez avec Maven pour générer un fichier JAR.

$ mvn package

Un fichier JAR appelé image-tweet-1.0.jar est généré dans le répertoire cible.

Création de fonctions AWS Lambda

Créez une fonction Lambda à partir de la console de gestion Lambda (https://console.aws.amazon.com/lambda/).

Entrez "informations de base". Nom de la fonction: n'importe quel nom Exécution: Java 8 Rôle d'exécution: créer un nouveau rôle avec des autorisations Lambda de base

image-tweet-03.jpg

Entrez le "code de fonction". Type d'entrée de code: télécharger un fichier .zip ou jar Exécution: Java 8 Gestionnaire: com.example.ImageTweet :: handleRequest

Cliquez sur "Télécharger" pour télécharger le fichier JAR généré image-tweet-1.0.jar.

image-tweet-05.jpg

Définissez les variables d'environnement. Dans ce programme, les informations d'identification pour appeler l'API Twitter sont obtenues à partir de la variable d'environnement.

image-tweet-06.jpg

Cliquez sur Test en haut à droite de la page pour créer un nouvel événement de test. Modèle d'événement: Hello World Nom de l'événement: n'importe quel nom Modifiez (ou laissez la valeur par défaut) le JSON qui est les données d'entrée.

image-tweet-08.jpg

Vous pouvez lancer le test en cliquant sur "Test" en haut à droite de la page. Le résultat s'affiche.

image-tweet-09.jpg

Ceci complète la fonction de publication de tweets avec des images sur Twitter.

Utiliser Amazon CloudWatch Events

Cliquez sur Ajouter un déclencheur sur le côté gauche du concepteur de fonctions Lambda.

image-tweet-07.jpg

Sélectionnez CloudWatch Events.

image-tweet-04.jpg

Définissez le contenu du déclencheur pour qu'il s'exécute toutes les minutes. Règle: créer une nouvelle règle Nom de la règle: n'importe quel nom Description de la règle: description arbitraire Type de règle: expression planifiée Expression planifiée: cron (* * * *? *)

image-tweet-02.jpg

Ceci termine les réglages qui sont exécutés périodiquement.

Résultat d'exécution

Vous pourrez publier régulièrement des tweets avec des images sur Twitter.

image-tweet-01.jpg

Matériel de référence

Recommended Posts

Publiez régulièrement des images de tweets sur Twitter avec AWS Lambda + Java
Java sur AWS Lambda est-il lent?
Hello World avec AWS Lambda + Java
AWS Lambda (Lambda) Partie 1 avec Java pour démarrer maintenant
Comment utiliser le framework Java avec AWS Lambda! ??
Informez régulièrement Slack des articles stockés dans Qiita avec AWS Lambda + DynamoDB + CloudWatch
Comment déployer Java sur AWS Lambda avec Serverless Framework
Créer un SlackBot avec AWS lambda et API Gateway en Java
Créez AWS Lambda avec Quarkus
Avec [AWS] CodeStar, vous pouvez créer un projet Spring (Java) s'exécutant sur Lambda en seulement 3 minutes! !!
Essayez d'exécuter SlackBot réalisé avec Ruby x Sinatra sur AWS Lambda
Jusqu'à INSERT S3 objet dans EC2 DB avec Lambda @ java: AWS
Utilisation de Java avec AWS Lambda-Eclipse Préparation
Exécuter des binaires C sur AWS Lambda
Utilisation de Java avec des arguments CloudWatch AWS Lambda-Implementation-Check
Utilisation de Java avec AWS Lambda-Implementation-Stop / Launch EC2
Utilisation de JupyterLab + Java avec WSL sous Windows 10
Gestion des versions de java avec jenv d'OSX
Créer un environnement de développement Java 8 avec AWS Cloud 9
Installez Java8 avec Yum sur Amazon Linux
Essayez de gérer les bibliothèques Java avec AWS CodeArtifact
Construire OpenCV avec Java Wrapper sur Ubuntu 18.04
Gérez d'énormes JSON avec Java Lambda
Créer un environnement avec Docker sur AWS
Vous pouvez le faire tout de suite avec Serverless Framework Serverless with AWS (API + Lambda [java] est facile à configurer)