Send SMS mit Windows 8 (C#)

Der Versandt von SMS ist durchaus ein adäquates Mittel, um auf wichtige Ereignisse hinzuweisen. Sei es, dass die eigene Highscore übertroffen wurde, der Akku des Rasenmäherroboters kurz vor der Grillparty zur Neige geht oder einfach nur so, um seinen Liebsten eine nette Nachricht zu senden. Glücklicherweise bietet der Developer Garten hier Hilfe: Dort findet sich die Beschreibung einer umfangreichen Schnittstelle (API).

Doch bevor es losgeht, ein klein wenig Vorbereitung: Zuerst einmal ist eine Registrierung unter http://www.developercenter.telekom.com/ notwendig. Anschließend kann dort die Send SMS API im Bereich Telekom API´s freigeschaltet werden (aktuell sind 10 SMS am Tag für Developer kostenlos).

Vor der Nutzung der API steht jedoch die Autorisation. Es gibt verschiedene Wege, um das zu bewerkstelligen. Ähnlich zu OAuth verhält sich hier TAuth (T wie Telekom). Es werden nur Benutzername und Passwort wie bei der Registrierung gewählt benötigt. Im C# Code für Windows 8 (Metro) sieht das dann so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
///
<summary>/// Url of STS service. Can be overwritten if needed.
/// </summary>
 
private static string UPAuthUrl = "https://sts.idm.telekom.com/rest-v1/tokens/odg";
 
private string username = "username";
private string password = "password";
 
///
<summary>/// Generated by STS service.
/// </summary>
 
private string token;
 
private async void authenticate()
{
 
HttpClientHandler handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential(username, password);
 
HttpClient client = new HttpClient(handler);
 
try
{
HttpResponseMessage response = await client.GetAsync(UPAuthUrl);
// Force an exception if the web server returned an HTTP error status code
response.EnsureSuccessStatusCode();
 
String content = await response.Content.ReadAsStringAsync();
JsonObject json = JsonObject.Parse(content);
token = json.GetNamedValue("token").GetString();
 
// proceed to api call
sendSMS();
}
catch (HttpRequestException hre)
{
Debug.WriteLine(hre.ToString());
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
 
}

Die Nutzung der API gestaltet sich nun ähnlich wie der Post-Versandt aus HTML-Formularen. Zusätzlich muss das bei der Autorisation generierte Token in den Header des HTTP-Requests injiziert werden. Hier der passende Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
///
<summary>/// Realm for authorization.
/// {0} is replaced by authorization token
/// </summary>
 
private static string Realm = "realm=\"https://odg.t-online.de\",tauth_token=\"{0}\"";
 
///
<summary>/// URL Path to Send SMS services. Can be overridden if necessary.
/// {0} is replaced by selected environment (sandbox or production)
/// </summary>
 
private static string ServicePath = "plone/odg-sms/rest/{0}/sms";
 
///
<summary>/// Address of Telekom API server.
/// </summary>
 
private static string TelekomBaseUrl = "https://gateway.developer.telekom.com/";
 
private async void sendSMS()
{
 
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("TAuth", String.Format(Realm, token));
 
Uri baseUri = new Uri(TelekomBaseUrl, UriKind.Absolute);
Uri relativeUri = new Uri(String.Format(ServicePath, "production"), UriKind.Relative);
Uri uri = new Uri(baseUri, relativeUri);
 
MultipartFormDataContent form = new MultipartFormDataContent();
form.Add(new StringContent("+4933123456"), "number");
form.Add(new StringContent("Foo"), "message");
// Optional (see http://www.developergarden.com/fileadmin/microsites/ApiProject/Dokumente/Dokumentation/Api_Doc_4_0/telekom-api-rest-4.0/html/sendsms_send_s_m_s.html)
form.Add(new StringContent("Sascha"), "originator");
 
try
{
HttpResponseMessage response = await client.PostAsync(uri, form);
// Force an exception if the web server returned an HTTP error status code
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException hre)
{
Debug.WriteLine(hre.ToString());
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
 
}

Wer es sich ein wenig einfacher machen möchte, der findet im Developer Garden SDKs für verschiedene Technologien wie .NET, Java, Objective C und PHP (http://www.developergarden.com/apis/apis-sdks/sdks/). Dort gibt es auch ein Forum für Ideen und Fragen. Viel Spaß…