Fritzbox Telefonbuch (Phonebook) mit Java bearbeiten via JDom und SAXBuilder

Erstellt am 30. März 2016 von It_berater

Wer eine Fritzbox hat, kann dort auch Telefonbücher anlegen, so das beim Anruf eine E-Mail versendet wird. Bei mir wird bei Anruf auch eine Pushover Nachricht auf das Handy gesendet und der Name und die Nummer mit openHAB via Karotz angesagt, so das ich schon hören kann, wer anruft.


Das läuft über das openHab Fritzbox 064 Binding ganz gut. Von dem Bindig wird aber bisher nur das erste Telefonbuch aus der Fritzbox ausgelesen. Wer ein anderes benutzt muss die Daten exportieren und in dem ersten Telefonbuch wiederherstellen, da es keine löschen Funktion in der Fritzbox gibt.

Bei mir war noch das Problem, das viele Telefonnummern (über 600) Blanks, Bindestriche und Klammern enthielt. Z.B. (0)511-123 456 und die wird bisher in dem Binding nicht erkannt. Deshalb habe ich einen kleinen Konverter geschrieben, der alle Blanks, (,),- löscht und auch alle Nr. die kein +49 haben und mit 0 beginnen mit dem gültigen prefix +49 ohne 0 ergänzt. Weitere Regeln können leicht angepasst werden.

In diesem Java Programm, kann man auch sehen, wie mit einem SAXBuilder ein JDom Dokument erzeugt gelesen und verändert werden kann. Hier das Programm:

package de.wenzlaff.phonebook;

import java.io.File;
import java.io.FileWriter;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

/**
 * Fritzbox Phonebook (http://www.wehavemorefun.de/fritzbox/Phonebook) bearbeiten.
 * 
 * Bearbeitet alle Telefonnummern:
 * 
 * Entfernt: blank, (, ) - also aus (0)511 23456-78 wird 05112345678 und alle Telefonnummern die ohne +49 für Deutschland und mit 0 starten werden
 * 
 * zu +49 ohne 0 also z.B. aus 051123456 wird +4051123456
 *
 * Diese Abhängigkeit wird benötigt.
 * 
 * <pre>
         <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>2.0.2</version>
        </dependency>
 * </pre>
 *
 * @author Thomas Wenzlaff http://www.wenzlaff.info
 * @version 0.1
 */
public class Converter {

	private static final String HILFE = "Aufruf: de.wenzlaff.phonebook.Converter [Fritzbox Phonebook Datei Name] [output Datei Name]";

	/**
	 * Startmethode. Aufruf de.wenzlaff.phonebook.Converter [input Datei Name] [output Datei Name]
	 * 
	 * @param args
	 *            Aufruf: [input Datei Name] [output Datei Name]
	 * @throws Exception
	 *             bei Fehler
	 */
	public static void main(String[] args) throws Exception {

		if (args.length != 2) {
			System.err.println(HILFE);
			return;
		}

		String inputDatei = args[0];
		String outputDatei = args[1];

		if (inputDatei.isEmpty() || outputDatei.isEmpty()) {
			System.err.println(HILFE);
			return;
		}

		File inDatei = new File(inputDatei);
		if (!(inDatei.isFile() & inDatei.canRead())) {
			System.err.println("Fritzbox Phonebook Datei kann nicht gelesen werden. " + HILFE);
			return;
		}

		File ausDatei = new File(outputDatei);

		System.out.println("Starte das einlesen der Fritzbox Phonebook " + inDatei.getAbsolutePath() + " Datei und schreibe in Datei " + ausDatei.getAbsolutePath());

		Document dokument = new SAXBuilder().build(inDatei);
		Element rootPhoneBooks = dokument.getRootElement();

		int count = 0;

		List<Element> phonebooks = rootPhoneBooks.getChildren("phonebook");
		for (Element phonebook : phonebooks) {
			List<Element> contacts = phonebook.getChildren("contact");
			for (Element contact : contacts) {
				List<Element> telephonys = contact.getChildren("telephony");
				for (Element nummern : telephonys) {
					List<Element> numbers = nummern.getChildren("number");
					for (Element number : numbers) {
						bearbeiteTelefonNummer(number);
						count++;
					}
				}
			}
		}

		XMLOutputter xmlOutput = new XMLOutputter();
		xmlOutput.setFormat(Format.getPrettyFormat());
		xmlOutput.output(dokument, new FileWriter(ausDatei));
		System.out.println("Umwandlung von " + count + " Telefonnummern beendet. Ergebnis in " + ausDatei.getAbsolutePath());
	}

	private static void bearbeiteTelefonNummer(Element number) {
		String orginalNr = number.getText();
		// Entferne: blank, (, ) -
		String neueNr = orginalNr.replaceAll(" ", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("-", "");
		// alle Nummern die ohne +49 für Deutschland und mit 0 starten werden zu +49 ohne 0
		String ergebnisNr = "";
		if (!neueNr.startsWith("+") & neueNr.startsWith("0")) {
			ergebnisNr = "+49" + neueNr.substring(1, neueNr.length());
		}
		number.setText(ergebnisNr);
	}

}

Das vorhandene Telefonbuch in der Fritzbox über Telefonie-Telefonbuch-Sichern dann mit dem Converter bearbeiten und wieder importieren über Telefonie-Telefonbuch-Wiederherstellen wie hier gezeigt:

Noch eine Idee?

Ähnliche Artikel:

  1. Java Rätsel des Monats
  2. Quick-Howto für die Coole Java Template-Erstellung (JaMoPP) mit CommentTemplate ldt. JavaMagazin 1-2013
  3. Java Quiz