Ansage des Guthabens bei Sipgate

otaku42

Admin-Team
Mitglied seit
26 Mrz 2004
Beiträge
1,670
Punkte für Reaktionen
0
Punkte
36
Hier wurde mal der Wunsch laut nach einer Moeglichkeit, sich das aktuelle Guthaben bei Sipgate ansagen zu lassen. Ich habe das passende Skript schon eine ganze Weile bei mir im Einsatz, allerdings ist es ziemlich rudimentaer und war bisher nicht wirklich release-faehig. Heute habe ich mir endlich die Zeit genommen, es ein wenig aufzubereiten - es ist nicht wirklich DAU-sicher, aber halbwegs erfahrene Asterisk- und Linux-User sollten damit zurechtkommen. Eine rudimentaere Installations-Anleitung findet sich im Archiv (siehe Datei INSTALL).

Ich habe das Skript hier mit einer aelteren Asterisk-Version im Einsatz (basierend auf bri-stuff-0.1.0-RC2k). Eventuell sind Anpassungen fuer neuere Asterisk-Versionen notwendig.

Viel Spass beim Ausprobieren.
 

Anhänge

  • sipgate_guthaben_agi-0.1.0.tar.gz
    68.1 KB · Aufrufe: 126
Ständige Ansage: 1 Euro und 1 Cent

Hallo zusammen,

leider bekomme ich beim Einsatz des Skriptes von otaku42 immer nur die Guthabenansage "1 Euro und 1 Cent", das ist aber definitiv falsch. :shock:
Was ich bisher aber herausfinden konnte, ist, daß die Extraktion des Guthabens aus der Website wohl funktioniert, also muß der Fehler irgendwo danach liegen.

Hat irgendeiner noch dasselbe Problem, und wie habt Ihr es gelöst?

Desweiteren würde mich noch interessieren, wie man das Script abändern könnte, damit es auch bei anderen Providern (für mich wäre web.de interessant) das Guthaben ausgibt.

Gibt es hier einen, der die korrekte Adresse bei web.de weiß, wo ich den Betrag der Web-Cents ablesen kann?!?

Für Eure Antworten schon danke im Voraus.

Grüße

Dora71.
 
bei mir kam auch immer nur 1 euro und ein cent. ich habe mir
dann anhand der vorlage ein kleines perl-script gebaut. leider
hatte ich probleme mit dem direkten http zugriff in perl und hab
mir einfach otaku42's wget komando geklaut :roll:

Code:
#!/usr/bin/perl

package sipgate_account_info;

use strict;
use Asterisk::AGI;
use HTML::Parser;
use vars qw(@ISA);

@ISA = qw(HTML::Parser);

my $AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();

$AGI->stream_file('one-moment-please');

my $url = 'https://secure.sipgate.de/user/index.php';
my $file = '/tmp/.sipgate';
my $user = 'myname';
my $pass = '****';
my $content;

`wget --quiet --cookies=on --post-data="uname=$user&okey.x=9&okey.y=21&passw=$pass" -O $file $url`;

my $tree = __PACKAGE__->new();

$tree->unbroken_text(0);

$tree->parse_file($file) or die "Cannot parse HTML tree";

my ($euro, $cent) = $content =~/aktueller Kontostand: \€ (\d+)\,(\d+)/;

$euro ||= 0;
$cent ||= 0;

$AGI->stream_file('card-balance-is');
$AGI->say_digits($euro);
$AGI->stream_file('debit/euro');
$AGI->stream_file('debit/and');
$AGI->say_digits($cent);
$AGI->stream_file('debit/cent');

exit;

sub text {
  my $class = shift;
  my $text = shift;

  $text =~s/\/ /g;
  return if $text=~/^(\s*)$/;
  $content .= $text;
}

mein erster beitrag als kleiner versuch mich fuer die vielen vielen infos zu bedanken 8)
 
Ich habe mich mal ein bisschen mit AGI-Scripting beschäftigt und stelle euch hier meine verbesserte Version des Gebührenansage-Scriptes vor. Eigentlich war ja gedacht, dass Guthaben direkt vor dem Gespräch ansagen zu lassen. Das scheiterte jedoch daran, dass die Webanfrage einige Sekunden dauert und man nicht vor jedem Gespräch solange warten möchte.

Deshalb habe ich mir überlegt, dass man die Gebührenabfrage ab und zu durchführt (dazu unten weiteres) und dann bei Gesprächsbeginn den Guthabenbetrag einfach nur aus einer lokalen Datei einliest und ansagt.

Die Gebührenabfrage sollte idealerweise einfach am Ende jedes sipgate-Gespräches stattfinden. Wenn man immer nur über Asterisk mit dem entsprechenden Account telefoniert dürfte das Guthaben dann immer korrekt sein (außer beim ersten Gespräch nach dem Aufladen des Guthabens). Mein Problem ist jedoch, dass ich es nicht hinkriege, der extensions.conf mitzuteilen, dass ein bestimmtes Script am Ende immer auszuführen ist, egal in welchem Zustand das Gespräch abgebrochen wurde. Mit meiner jetzigen Einstellung ...

Code:
; Wenn über sipgate gewählt werden soll, wird eine 3 vorgewählt:
exten => _3.,1,SetCallerId,1836998
exten => _3.,2,Wait(1)
exten => _3.,3,AGI(sipgate-guthaben-ansage.agi)
exten => _3.,4,Wait(2)
exten => _3.,5,Dial(SIP/${EXTEN:1}@sipgate,30,trg)
exten => _3.,6,AGI(sipgate-guthaben-abfrage.agi)
exten => _3.,7,Hangup

... funktioniert das nur, wenn der andere Gesprächsteilnehmer zuerst auflegt und ich warte bis das Script gestartet ist. Man könnte das auch als System-Befehl absetzen:
Code:
exten => _3.,6,System(/var/lib/asterisk/agi-bin/sipgate-guthaben-abfrage.agi &)

Weiterhin besteht jedoch das Problem, dass nichts ausgeführt wird, wenn ich zuerst auflege.

Man könnte das Abfrage-Skript auch per cron-job ab und zu starten, aber das ist halt nicht sooo schön, weil das Guthaben dann nicht immer korrekt angesagt wird.

Kann mir da jemand helfen??

Zum Script: Ich habe erstmal keine INSTALL-Anleitungen etc. eingebaut. Einfach nach der Anleitung von otaku42 vorgehen und dann die beiden Dateien sipgate-guthaben-abfrage.agi und sipgate-guthaben-ansage.agi in das agi-bin Verzeichnis schreiben und den extensions.conf-Abschnitt von oben übernehmen oder wie gewünscht anpassen.
 

Anhänge

  • sipgate_guthaben_agi-0.2.0.tar.gz
    1.6 KB · Aufrufe: 49
Hallo,

habe jetzt alle Scripte ausprobiert aber bei keinem wird das korrekte
Guthaben geholt :(

Hat sich da was bei Sipgate geändert?

Gibt es eine sicher funktionierende Version?

Danke für eine Info und eine evtl. neue Version.
 
@pcexperte

Ich benutze das script von dominicn, dort habe ich Änderungen an der cat / egrep Zeile in der Datei sipgate-guthaben-abfrage.agi vornehmen müssen:

Alles in eine Zeile schreiben:

betrag=$(cat $guthaben | egrep '\"farb\">&euro; [0-9]+,[0-9]+' | cut --delimiter=";" -f2 | cut --delimiter="<" -f1

Weiteres Problem was ich hatte: bei mir lag wget nur in der Version 1.8 vor, die das benutzte --post-data als Option noch nicht unterstützt. Mit wget 1.9 ging's dann. Link:

http://www.linuxfromscratch.org/blfs/view/stable/basicnet/wget.html

@dominicn
Das Hangup an der Stelle weglassen und den context so aufbauen:

exten => _3.,1,SetCallerId,1836998
exten => _3.,2,Wait(1)
exten => _3.,3,AGI(sipgate-guthaben-ansage.agi)
exten => _3.,4,Wait(2)
exten => _3.,5,Dial(SIP/${EXTEN:1}@sipgate,30,trg)

exten => h,1,AGI(sipgate-guthaben-abfrage.agi)
exten => h,2,Hangup

Gruß,
Tin
 
Hallo zusammen,

kann es sein das sipgate etwas an der Url geändert hat ? ich bekomme, wenn ich lediglich die wget-zeile ausführe die Meldung, das username oder pw falsch sind ( sind aber die richtigen ).

Viele Grüße

nomit2
 
Ich habe den Asterisk leider nicht mehr im Betrieb. Aber sipgate hat doch jetzt selbst eine Guthabenansage implementiert. Kann man unter meine Daten -> Daten zum Anschluss -> Tarifansage ein- und ausschalten.
 
hi dominicn,

erstmal vielen Dank für dein Posting. Du hast recht, das kann man bei sipgate machen, allerdings möchte ich für mich das Guthaben nicht angesagt bekommen ( da es teilweise Callbacks sind, da bekomme ich es ja eh nicht mit :) ) sondern als "text" bei mir auf dem Rechner haben, um es in andere Skripte wie z.b. Mail oder SMS einzubinden. Aus diesem Grund ist für mich der wget Befehl wichtig. Aber da hat sipgate wohl was geändert.

Trotzdem nochmals vielen Dank

btoe2
 
Wie hoch ist der Aufwand, diesen Script soweit anzupassen, dass der mir das aktuelle Guthaben meines dialnow-accounts ansagt?
 
Schau Dir mal

FINCHECK

an, da findest Du (in PHP - alternativ gibts das da auch als bash-Skript) eine Methode creditcents, die das Guthaben ermittelt. Das dann der Ansage zu übergeben, ist letztlich simpel.
Falls Bedarf besteht: ich hab' das ganze für die BETAMAXe auch als Perl-Fassung (für Guthabenabruf und SMS-Versand) -> einfach PM senden.
 
So, hat ein wenig gedauert. Das Skript ist zwar quick&dirty, funktioniert aber mit allen mir bekannten Betamax-Klonen. Es liefert jetzt in der mit der Variable BFILE konfigurierbaren Datei genau den Output, den das Ansage-AGI aus der 2. Version erwartet (kommaseparierter Betrag mit Zeilenumbruch am Ende).

Für die Verwendung wird WWW::Curl von CPAN benötigt, dieses wiederum braucht libcurl.
Eine funktionierende Variante ohne curl ist mir leider nicht bekannt

Als Parameter werden übergeben: Seite incl. Domain (also z.B.: voipcheap.com)
Benutzername
Passwort

Wer will, kann sich noch asugeben lassen, ob er Freedays hat und wie viele (im Skript: $myfree -> 0 bedeutet keine FreeDays, sonst FreeDays in Tagen)

Code:
#! /usr/bin/perl -w

use WWW::Curl::Easy;

sub writeBMCallback {
        my ($data, $pointer) = @_;
        ${$pointer}=${$pointer}.$data;
        return length($data);
}

sub headerBMCallback {
  my($data, $pointer) = @_;

  return length($data);
}

sub betamax_curl () {
        my $body='';
        my $curl = new WWW::Curl::Easy;
        $curl->setopt(CURLOPT_HEADER, 1);
        $curl->setopt(CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7');
        $curl->setopt(CURLOPT_FOLLOWLOCATION, 1);
        $curl->setopt(CURLOPT_FAILONERROR, 1);
        $curl->setopt(CURLOPT_COOKIEJAR, $sCookie_File);
        $curl->setopt(CURLOPT_COOKIEFILE, $sCookie_File);
        $curl->setopt(CURLOPT_SSL_VERIFYPEER, 0);
        $curl->setopt(CURLOPT_WRITEFUNCTION, \&writeBMCallback );
        $curl->setopt(CURLOPT_HEADERFUNCTION, \&headerBMCallback );
        $curl->setopt(CURLOPT_FILE, \$body);
        if ($_[1] =~ 'POST') {
                $curl->setopt(CURLOPT_POST, 1);
                $curl->setopt(CURLOPT_POSTFIELDS,"username=$_[2]&password=$_[3]");
        }
        $curl->setopt(CURLOPT_URL,$_[0]);
        $curl->perform();
        my $err = $curl->errbuf;
        return $body;
}



$MYSITE=$ARGV[0];   #Seite, z.B. voipcheap.com, nonoh.net etc.
$MYUSER=$ARGV[1];   #Username
$MYPASS=$ARGV[2];   #Passwort

# hier gewünschten Pfad eintragen
my $BFILE = '/var/lib/asterisk/data/betamax';


# Check user data at Provider
$sCookie_File = "/tmp/bm.cookie";
$url='https://myaccount.'.$MYSITE.'/clx';
if ( $MYSITE eq 'nonoh.net' ) {
        $url1='/contacts.php';
} else {
        $url1='/index.php?part=menu&justloggedin=true';
}

&betamax_curl($url.'/','POST',$MYUSER,$MYPASS);
&betamax_curl($url.$url1,'GET');
my $content=&betamax_curl($url.$url1,'GET');
my $sHTML_File="/tmp/bm.html";
open(HTML, '>'.$sHTML_File);
print HTML $content;
close(HTML);

system("lynx /tmp/bm.html --dump --nolist --nomargins > /tmp/bm.txt") == 0 or die "Keine Verarbeitung moeglich";
unlink($sHTML_File);
my $sTXT_File="/tmp/bm.txt";
open(TXT, '<'.$sTXT_File);
open(BF, '>'.$BFILE);
my $afree=0;
my $acredit=0;
while (<TXT>) {
        if (( $MYSITE ne 'nonoh.net' ) && ( $_ =~ m/Freedays/ )) {
                $afree=1;
        } elsif (( $MYSITE eq 'nonoh.net' ) && ( $_ =~ m/freedays/ )) {
                $myfree=$_;
                $myfree=~ s/[^0-9]//g;
                if ( length($myfree) eq 0 ) { $myfree = 0; }
                $afree=0;
                last;
        } elsif (( $MYSITE ne 'nonoh.net' ) && ( $_ =~  m/Remaining credit/ )) {
                $acredit=1;
        } elsif (( $MYSITE eq 'nonoh.net' ) && ( $_ =~  m/You have/ ) && ( $_ =~  m/credit/ )) {
                $mymoney=$_;
                $mymoney=~ s/[^0-9\.]//g;
                $mymoney=~ s/\./\,/;
                print(BF $mymoney."\n");
                $acredit=0;     
        } elsif ($acredit eq 1) {
                $mymoney=$_;
                $mymoney=~ s/[^0-9\.]//g;
                $mymoney=~ s/\./\,/;
                print(BF $mymoney."\n");
                $acredit=0;
        } elsif ($afree eq 1) {
                $myfree=$_;
                $myfree=~ s/[^0-9]//g;
                if ( length($myfree) eq 0 ) { $myfree = 0; }
                $afree=0;
                last;
        }
}
close(TXT);
close(BF);
unlink($sTXT_File);
&betamax_curl($url.'/index.php?part=logoff','GET');
unlink($sCookie_File);
 
Zuletzt bearbeitet:
Ich habe mal das, was da im
Code:
 steht in die Datei "test" rein getan und dort aus dem [code]
$MYSITE=$ARGV[0];   #Seite, z.B. voipcheap.com, nonoh.net etc.
$MYUSER=$ARGV[1];   #Username
$MYPASS=$ARGV[2];   #Passwort
ein
Code:
$MYSITE=nonoh.net
$MYUSER=PsychoMantis
$MYPASS=meinpwd
gemacht.
"./test" bringt aber leider nur
Code:
Can't locate WWW/Curl/Easy.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./test line 3.
BEGIN failed--compilation aborted at ./test line 3.

Habe auch danach "apt-get install curl" eingegeben,
Code:
vs729:~# apt-get install curl
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
  ca-certificates libcurl3 libidn11 openssl
Die folgenden NEUEN Pakete werden installiert:
  ca-certificates curl libcurl3 libidn11 openssl
0 aktualisiert, 5 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 1545kB Archive geholt werden.
Nach dem Auspacken werden 3690kB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren [J/n]? j
Hole:1 http://ftp.de.debian.org etch/main libidn11 0.6.5-1 [116kB]
Hole:2 http://ftp.de.debian.org etch/main openssl 0.9.8c-4etch1 [1001kB]
Hole:3 http://ftp.de.debian.org etch/main ca-certificates 20070303 [97,2kB]
Hole:4 http://ftp.de.debian.org etch/main libcurl3 7.15.5-1etch1 [168kB]
Hole:5 http://ftp.de.debian.org etch/main curl 7.15.5-1etch1 [163kB]
Es wurden 1545kB in 0s geholt (2697kB/s)
Vorkonfiguration der Pakete ...
Wähle vormals abgewähltes Paket libidn11.
(Lese Datenbank ... 14209 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacke libidn11 (aus .../libidn11_0.6.5-1_i386.deb) ...
Wähle vormals abgewähltes Paket openssl.
Entpacke openssl (aus .../openssl_0.9.8c-4etch1_i386.deb) ...
Creating directory /etc/ssl
Wähle vormals abgewähltes Paket ca-certificates.
Entpacke ca-certificates (aus .../ca-certificates_20070303_all.deb) ...
Wähle vormals abgewähltes Paket libcurl3.
Entpacke libcurl3 (aus .../libcurl3_7.15.5-1etch1_i386.deb) ...
Wähle vormals abgewähltes Paket curl.
Entpacke curl (aus .../curl_7.15.5-1etch1_i386.deb) ...
Richte libidn11 ein (0.6.5-1) ...

Richte openssl ein (0.9.8c-4etch1) ...

Richte ca-certificates ein (20070303) ...
Updating certificates in /etc/ssl/certs....done.

Richte libcurl3 ein (7.15.5-1etch1) ...

Richte curl ein (7.15.5-1etch1) ...
(Da kam erst so eine Abfrage was ich machen möchte bei neuen Zertifikaten (Option Ja, Nein, Fragen) - habe Fragen genommen).

aber auch danach bleibt die Fehlermeldung die selbe :-(
 
Für die Verwendung wird WWW::Curl von CPAN benötigt

Das heißt, dir fehlt noch

Code:
# perl -MCPAN -e shell

cpan> reload cpan
cpan> install WWW::Curl

und dann funktioniert das auch.
Deine Fehlermeldung

Can't locate WWW/Curl/Easy.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at ./test line 3.
BEGIN failed--compilation aborted at ./test line 3.

sagt nämlich nur, dass genau das notwendige Perl-Modul nicht installiert ist.
 
Ja, dass mir was fehtl, habe ich auch gemerkt. Nur was ist die Frage.
Ich müsste ja nur apt-get install nochwas eingeben, dann müsste es gehen. Aber was fehlt???
 
siehe oben auf der Konsole über CPAN installieren.

Du kannst dennoch auch mal per Paketverwaltung versuchen

Code:
apt get install libwww-curl-perl

Das Paket (CPAN-Version 3.02, aktuell ist 4.0) müßte auch mit libcurl3, die Du ja installiert hast, klaglos zusammenarbeiten.
 
Danke. Das hat die Fehlermeldung beseitigt. Dafür bekomme ich jetzt eine andere:
Code:
vs729:~# ./test
Unquoted string "nonoh" may clash with future reserved word at ./test line 42.
Unquoted string "meinpwd" may clash with future reserved word at ./test line 47.
syntax error at ./test line 47, near "meinpwd               #Passwort

# hier gewünschten Pfad eintragen
my "
Execution of ./test aborted due to compilation errors.
vs729:~#
 
Hatte ich übersehen:

Wenn Du die Parameter direkt ins Skript setzt, müssen sie "gequuoted" werden und die Zeilen müssen mit ; abgeschlossen sein, also

$MYSITE="nonoh.net";
$MYUSER="PsychoMantis";
$MYPASS="meinpwd";
 
Stimmt, hatte ich auch gerade rausgefunden :)
Dafür kommt ne andere Fehlermeldung:
Code:
sh: lynx: command not found
Keine Verarbeitung moeglich at ./test line 67.

Also apt-get install lynx

Nun:
Code:
lynx: Ungültige Option: --nomargins
Keine Verarbeitung moeglich at ./test line 67.

Also gut, "--nomargins" entfernt aus meinem test nun
Code:
print() on closed filehandle BF at ./test line 89, <TXT> line 18.

Und nun weiß ich auch nicht weiter.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.