Xtrazone SMS Tool

Achtung: Seit die neue Xtra-Zone aufgeschaltet wurde, konnte das Script wegen dem Captcha noch nicht angepasst werden. Deshalb ist das Xtrazone SMS Tool momentan nicht funktionsfähig.

Das Xtrazone SMS tool

Viele junge Schweizer kennen wohl Xtrazone, ein Internetportal von Swisscom, auf welchem alle Leute die ein xtra-liberty Handyabo haben, 500 Gratis-SMS im Monat versenden können. Ich habe das Angebot bisher jedoch sehr selten genutzt, da die Handhabung sehr umständlich ist. Zuerst muss man sich durch 3 Seiten durchklicken, bis man dann zum Login kommt, und wenn man mal eingeloggt ist, wird man nach ziemlich kurzer Inaktivität schon wieder rausgekickt… Das ist mühsam. Ein Kollege hat deswegen mal ein Windows-Tool gecodet, welches sich im Systray versteckt, und sich die Logindaten merkt. Da ich jedoch privat hauptsächlich Linux-User bin, und dank SSH auch immer Zugriff auf meinen Linux-Server habe, hab ich mir gedacht dass ein Kommandozeilentool für mich viel bessr geeignet wäre…

Ich hab mich also rangesetzt und ein kleines Perlscript geschrieben. Man kann damit sehr bequem über die Konsole mit einem Einzeiler ein SMS versenden.

Voraussetzungen

(Beide Tools können normalerweise über die Paketverwaltung (wie z.B. apt-get) installiert werden.)

Installation

Script herunterladen/abspeichern und starten. Eventuell müssen mit

$ chmod +x sms.pl

die Ausführrechte noch gesetzt werden. Wichtig: Die Leserechte sollten so gesetzt sein, dass nur der Besitzer die Datei lesen kann (chmod 700 sms.pl). Ansonsten kann jeder der Leserechte hat das Passwort, welches im Plaintext gespeichert wird, auslesen.

Danach müssen die Logindaten im Script auf den Zeilen 24 und 25 eingetragen werden.

Um das Script bequemer starten zu können, empfiehlt es sich, das Ganze nach /usr/local/bin zu kopieren.

# cp sms.pl /usr/local/bin/sms

Danach kann es wie jedes andere Programm auch direkt aufgerufen werden.

Benutzung

Syntax:

$ sms 0791234567 Dies ist meine Nachricht!

Hinweise

- Ein Telefonbuch ist noch nicht implementiert, kommt wohl noch. Man kann jedoch in der .bashrc mit

export MAX=0791234567

Telefonnummern als Variable exportieren, die dann mit

$ sms $MAX Hallo Max Muster!

benutzt werden können.

- Dadurch dass das SMS mit nur einem Befehl abgeschickt werden kann, kann man sich z.B. Benachrichtigungs- oder Alarm-Cronjobs mit SMS-Benachrichtigung einrichten.

- Dank dem Tipp von Christian (Siehe Comments) kann man das Ganze auch unter Windows laufen lassen:

Es müssen nur zwei Zeilen zusätzlich angepasst werden, um das Script auf Win laufen zu lassen:
Zeile 35: my $cookiefile = “xtrazone.cookie”; # Temporary cookie file
Zeile 149: if (system(”del $cookiefile”) != 0)

Known Issues

- Ich habe bemerkt, dass man im Nachrichtentext keine Klammern verwenden kann (z.B. für Smileys). Werde das irgendwann mal noch beheben.

Download

xtrazone-sms-0.3.tar.gz (2 KB)

Sourcecode

Der Sourcecode dieses Script steht unter der CreativeCommons by-nc-sa 3.0 Lizenz. Bei Nutzung würe ich mich über einen Kommentar oder ein Feedback freuen.

#!/usr/bin/perl -w
################################################################################
# Xtrazone SMS tool v0.3 - Send an SMS via Swisscom Xtrazone
#
# Syntax: ./sms.pl 0123456789 message to be sent
#
# Author:	Danilo Bargen <gezuru@gmail.com>
# License:	CC by-nc-sa 3.0
#		(http://creativecommons.org/licenses/by-nc-sa/3.0/)
# Changes:
#	0.1	2009/09/06	Basic functionality (sending sms) as a Bash script
#	0.2	2009/09/07	Basic errorhandling, display of remaining SMS
#	0.3	2009/09/12	Rewritten the entire thing in Perl, added new features
# Required to run:
#	- Perl
# 	- Curl
# Todo:
#	- Phonebook
#	- Help option
#	- Accept message from stdin
################################################################################
 
# Edit these two lines
my $NUMBER = "1234567890";
my $PASSWORD = "password";
 
################################################################################
 
# Do not edit the following code unless you know what you're doing
 
use strict;
use warnings;
use POSIX;
 
my $cookiefile = "/tmp/xtrazone.cookie"; # Temporary cookie file
my $version = "0.3";
 
# Check whether curl is installed
if (!`which curl`)
{
	die "Error: Curl is not installed, or could not be found.\n";
}
 
if (!@ARGV) # No arguments
{
	die usage();
}
elsif (@ARGV < 2) # Only one argument
{
	die usage("No message defined.");
}
elsif ($ARGV[0] !~ m/[0-9]{10}/) # Argument 1 doesn't consist of 10 numbers
{
	die usage("Invalid cell phone number");
}
 
my $receiver = shift(@ARGV);
my $message = join(' ', @ARGV);
 
login();
send_sms();
remove_cookie();
 
################################################################################
 
# Subroutines (functions)
 
 
# How to use this script
sub usage {
	my $msg = "";
	if (@_)
	{
		$msg = "@_\n";
	}
	return $msg."Usage: sms NUMBER MESSAGE\nExample: sms 0123456789 Hello, this is my message!\n";
}
 
# Log in
sub login {
	# Curl login-request
	my $curlbody = `curl --cookie-jar $cookiefile --connect-timeout 10 --header 0 --location 1 --user-agent "Opera/9.23 (Windows NT 5.1; U; en)" --insecure --data "isiwebuserid=$NUMBER&isiwebpasswd=$PASSWORD&isiwebjavascript=No&isiwebappid=mobile&isiwebmethod=authenticate&isiweburi=/youth/sms_senden-de.aspx&isiwebargs=" https://www.swisscom-mobile.ch/youth/sms_senden-de.aspx?login 2>&1`;
 
	# Check whether login succeeded
	if ($curlbody =~ m/Swisscom Privatkunden - SMS senden/)
	{
		return 1;
	}
	elsif ($curlbody =~ m/eingegebene Passwort ist nicht korrekt./)
	{
		die "Login password not correct. Did you set it by editing this script?\n";
	}
	elsif ($curlbody =~ m/curl: \(28\) SSL connection timeout/)
	{
		die "SSL connection timeout. The server is currently not reachable.\n";
	}
	elsif ($curlbody =~ m/curl: \(7\) couldn't connect to host/)
	{
		die "SSL connection error. The server is currently not reachable.\n";
	}
	else
	{
		die "Unknown login error";
	}
}
 
# Send SMS
sub send_sms {
	# Check message length
	if (length($message) > 454)
	{
		die "Message too long (".length($message)." chars). Max characters: 454.\n";
	}
	if (length($message) > 134)
	{
		# Ask user whether he wants to sent a long SMS
		print "This is a long message, it will eat up ".ceil((length($message)+26)/160)." SMS credits. Do you really want that? [n/Y] ";
 
		my $confirmation = <STDIN>; # Get user input from stdin
		chomp($confirmation); # Remove trailing \n
 
		if ($confirmation and lc($confirmation) ne "y" and lc($confirmation) ne "yes")
		{
			die "Aborting.\n";
		}
	}
 
	# Curl send sms request
	my $curlbody = `curl --cookie $cookiefile --connect-timeout 10 --header 0 --location 1 --user-agent "Opera/9.23 (Windows NT 5.1; U; en)" --insecure --data "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE_SCM=5&__VIEWSTATE=&CobYouthSMSSenden:txtMessage=$message&CobYouthSMSSenden:txtMessageDisabled= - sent by xtrazone.ch&CobYouthSMSSenden:txtNewReceiver=$receiver&CobYouthSMSSenden:btnSend=Senden&FooterControl:hidNavigationName=SMS senden&FooterControl_hidMailToFriendUrl=youth/sms_senden-de.aspx" https://www.swisscom-mobile.ch/youth/sms_senden-de.aspx 2>&1`;
 
	if ($curlbody =~ m/Deine Nachricht wurde gesendet./)
	{
		print "SMS sent successfully.\n";
		$curlbody =~ s/^.*<span id=\"CobYouthMMSSMSKonto_lblGuthaben\">([0-9]{1,3})<\/span>.*$/$1/s;
		print "Remaining SMS credit: $curlbody\n";
	}
	elsif ($curlbody =~ m/Dies ist keine gültige Handynummer/)
	{
		die "Invalid cell phone number (Example: 0791234567).\n";
	}
	else
	{
		die "Unknown error, could not send sms.";
	}
}
 
# Remove cookie file
sub remove_cookie {
	if (system("rm $cookiefile") != 0)
	{
		die "Error removing cookie file \"$cookiefile\".";
	}
}

Kommentare

[...] Mehr Details, den Download, sowie den Sourcecode gibts unter http://blog.ich-wars-nicht.ch/xtrazone-sms-tool/. [...]

funktionier das script bei dir noch? bei mir funktioniert es nicht.

@christian: jop, bei mir funzt das ganze noch. kann sein dass swisscom einen aussetzer hatte, aber dann sollte eigentlich die entsprechende meldung kommen.

hast du perl und curl installiert?

hab gerade den fehler gefunden…
ich lass das ganze auf windows laufen. habe aber vergessen das cookie file anzupassen. dann konnte curl nicht schreiben und logischerweise dann swisscom das cookie nicht mehr auffinden…

so, nun läufts komplett auf windows. es müssen nur zwei zeilen zusätzlich angepasst werden um das script auf win laufen zu lassen:
Zeile 35: my $cookiefile = “xtrazone.cookie”; # Temporary cookie file
Zeile 149: if (system(“del $cookiefile”) != 0)

gruess

super, danke für den tipp.

Anstelle von system(“rm $cookiefile”) wäre unlink($cookiefile) portabel!

also: system(“rm $cookiefile”) != 0) || die “Error removing cookie file \”$cookiefile\”.”;

Gruess Beat (Vater von Michael)

Danke für den Hinweis. Werds fürs nächste Mal ändern. Schaue auch noch dass ich die Sache mit dem Cookiefile besser lösen kann.

Weiss allerdings nicht obs das momentan noch bringt, denn wie ich heute erfahren habe wird am 20. Oktober die neue Xtra-Zone aufgeschaltet, dann muss ich wohl ohnehin das Script nochmal überarbeiten.

das neue xtra zone ist hier und das alte script geht nicht mehr :’(

wäre dankbar, wenn du das script anpassen könntest ;)

@christian: ich weiss, ich weiss :) muss aber warten bis das swisscom login nicht mehr überlastet ist (was zu erwarten war).

bei mir läufts mehr oder weniger, zwar langsam aber mit viel geduld gehts ;)

ich bin gerade dran, dein tool dem neuen xtrazone anzupassen.
falls du interesse hast, kann ich dir den sourcecode, sobald ich fertig bin, zusenden.
ich habe noch ein paar erweiterungen eingebaut.
mein code wird nur unter windows getestet sein…

das ist opensource :)

ja, kannsts mir gerne zusenden (gezuru at gmail.com), ich werds dann hier entsprechend ergänzen und ne neue version (mit deinem namen drin) hochstellen.

Wäre super, würde mich sehr freuen, wenn ihr die neue Version hier posten würdet:)
Danke schonmal für den alten Skipt..auch wenn der im Moment dank Swisscom nicht seeeeehr hilfreich ist.
Wasauimmer die am chüechle sind……=)
lg Toby

Hier habe ich noch was gefunden, was das selbe macht, aber mit Adressbuch:
http://www.soinwi.ch/index.php?option=com_content&view=article&id=53&Itemid=65

Xtrazone SMS Tool auf Github…

Das Xtrazone SMS Tool ist ab sofort auch auf Github zu finden. Wer Github noch nicht kennt – das ist eine Website die auf dem Versionierungswerkzeug GIT basiert. Die Seite ist so konzipiert, dass sich jeder der dort registriert ist (oder auch oh…

der moment ist gekommen – nun auch mit captcha :S

@christian: kaacke… hm, dann muss ich mich wohl in diese richtung weiterbilden, das captcha sieht nicht komplex aus… aber nerven tuts schon.

hm, sieht nicht rosig aus. das captcha zu knacken wär zwar einfach, aber das login-formular wird per javascript geladen und wohl auch so abgeschickt. und curl kann das nicht…

echt schade. naja, wenn ich ne lösung finde, sag ich hier bescheid… sind ja einige applikationen davon betroffen.

@danilo: habe dir soeben mein tool per mail an gezuru at gmail.com gesendet.

Eine Lösung wäre auch, dass man das Captcha selber eingbiebt. Man bräuchte ja dann eigentlich nur den text, die Nummer und das Captcha (vor dem versenden) einzugeben. Wäre immernoch deutlich einfacher als sich durch die Seite da zu quälen…

Gruss
Michael

@michael: natürlich, daran hab ich auch schon gedacht. da problem ist – mein tool ist ein kommandozeilen-tool das ich vor allem auf einem server ohne grafische oberfläche eingesetzt habe… und auf der kommandozeile kann man leider keine bilder anzeigen. ich habs schon mit ascii-umwandlung versucht, das ist jedoch nur im vollbildmodus und bei genügender auflösung lesbar…

möglicherweise kann man das captcha aber automatisch einlesen, muss mich dafür noch etwas durch diverse anleitungen durchlesen um die software zu trainieren :)

Hallo
Ich hab eine Applikation in Java gschrieben die den sms-Login benutzt. Das heisst zwar, dass man den login-code aus einer sms eintippen muss. Aber das wäre ein einfacher weg, wenn du rein auf command line basis bleiben willst.
Funktioniert in etwa so: Seite aufrufen, gibt eine XZSESSID-cookie, damit das Formular ausfüllen, mit Handynummer und login-code aus sms. Die Antwort des Servers gibt eine neue XZSESSID, mit welcher man “eingeloggt” ist.

Auf diese Weise hab ichs geschafft dass ich mich auf der Seite einloggen kann. Ich sehe damit das Nachrichten-Formular sowie mein Adressbuch.

Ein anderes Problem ist folgendes: Nach dem Einloggen einfach einen Http-POST mit den Daten der Nachricht zu senden, klappt offensichtlich nicht. Swisscom macht hier wohl eine zusätzliche Kontrolle über AJAX bzw JavaScript.
Dasselbe geschieht auch, wenn man nach dem Einloggen JavaScript im Browser deaktiviert. Das Senden geht ins Leere..
Idee wie man diese Kontrolle umgehen kann? Bzw, mache ich einen Denkfehler mit dem simplen Senden eines POST? Analyse der Http-Header im Browser ergibt eigentlich dasselbe.

hi marc

das abtippen des sms codes ist viel zu mühsam, automatisierte benachrichtigungen (z.b. alarmierung per cronjob) würde damit nicht funktionieren.

wegen dem senden der sms – habe mich noch zu wenig damit befasst. falls ich mal mehr weiss, werde ich es hier melden.

@danilo

Mit welcher Software knackst du das Captcha? Mit pwntcha und tesseract hat’s bei mir nicht funktioniert.

Der Rest meines Skripts ist fertig: Es funktioniert gleich wie deines, ausser dass beim Senden im Moment noch das Captcha angezeigt wird und anschliessend eingegeben werden muss.

Gruss Peter

@peter: ich hab an tesseract gedacht, bin aber bisher noch nicht dazu gekommen das tool mit den swisscom-captchas zu trainieren (es gibt einen trainingsmodus). weiss aber nicht ob das überhaupt funktionieren würde, mein ziel wäre mind. 50% erfolgsrate…

captcha anzeigen kann ich in einem kommandozeilentool leider nicht :(

ah ja… den trainingsmodus hab ich noch übersehen. vielen dank!

das lustige an der url der captchas ist, wenn man das bild aktualisiert, steht zwar der gleiche text, jedoch anders verdreht :)

@peter & danilo

hab gerade was entdeckt beim suchen:

http://smssender.gorrion.ch/

mit integrierter captcha decodierung…

@christian: jackpot! danke für den link. die captcha-erkennung hat bei mir zwar bei den ersten zwei versuchen nicht geklappt. aber vielleicht kann ich trotzdem etwas vom code lernen…

@peter: ja, ist mir auch schon aufgefallen. könnte vielleicht nützlich sein, zb wenn es ocr software gibt die verschiedene quellen des selben textes einlesen kann. das gäbe stark höhere trefferquoten…

Sali danilo

ich wollte kurz fragen wie es zwischenzeitlich aussieht.

gruss christian

@christian: Hatte bisher noch keinen Erfolg mit Captcha-Knacken (bzw noch keine Zeit es gross zu probieren, da Prüfungszeit). Werds diesen Sommer aber wohl nochmal versuchen.

So, ich werde das Tool wohl in Form eines Linux-Daemons neu schreiben und mir das SMS-Login in Verbindung mit der persistenten Verbindung zu nutze machen. Dann reicht ein Seiten-Reload alle 2h, um das Login zu halten.

Für Windows-User nicht brauchbar, aber nützlich für auf einem Server oder einer Linux-Workstation. Wenn auch nicht so komfortabel wie vorher…

Habe allerdings hier noch ein paar interessante Perl-Scripts gefunden, die mir vielleicht beim Lösen des Captchas helfen könnten. Bisher fehlte mir aber meistens die Zeit dazu…

Hinterlasse einen Kommentar

Dein Kommentar:

XHTML: Sie dürfen folgende Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">