[Java] Stellen Sie die Zeit im Browser mit jsoup ein

Bedarf

Ausführungsumgebung

Entwicklungsumgebung

Quellcode

Zeitanpassung Startcharge

TimeAdjusterMain.bat


@echo off

rem ------------------------------------------------
rem ---Zeitanpassungsstapel
rem ------------------------------------------------

rem --Basierend auf dem aktuellen Verzeichnis
cd /d %~dp0

echo ****Startzeiteinstellung: %date% %time%

rem --Überprüfen Sie das Argument(Fügen Sie xx hinzu, um zu verhindern, dass es leer wird)
if xx%1==xx goto confirmPw
goto setPw



:confirmPw

rem --Geben Sie das Administratorkennwort ein, wenn kein Argument angegeben ist
set /P PASSWD=Bitte geben Sie das Administratorkennwort ein: 

goto exec



:setPw

rem --Als Administratorkennwort festlegen, wenn ein Argument angegeben wird
set PASSWD=%1

goto exec



rem --Ausführung der Stapelverarbeitung
:exec

rem --Starten Sie die Ausführung des Verarbeitungsstapels
call bin\TimeAdjuster.bat %PASSWD%

echo ****Anpassung am Ende der Zeit: %date% %time%

rem --Bleib ohne zu vervollständigen
pause

Zu verarbeitende IP-Adressliste tsv

list.tsv


10.20.30.40 abc123 ABC123 A Zweig B Etage AB # 1
10.20.50.60 def456 DEF456 C Zweig D Boden CD # 2

Java-Quellcode

Main

TimeAdjusterMain.java


package jp.co.sample.timeadjuster;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.sample.timeadjuster.bean.SettingBean;
import jp.co.sample.timeadjuster.launcher.TimeAdjusterLauncher;

public class TimeAdjusterMain {

	private static Logger logger = LoggerFactory.getLogger(TimeAdjusterMain.class);

	public static void main(String[] args) {
		logger.info("TimeAdjusterMain wurde gestartet");

		//Informationen einstellen
	    SettingBean setting;
	    try {
			// args[0]:Administrator-Passwort
			// args[1]: src/absoluter Pfad des dist-Ordners
			setting = new SettingBean(args[0], args[1], "list.tsv");
		} catch (Exception e) {
			logger.error("Einstellungsinformationsfehler", e);
			return;
		}

	    //Ausführung verarbeiten
	    TimeAdjusterLauncher launcher = new TimeAdjusterLauncher(setting);
	    try {
	    	launcher.execute();
		} catch (Exception e) {
			logger.error("Verarbeitungsfehler bei der Zeitanpassung", e);
			return;
		}
	}
}

Informationen einstellen

SettingBean.java


package jp.co.sample.timeadjuster.bean;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SettingBean {

	public static Logger logger = LoggerFactory.getLogger(SettingBean.class);

	/**
	 *Administrator-Passwort
	 */
	String passwd;

	/**
	 *Ausführungspfad-Referenzverzeichnis
	 */
	String basePath;

	/**
	 *tsv Dateiname
	 */
	String tsvName;

	/**
	 *Serverinformationsliste
	 */
	ArrayList<ServerBean> serverList = new ArrayList<>();


	public SettingBean(String passwd, String basePath, String tsvName) throws IOException {
		this.passwd = passwd;

		this.basePath = basePath;

		logger.debug("this.basePath: "+ this.basePath);

		this.tsvName = tsvName;

		logger.debug("this.tsvName: "+ this.tsvName);

		File targetFile = new File(this.basePath, this.tsvName);
		if (!targetFile.isFile()) {
			logger.error("Bitte geben Sie einen vorhandenen Dateipfad an.: "+ path);
			return;
		}

		//Lesen Sie die Datei
		try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(targetFile),"UTF-8"));) {
			//TAB-getrennte Datei mit Header. Leerzeichen ausschließen
			Iterable<CSVRecord> records = CSVFormat.TDF.withIgnoreEmptyLines().withIgnoreSurroundingSpaces().parse(reader);
				for (CSVRecord record : records) {

					logger.debug(record.get(0));

					//Überprüfen Sie den IP-Adresstyp für die IP-Adresse des Servers.
					//Wenn Sie eine Tsv-Datei mit Notepad erstellen, beginnt sie am Anfang?Weil es eintreten wird
					Pattern p = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
					Matcher m = p.matcher(record.get(0));

					if (!m.find()) {
						throw new RuntimeException("Die Methode zur Angabe der IP-Adresse ist falsch. IP Adresse:"+ record.get(0));
					}

					//Holen Sie sich Serverinformationen und fügen Sie sie der Liste hinzu
					ServerBean server = new ServerBean(m.group(), record.get(1), record.get(2), record.get(3), record.get(4), record.get(5));
					serverList.add(server);

					logger.debug("server: "+ server.getIpaddress() + " / "+ server.getSerial_no() + " / "+ server.getDevice_name());
				}
		} catch (FileNotFoundException e) {
			logger.error("Fehler beim Lesen der TSV-Datei", e);
			throw e;
		} catch (IOException e) {
			logger.error("Fehler beim Lesen der TSV-Datei", e);
			throw e;
		}

	}


	public String getPasswd() {
		return passwd;
	}


	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}


	public String getBasePath() {
		return basePath;
	}


	public void setBasePath(String basePath) {
		this.basePath = basePath;
	}


	public String getTsvName() {
		return tsvName;
	}


	public void setTsvName(String tsvName) {
		this.tsvName = tsvName;
	}


	public ArrayList<ServerBean> getServerList() {
		return serverList;
	}


	public void setServerList(ArrayList<ServerBean> serverList) {
		this.serverList = serverList;
	}

}

Serverinformationen (Informationen aus tsv gelesen)

ServerBean.java


package jp.co.sample.timeadjuster.bean;

public class ServerBean {
	/**
	 *IP Adresse
	 */
	String ipaddress;

	/**
	 *Hostname
	 */
	String host_name;

	/**
	 *Ordnungsnummer
	 */
	String serial_no;

	/**
	 *Basisname
	 */
	String base_name;


	/**
	 *Installationsort
	 */
	String installation_location;

	/**
	 *Ausrüstungsname
	 */
	String device_name;

	public ServerBean(String ipaddress, String host_name, String serial_no, String base_name,
			String installation_location, String device_name) {
		super();
		this.ipaddress = ipaddress;
		this.host_name = host_name;
		this.serial_no = serial_no;
		this.base_name = base_name;
		this.installation_location = installation_location;
		this.device_name = device_name;
	}

	public String getIpaddress() {
		return ipaddress;
	}

	public void setIpaddress(String ipaddress) {
		this.ipaddress = ipaddress;
	}

	public String getHost_name() {
		return host_name;
	}

	public void setHost_name(String host_name) {
		this.host_name = host_name;
	}

	public String getSerial_no() {
		return serial_no;
	}

	public void setSerial_no(String serial_no) {
		this.serial_no = serial_no;
	}

	public String getBase_name() {
		return base_name;
	}

	public void setBase_name(String base_name) {
		this.base_name = base_name;
	}

	public String getInstallation_location() {
		return installation_location;
	}

	public void setInstallation_location(String installation_location) {
		this.installation_location = installation_location;
	}

	public String getDevice_name() {
		return device_name;
	}

	public void setDevice_name(String device_name) {
		this.device_name = device_name;
	}

}

Zeitanpassungsprozess

TimeAdjusterLauncher.java


package jp.co.sample.timeadjuster.launcher;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.sample.timeadjuster.bean.ServerBean;
import jp.co.sample.timeadjuster.bean.SettingBean;

public class TimeAdjusterLauncher {

	public static Logger logger = LoggerFactory.getLogger(TimeAdjusterLauncher.class);

	/**
	 *Informationen einstellen
	 */
	SettingBean setting;

	/**
	 *Ergebnis der Anzeige des Anmeldebildschirms
	 *Halten Sie Cookies usw.
	 */
	Response loginRes;

	/**
	 *Konstrukteur
	 *
	 * @Informationen zur Einstellung der Parameter
	 */
	public TimeAdjusterLauncher(SettingBean setting) {
		super();

		//Halten Sie die Einstellungen
		this.setting = setting;
	}

	/**
	 *Zeitanpassungsverarbeitung ausführen
	 * @throws RuntimeException
	 * @throws IOException
	 */
	public void execute() throws RuntimeException, IOException {

		//Schleifenverarbeitung für jeden Server
		for (ServerBean server : setting.getServerList()) {
			logger.info("Startzeiteinstellung****************** ");
			logger.info("Zielserver: "+ server.getIpaddress() + " / "+ server.getDevice_name());

			//Einloggen
			login(server);

			//Überprüfen Sie die aktuell eingestellte Zeit
			String zone = getTimer(server);

			//Neue Zeiteinstellung
			adjustTimer(server, zone);
		}

	}

	/**
	 *Anmeldevorgang
	 * @throws RuntimeException
	 * @throws IOException
	 */
	private void login(ServerBean server) throws RuntimeException, IOException {
		//Ausführung des Anmeldevorgangs
		String loginUrl = "http://"+ server.getIpaddress() + "/logon.cgi";
		try {
			loginRes = Jsoup.connect(loginUrl)
				    .data("Password", setting.getPasswd())
				    .data("Mode", "Admin")
				    .data("Lang", "Japanese")
				    .method(Method.POST)
				    .execute();
		} catch (IOException e) {
			logger.error("Fehler beim Anmelden des ersten Bildschirms", e);
			throw e;
		}

//		logger.debug(loginRes.parse().outerHtml());

		//HTTP-Statusübereinstimmung
		checkStatusCode(loginRes, loginUrl);


		if (StringUtils.contains(loginRes.parse().outerHtml(), "/pages/_top2.htm") ) {
			//Wenn der Anmeldefehlerbildschirm umgeleitet wird
			//Dies bedeutet, dass die Administratoranmeldung fehlgeschlagen ist und mit einem Fehler beendet wurde
			throw new RuntimeException("Administratoranmeldung fehlgeschlagen. Die Verarbeitung wird ausgesetzt.");
		}


		//Nach erfolgreicher Anmeldung umleiten
		//Verarbeitung, die nicht wirklich notwendig ist. Ich habe mich nur um Bestätigung bemüht.
		String redirectUrl = "http://"+ server.getIpaddress() + "/pages/_devadm.htm";
		Response redirectRes;
		try {
			redirectRes = Jsoup.connect(redirectUrl)
				//Setzen Sie den beim Login erhaltenen Cookie
			    .cookies(loginRes.cookies())
			    .method(Method.GET)
			    .execute();
		} catch (IOException e) {
			logger.error("Fehler beim Umleiten der ersten Bildschirmanmeldung", e);
			throw e;
		}

//		logger.debug(redirectRes.parse().outerHtml());

		//HTTP-Statusübereinstimmung
		checkStatusCode(redirectRes, redirectUrl);

	}

	/**
	 *Ruft die aktuell auf dem Server eingestellte Zeit ab
	 *
	 * @param server
	 * @throws RuntimeException
	 * @Rückgabezone
	 * @throws IOException
	 */
	private String getTimer(ServerBean server) throws RuntimeException, IOException {

		//Rufen Sie den Bildschirm zur Einstellung der Serverzeit auf
		String timerUrl = "http://"+ server.getIpaddress() + "/pages/ed_time.htm";
		Response timerRes;
		try {
			timerRes = Jsoup.connect(timerUrl)
					//Setzen Sie den beim Login erhaltenen Cookie
				    .cookies(loginRes.cookies())
				    .method(Method.GET)
				    .execute();
		} catch (IOException e) {
			logger.error("Zeiteinstellungsbildschirm-Erfassungsfehler", e);
			throw e;
		}

		//HTTP-Statusübereinstimmung
		checkStatusCode(timerRes, timerUrl);

//		logger.debug(timerRes.parse().outerHtml());

		Document doc = timerRes.parse();

		//Ruft die aktuell auf dem Server eingestellte Zeit ab.
		String year = doc.getElementsByAttributeValue("name", "DateYYYY").get(0).val();
		String month = doc.getElementsByAttributeValue("name", "DateMM").get(0).val();
		String day = doc.getElementsByAttributeValue("name", "DateDD").get(0).val();
		String hour = doc.getElementsByAttributeValue("name", "TimeHH").get(0).val();
		String minutes = doc.getElementsByAttributeValue("name", "TimeMM").get(0).val();
		String zone = doc.select("select option[selected]").get(0).val();

		logger.info("Aktuelle Serverzeit: "+ year + "/"+ month + "/"+ day + " "+ hour +":"+ minutes + " ("+ zone + ")");

		//Nur Zone verwendet den vorhandenen Wert und wird daher zurückgegeben.
		return zone;
	}

	/**
	 *Stellen Sie die Zeit ein.
	 *
	 * @param server
	 * @param zone
	 * @throws RuntimeException
	 * @throws IOException
	 */
	private void adjustTimer(ServerBean server, String zone) throws RuntimeException, IOException {
		//Ruft die aktuelle Uhrzeit der Ausführungsumgebung ab.
		LocalDateTime now = LocalDateTime.now();

		logger.info("Aktuelle Uhrzeit: "+ now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

		//Ruft das Timing für die nächste Zeitanpassung so ab, dass es nach 1 Minute 0 Sekunden entspricht.
		LocalDateTime nextLdt =
		        LocalDateTime.now()
		        .plusMinutes(1)
		        .truncatedTo(ChronoUnit.MINUTES);

		logger.debug("Zeit zu passen: "+ nextLdt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

		//Warten Sie Millisekunden
		long localDiffMsec = ChronoUnit.MILLIS.between(now, nextLdt);

		logger.debug("Warten Sie Millisekunden, bis die entsprechende Zeit erreicht ist: "+ localDiffMsec);

		try {
			//Warten Sie auf Millisekunden, warten Sie
			Thread.sleep(localDiffMsec);
		} catch (InterruptedException e) {
			logger.error("Fehler beim Anpassen der Serverzeit in Millisekunden");
		}

		logger.info("Ausführung der Zeitanpassung");

		//Ausführung der Serverzeitanpassungsverarbeitung(POST)
		//Aus irgendeinem Grund hat es ohne den Cookie funktioniert, also werfe ich einfach POST
		String timerUrl = "http://"+ server.getIpaddress() + "/settime.cgi";
		Response timerRes;
		try {
			timerRes = Jsoup.connect(timerUrl)
				    .data("DateYYYY", ""+ nextLdt.getYear())
				    .data("DateMM", ""+ nextLdt.getMonthValue())
				    .data("DateDD", ""+ nextLdt.getDayOfMonth())
				    .data("TimeHH", ""+ nextLdt.getHour())
				    .data("TimeMM", ""+ nextLdt.getMinute())
				    .data("TimeZone", ""+ zone)
				    .method(Method.POST)
				    .execute();
		} catch (IOException e) {
			logger.error("Fehler beim Posten der Serverzeitanpassung", e);
			throw e;
		}

//		logger.debug(timerRes.parse().outerHtml());

		//HTTP-Statusübereinstimmung
		checkStatusCode(timerRes, timerUrl);

		logger.info("Zeitanpassung abgeschlossen: "+ server.getIpaddress() + " / "+ server.getDevice_name() + " / " + nextLdt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}

	/**
	 *HTTP-Statusprüfung
	 *
	 * @param res
	 * @param url
	 * @throws RuntimeException
	 */
	private void checkStatusCode(Response res, String url) throws RuntimeException {

		if (res.statusCode() != 200) {
			//Der HTTP-Status ist 200(normal)Wenn nicht, ein Fehler
			throw new RuntimeException("Fehler beim URL-Zugriff: url="+ url + " status="+ res.statusCode());
		}
	}

}

Impressionen

Auch dieses Jahr möchte ich mein Bestes geben. Vielen Dank.

Recommended Posts

[Java] Stellen Sie die Zeit im Browser mit jsoup ein
Stellen Sie Datum und Uhrzeit aus der Zeichenfolge mit POI ein
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
Code Java von Emacs mit Eclim
Folgen Sie dem Link mit Selen (Java)
Arbeiten Sie mit Google-Tabellen aus Java
Der Weg von JavaScript nach Java
[Gradle] Erstellen Sie ein Java-Projekt mit einer Konfiguration, die von der Konvention abweicht
Finden Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java [Abkochung Nr. 2]
SetCookie von der Client-Seite mit OkHttp3
Einführung in Java zum ersten Mal # 2
Rufen Sie die Java-Bibliothek von C mit JNI auf
API-Integration von Java mit Jersey Client
Java (gesetzt)
Kick ShellScript auf dem Server von Java
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
Konvertieren Sie von der Java-UTC-Zeit in die JST-Zeit
Rufen Sie die Salesforce REST-API von Java aus auf
Einführung in Java ab 0 Teil 1
[Java] Schreiben Sie ein Programmierquiz SET INTERSECTION mit StreamAPI in eine Zeile
Wie man nur die Zeit mit Rails vergleicht (von welcher Zeit bis zu welcher Zeit, so etwas wie)
Zum ersten Mal Java lernen [Einführung]
Java-Kalenderklasse (Zeiteinstellung, Vergleich, Format)
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Führen Sie Java-Code von cpp auf cocos2dx aus
Versuchen Sie es mit der Wii-Fernbedienung in Java
[Java] Holen Sie sich MimeType aus dem Inhalt der Datei mit Apathce Tika [Kotlin]
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Überwachen Sie einfach das Raumklima. ⑪ Erhalten Sie die Beleuchtungsstärke mit Java von BH1750FVI (Ersatz) - (I2C / Pi4J) -
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Initialisieren Sie das Ruby-Array mit 0 für Java, dh setzen Sie den Standardwert auf 0
Inkrementiert durch das dritte Argument der iterierten Methode der aus Java9 hinzugefügten Stream-Klasse
[Java] Schreiben Sie die von mir in der Vergangenheit aus java.io.File erstellten Funktionen mit NIO.2 neu.
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung
[Java] Verstehe den Unterschied zwischen List und Set
Überprüfen Sie die für den laufenden Java-Prozess festgelegten Optionen
Führen Sie Rust von Java mit JNA (Java Native Access) aus.
[LeJOS] Lassen Sie uns den EV3-Motor mit Java steuern
Grundlegendes zum MVC-Framework mit serverseitiger Java 1/4 View
Versuchen Sie, den CORBA-Dienst von Spring (Java) aus aufzurufen.
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
Grundlegendes zum MVC-Framework mit serverseitigem Java 3/4 Controller
Spüren Sie den Lauf der Zeit auch in Java
Textextraktion in Java aus PDF mit pdfbox-2.0.8
Berechnen Sie die Ähnlichkeitsbewertung von Zeichenketten mit JAVA
Verwenden Sie Matplotlib aus Java oder Scala mit Matplotlib4j
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
[Java] (für MacOS) Methode zur Einstellung des Klassenpfads
Zeigen Sie "Hello World" im Browser mit Java an
Zeigen Sie "Hello World" im Browser mit Java an
Verwenden Sie vorerst eine externe Java-Bibliothek
Das Datum und die Uhrzeit von java8 wurden aktualisiert
Java beginnend mit JShell-A Einblick in die Java-Welt
Grundlegendes zum MVC-Framework mit dem serverseitigen Java 2/4 -Modell
Führen Sie jetzt Dataflow, Java, Streaming aus
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!
Einfache Überwachung des Innenraumklimas - ⑤ Erhalten Sie die PM2.5-Konzentration von PPD42NS mit Java (GPIO / Pi4J) -
Richten Sie signierte Cookies (für CloudFront) mit benutzerdefinierten Richtlinien mithilfe des AWS SDK für Java ein