Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Wetterbericht per SMS versenden

Geschrieben von: Christian Holm
Kategorie: C#

This printed page brought to you by AlphaSierraPapa

Den gescrapten Content einer Website kann man vielseitig weiterverwerten. Wenn es sich bei der Website um eine Wetterprognoseseite handelt kann man z.B, abgelegt in einer Datenbank, eine statistische Auswertung erstellen. Oder wie in diesem Artikel gezeigt, per SMS (Short Message Service) Nachricht die Informationen zum Handy eines Segelkollegen schicken. Diese Aufgabe wird mittels C# und dem .NET Framework gelöst.

Dieser Artikel ist die Fortsetzung der Artikel über das automatisierte Scrapen einer Webseite, Webseiten automatisiert scrapen und Webseiten automatisiert scrapen, Teil 2. Da die Beispiel-Konsolenanwendung in C# geschrieben war, war es auch "leicht" möglich, die Klasse für das Versenden von SMS Nachrichten aus dem Artikel SMS versenden in .NET in den heutigen Sourcecode miteinzubinden. Am Rande sei bemerkt, daß die Konsolenapplikation natürlich in jeder anderen zum .NET Framework kompatiblen Programmiersprache geschrieben werden kann.

Da der Artikel auf vorigen Artikel aufbaut, können wir uns direkt mit den kleinen Problemen befassen, die das Verschicken von solchen Wetterprognosen per SMS so mit sich bringt. Aus dem Artikel Webseiten automatisiert scrapen, Teil 2 wissen Sie ja schon wie man automatisiert den Content einer Webseite (hier: Wettervorhersage fuer die Adria) scrapt und ohne lästigen Ballast in eine SQL Datenbank schreibt. Heute drehen wir den Spieß sozusagen um und holen diese Daten aus der Datenbank, formatieren sie passend für eine SMS Nachricht und können diese dann wiederum automatisch per Scheduled Task verschicken.

Da die Konsolenapplikation in C# geschrieben ist, läßt sich die Funktionaliät ja leicht modular gliedern. Befassen wir uns daher mit jener Klasse, die für das Holen der Daten aus der Datenbank und das passende Formatieren der Daten für die SMS Nachrichten verantwortlich ist. Diese Klasse heißt im Beispielcode SendWeatherData. Diese Klasse hat zwei Methoden - GetLatestWeatherReport, diese holt die aktuellen Daten aus der Datenbank. Die zweite, Send hat die Aufgabe die Daten für die SMS Nachricht zu formatieren und durch zu Hilfenahme einer anderen Klasse diese auch zu versenden.

Sehen wir uns zunächst die GetLatestWeatherReport Methode an:

public void GetLatestWeatherReport(out string strRetData)
{
string strConn = "server=(local)\\NetSDK;database=ScrapAppImproved;Trusted_Connection=yes"; 
string strSql =  "SELECT TOP 1 Title, Heading1, Heading2, Heading3, Heading4 FROM 
      tContent WHERE Success=1 ORDER BY ForecastTimestamp DESC";

SqlConnection RetrSqlConn = new SqlConnection(strConn);
SqlCommand RetrSqlCmd = new SqlCommand(strSql, RetrSqlConn);  

RetrSqlConn.Open();
SqlDataReader MySqlReader = RetrSqlCmd.ExecuteReader();

MySqlReader.Read();
strRetData = MySqlReader["Title"].ToString();
strRetData += MySqlReader["Heading1"].ToString();
strRetData += MySqlReader["Heading2"].ToString();
strRetData += MySqlReader["Heading3"].ToString();
strRetData += MySqlReader["Heading4"].ToString();
MySqlReader.Close(); 
RetrSqlConn.Close();
}

Diese Methode hat einen Ausgabeparameter der die aktuellen Daten zur Wetterlage, in diesem Fall der Adria, zurückgibt. Doch bevor wir diesen erhalten, müssen ein paar Schritte durchgeführt werden. Nach dem Festlegen des Connectionstrings (strConn) wird das SQL-Statment angegeben. Dieses holt genau eine Datenreihe aus der Datenbank die aus dem Artikel Webseiten automatisiert scrapen, Teil 2 bekannt sein sollte.

Hierbei ist aber eine Einschränkung zu treffen. Und zwar sollen nur Daten verschickt werden, die einem erfolgreichen Scrap-Vorgang entsprechen (durch Success=1) und natürlich ist nur die aktuellste Wetterprognose interessant (durch ORDER BY ForecastTimestamp DESC). Nach dem obligatorischen Erstellen der Objekte für die Datenbankverbindung (RetrSqlConn) und des SqlCommands (RetrSqlCmd), kann die Verbindung mit Hilfe der Open Methode des SqlConnection Objektes hergestellt werden.

Da wir für diese Aufgabe kein DataGrid oder ähnliche Annehmlichkeiten benötigen, verwende ich den SqlDataReader der mir nur einen read- und forwardonly Stream mit den enthaltenen Daten übergibt. Nachher können die Objekte wieder zur Zerstörung freigegeben werden, damit die Applikation nicht so viel Resourcen verbrät.

Nun können wir die aktuellen Wetterdaten, die wir über den Ausgabeparameter strRetData der Methode erhalten haben, für SMS Nachrichten formatiern. Die "Formatierung" der Daten ist deshalb vonnöten, da wie allgemein bekannt, maximal 160 Zeichen auf einmal per SMS Nachricht versandt werden können. Der Ausgabeparameter kann aber durchschnittlich zwischen 1000 und mehr Zeichen enthalten. Dieses Aufteilen der Daten ist eine Teilaufgabe der Send Methode der SendWeatherData Klasse:

public void Send(string strUsername, string strPassword, string strTelNoTo)
{
int nSMSDataIdx =0;
int nMaxLength;
ArrayList arSMSData = new ArrayList();
string strResponse, strRetData;
SMSGateway SendSMS = new SMSGateway();
SendSMS.Username = strUsername;
SendSMS.Password = strPassword;

GetLatestWeatherReport(out strRetData);

if ("" != strRetData)
{
    nMaxLength = strRetData.Length;
    for(int i=0;i < nMaxLength-157;i+=157)
{
    arSMSData[nSMSDataIdx] = nSMSDataIdx.ToString() + " " + strRetData.Substring(i,157);
    nSMSDataIdx++;
}

for(int j=0;j < nSMSDataIdx;j++)
{
    bool bResult = SendSMS.SendMessage(arSMSData[j].ToString(), strTelNoTo, out strResponse);
}

}
else
{
    Console.WriteLine("No Data To Send");
}

}

Da diese Methode schließlich auch die Daten versenden muß, werden ihr Credentials des SMS-Senders übergeben (strUsername und strPassword), da es sich hier um einen kostenpflichtigen SMS-Service eines Drittanbieters handelt. Zusätzlich muß natürlich auch die Telefonnummer des Empfängers (strTelNoTo) angegeben werden. Die Integervariable nSMSDataIdx enthält die Anzahl der zu sendenden SMS Nachrichten, die sich durch die Aufteilung der Wetterdaten aus der Datenbank ergibt. Wie der Name schon sagt stellt die nMaxLength Integervariable die maximale Länge des Datenstrings strRetData dar.

Um die Daten leicher aufteilen zu können, verwende ich ein ArrayList (arSMSData) in das die einzelnen "Datensplitter" eingetragen werden. Sie werden sich natürlich fragen, warum ich hier kein Array benutzt habe. Da die Anzahl der SMS Nachrichten erst während der Runtime der Applikation bekannt werden und es in C# nicht mehr sinnvoll ist normale Arrays dynamisch zu allokieren, ist der Gebrauch einer ArrayList mehr als gerechtfertigt.

Nach dem Aufruf der GetLatestWeatherReport Methode die die Daten aus der Datenbank holt, können wir nun die Wetterdaten in SMS-gerechte Teile aufteilen. Dies ist hier einfach mit einem for-Statement gelöst. Jede SMS Nachricht erhält dabei auch einen Präfix, der hier aus einer fortlaufenden Nummer (nSMSDataIdx) der jeweiligen SMS besteht.

Da wir damit auch die Anzahl der zu versendenden SMS Nachrichten kennen, können wir uns sogleich ans Verschicken machen. Wir übergeben die einzelen Datenpakete an die SendMessage Methode der SMSGateway Klasse, die Sie schon aus dem Artikel SMS versenden in .NET kennen. Was noch unserer Konsolenapplikation fehlt ist ihre Basisklasse MainClass samt der nötigen Referenzierungen auf die Namespaces des .NET Frameworks:

using System;
using System.Net;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using System.Collections;

class MainClass
{
  
  public static void Main(string[] args)
  {    
  string strTelNoTo ="PhoneNumber";
  string strUsername ="Username";
  string strPassword ="Password";
    
  SendWeatherData MySendWeatherData = new SendWeatherData();
  MySendWeatherData.Send(strUsername, strPassword, strTelNoTo);
  }
}

Die Main Methode der Basisklasse ist, wie man sieht sehr einfach gehalten. Sie müssen lediglich die Telefonnummer des Empfängers und Ihre Credentials eingeben, die Sie zur Verwendung des kostenpfichtigen SMS-Dienstes berechtigen. Nun steht Ihnen nichts mehr im Wege Ihren Kollegen auf hoher See den Wetterbericht zuzuschicken.

Schlußbemerkung

Das gezeigte Beispiel läßt sich natürlich für jede Anforderung anpassen sofern die Daten schon in einer vorbereiteten Form vorhanden sind. Der eigentliche Aufwand ist das Aufparsen der jeweiligen Seite von der man die Daten bezieht.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010913.zip

Verwandte Artikel

Die Performancefalle ReDim Preserve
http:/www.aspheute.com/artikel/20001025.htm
SMS versenden in .NET
http:/www.aspheute.com/artikel/20010912.htm
Verwendung von Arrays in C#
http:/www.aspheute.com/artikel/20000731.htm
Webseiten automatisiert scrapen
http:/www.aspheute.com/artikel/20010910.htm
Webseiten automatisiert scrapen, Teil 2
http:/www.aspheute.com/artikel/20010911.htm

Links zu anderen Sites

Seewetterbericht Adria
http://prognoza.hr/jadran_e.html

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.