Anrufe aus einer Liste.Auf den AB schalten!Anfanger

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Hi.
Ich Bau wegen lästiger Werbeanrufern 3 mal Täglich
Ein Anrufbantworter der nur diese nummern die in einer liste stehen
annimmt.Das geht mit capisuite (linux)
hier http://www.capisuite.de/de-manual/ch02s04.html
Ist eine kleine Anleitung mit der ich nicht klar komme.
Ich habe von pyton kein plan.
ich habe

Code: Alles auswählen

import capisuite,cs_helpers

my_path="/root/capisuite-examples/"

def callIncoming(call,service,call_from,call_to):
        try:
                if (call_to=="123456" && call_from in (open("/etc/capisuite/banned_caller.conf").read().split())):
                        filename=cs_helpers.uniqueName(my_path,"voice","la")
                        capisuite.connect_voice(call,1)
            #            capisuite.audio_send(call,my_path+"announce.la")
                        capisuite.audio_send(call,my_path+"beep.la")
                        capisuite.audio_receive(call,filename,20,3)
                        capisuite.disconnect(call)
                else:
                        capisuite.reject(call,1)
        except capisuite.CallGoneError:
                capisuite.disconnect(call)
Ich wollte eine kleine Liste einbauen in der nummern stehen die
automatisch in den AB laufen.Also in der if schleife.

Code: Alles auswählen

fritzbox:~/capisuite-examples# python ./example.py
  File "./example.py", line 7
    if (call_to=="123456" && call_from in
                           ^
SyntaxError: invalid syntax
fritzbox:~/capisuite-examples#
Ist dieser Ansatz überhaupt richtig?
call_to scheint die Variable der angerufenden nummer zu sein.
Wen das so ist wird alles in der ifanweisung ausgeführt.
Wenn nicht dan nix.

Ich wollte nun das wenn die call_to stimmt
Auchnoch nachgesehen wird ob call_from in der Liste steht /etc/capisuite/banned_caller.conf.

Dann erst soll der AB geschaltet werden.

Wie muß das richtig ausehen.
Bash kann ich wie ein grßer aber ein
grep -q "$call_from" /etc/capisuite/banned_caller.conf && killanruf >/dev/null

gibt es ja nicht ;)

Edit (BlackJack): Quelltext in Code-Tags gesetzt.
BlackJack

@kabu: Wenn Du von Python keinen Plan hast, dann sorg doch erstmal dafür, dass Du einen bekommst. In der Dokumentation ist zum Beispiel ein Tutorial.

Die Fehlermeldung zeigt ziemlich deutlich auf das ``&&``. So drückt man die Und-Verknüpfung von Bedingungen in Python nicht aus.

Klammern braucht man um Bedingungen in Python nicht.
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

import capisuite,cs_helpers

my_path="/root/capisuite-examples/"

def callIncoming(call,service,call_from,call_to):
try:
if (call_to=="xxxxx" and call_from==(open("/etc/capisuite/banned_caller.conf").read().split())):
filename=cs_helpers.uniqueName(my_path,"voice","la")
capisuite.connect_voice(call,1)
# capisuite.audio_send(call,my_path+"announce.la")
capisuite.audio_send(call,my_path+"beep.la")
capisuite.audio_receive(call,filename,20,3)
capisuite.disconnect(call)
else:
capisuite.reject(call,1)
except capisuite.CallGoneError:
capisuite.disconnect(call)
stimmt.
Nur das ich schlecht testen kann.
jetzt greift die ifabfrage nur wenn in der conf irgendwas steht dann schaltet die immer.
Da das skript nur in verbindung mit capisuite läuft (ich glaube wegen den modulen)
habe ich kein Testfeld vielleicht so?

#!/usr/bin/python
call_to=xxxx
call_from=123
if (call_to=="xxxx" and call_from==(open("/etc/capisuite/banned_caller.conf").read().split())):
print "treffer"
else
print "nix"

gibt mir
fritzbox:~# ./test
File "./test", line 4
if (call_to=="xxxx" and call_from==(open("/etc/capisuite/banned_caller.conf").read().split())):
^
IndentationError: unexpected indent
Natürlich mache ich Fehler die in der Bash nicht so sind.
Ich wußte garnicht das das einrücken hier so wichtig ist naja aber ok..;)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kabu hat geschrieben:Ich wußte garnicht das das einrücken hier so wichtig ist naja aber ok..;)
Komplett ohne auch nur elementares Wissen eine Programmiersprache zu verwenden muss einfach schief gehen.

Die Informationen über das Einrücken in Python findest du weit vorne im Tutorial.
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Wenn man Bash nicht als Programiersprche ansieht kann ich nix.
Wenn doch dann...
Kann ich gut was.

ich habe jetzt das so hingerückt.

#!/usr/bin/python
call_to=111
call_from=123
if (call_to=="111" and call_from==(open("/etc/capisuite/banned_caller.conf").read().split())):
print "treffer"
else:
print "nix"

Schreibe ich in die conf nun 123
kommt immer noch nix.
fritzbox:~# ./test
nix
fritzbox:~#
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Im grunde geht es ja nur um diesen snipsel.
..and call_from==(open("/etc/capisuite/banned_caller.conf").read().split())
Der soll die Variable in der conf suchen.

edit kammman nicht was aus der bash nehmen?

and grep -q "$call_from" /etc/capisuite/banned_caller.conf
oder so?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

111 != "111"
MfG
HWK
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

ne!
Das meinete ich ja nicht.
Also noch kürzer

fritzbox:~# echo "123" > /etc/capisuite/banned_caller.conf

config erstellt mit inhalt 123.

fritzbox:~# cat test
#!/usr/bin/python
call_from=123
if (call_from==(open("/etc/capisuite/banned_caller.conf").read())):
print "treffer"
else:
print "nix"
fritzbox:~#

so sieht das skript aus.

fritzbox:~# ./test
nix
fritzbox:~#

Aber es soll treffer heißen?

Und sollte die datei nicht auch zu gemacht werden?

Oder vorher die liste in einer schleife durchlaufen lassen und bei treffer eine variable setzen.
Aber wie in python.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

kabu hat geschrieben:Aber es soll treffer heißen?
"123" != 123 ;)
kabu hat geschrieben:Und sollte die datei nicht auch zu gemacht werden?
Ja, schließen solltest du.
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

"123" != 123 ??

hä?Die Varible ist doch richtig übergeben?
wenn ich
print call_to
hizufügt spuckt er mir 123 aus.also richtig übergeben.
Nur nicht in der conf nachgesehen ob sie das auch steht.

Und wie schließe ich das in einem Einzeiler oder hat vielleicht einer zu
genau zu diesem thema was zu lesen.
Ich weiß noch nichtmal wonach ich googeln muß!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

kabu hat geschrieben:Aber wie in python.
Den entscheidenden Hinweis hast du schon bekommen: Nimm dir Zeit und arbeite das Python-Tutorial so weit durch, bist du weißt, die du dein Problem lösen kannst.

Edit: Nicht googeln, lesen: http://tutorial.pocoo.org/
BlackJack

@kabu: Benutze in Zukunft für Python-Quelltext hier im Forum bitte die Code-Tags, damit man die Einrückung auch sehen kann. Wie diese Tags aussehen kannst Du Dir zum Beispiel im ersten Beitrag anschauen, wenn Du auf "Edit" klickst.

Zu Deinem Problem:

Code: Alles auswählen

In [195]: a = '123'

In [196]: b = 123

In [197]: a == b
Out[197]: False
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

kabu hat geschrieben:Ich wollte eine kleine Liste einbauen in der nummern stehen die automatisch in den AB laufen.Also in der if schleife.
http://if-schleife.de/
the more they change the more they stay the same
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Ach mann ich wollte hilfe und kein lehrberuf.

Ich habe beruflich nix mit IT zu tun aber Hobbymäßig.
Ich Helfe in einem Linuxforum mit dem BS system als " Entwickler" aus wo ich kann.
Die skripte die ich U.a baue sind dafür das user ohne kentnisse dies Distubtion bedienen können.
Ich scheibe unter anderen eine dafür auch eine LiveCD damit man dieses auch testen kann
Dazu noch den Installer für die neuste Version die in moaten raukommen wird.
Der das den Leuten auf die Platte bringen wird.Natürlich alles mit Bash
Nebenbei mußte ich mir einen

LennyDruckserver (cups)
mit XenKernel
Der Endian in der Domu laufen hat.
Dazu in der
Domu2 noch die fritzbox mit durchgeschleifter Fitzkarte (pcibacked)
capiusuite Damit endlich mit den Callcenteranrufern schluß ist.
Dann bleibe ich nun an einem pyton skript hängen was für euch 5 minuten eurer Zeit in anspruch nehmen würde.
Das kürzer dauert würde als Dieses hier zu schreiben und.
Ich kriege den hinweiß auf ein tutorial
Ich wollte jetzt kein python lernen.
nur die nummern abweisen.Danke.

vielleicht schaffe ich es ja noch in dieser Woche.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Wenn du aus einer Textdatei etwas einliest bekommst du einen String. Wenn du den mit einer Zahl vergleichst, ist das ungleich.

Code: Alles auswählen

In [1]: '123' == 123
Out[1]: False

In [2]: 123 == 123
Out[2]: True

In [3]: '123' == '123'
Out[3]: True

In [4]: str(123) == '123'
Out[4]: True

In [6]: 123 == int('123')
Out[6]: True
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Code: Alles auswählen

#!/usr/bin/python
call_from=67553434634646346346

datei = open("/etc/capisuite/banned_caller.conf", "r")
x = datei.read().split()
print x #zu testen was drinnesteht.
for zeile in x:
	if zeile == str(call_from):
		print "treffer"
		break
	else:
		print "nix"
datei.close()
fritzbox:~# echo "67553434634646346346" >> /etc/capisuite/banned_caller.conf
fritzbox:~# ./test
['12', '67', '13', '67', '76', '67553434634646346346']
nix
nix
nix
nix
nix
treffer
fritzbox:~#
drauf gekommen das es str(variableirgendwas) heißen muß
Bin ich als ich mal die variable und call_from im skript zusammen rechnen lassen wollte.Da kam dann das
fritzbox:~# ./test
['12', '67', '13', '67', '76']
12
67
Traceback (most recent call last):
File "./test", line 19, in <module>
r=zeile+call_from
TypeError: cannot concatenate 'str' and 'int' objects
fritzbox:~#
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# wieso nicht gleich als String, wenn es schon fix im Code steht?
call_from = "67553434634646346346"

# mapper für die Ausgabe als Dictionary
ouput = {
    True: "treffer",
    False: "nix"
}

# es kann ein IOError auftreten, also fangen wir den mal ab
try:
    # mit with wird die Datei auf jeden Fall geschlossen
    with open(r"/etc/capisuite/banned_caller.conf", "r") as in_file:
        # für Anfänger sicher tricky:
        # any(iterable) -> einmal True -> insgesamt True
        # danach eine list comprehension
        #    in_file.readlines() iteriert über jede Zeile der Datei
        #    anstelle von zeile generieren wir eine Liste von Trues, WENN
        #    die Bedingung am Schluss erfüllt ist (kann ja mehrfach vorkommen)
        # state = any([True for zeile in in_file.readlines() if zeile==call_from])
        # Ok, hier die richtige und konzeptuell bessere Variante von BlackJack
        state = any(call_from == line.strip() for line in in_file)
except IOError, e:
    print e
else:
    # Je nach Wert von State wird der entsprechende Wert des Dicts ausgegeben.
    print output[state]
Zuletzt geändert von Hyperion am Dienstag 12. Januar 2010, 23:27, insgesamt 1-mal geändert.
BlackJack

Mir stellt sich irgendwie die Frage, warum Du überhaupt eine Zahl verwendest. Du könntest die Telefonnummer auch gleich als Zeichenkette schreiben, denn letztendlich sind Telefonnummern auch keine Zahlen. Niemand rechnet damit -- es macht keinen Sinn sie zu addieren, zu dividieren, oder 19% Mehrwertsteuer von einer Telefonnummer zu berechnen. ;-)

Und dann ginge auch der einfache ``in``-Test statt einer Schleife.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

call_from = "67553434634646346346"

ouput = {
    True: "treffer",
    False: "nix"
}

try:
    with open(r"/etc/capisuite/banned_caller.conf", "r") as in_file:
        # so gehts ja noch einfacher :-)
        print output[call_from in in_file.read().split()]
except IOError, e:
    print e
Zuletzt geändert von Hyperion am Dienstag 12. Januar 2010, 23:25, insgesamt 1-mal geändert.
BlackJack

@Hyperion: WTF!? Mal abgesehen vom einfacheren Test mit ``in`` klappt das schonmal so nicht weil die Zeilen in der Datei mit einem Zeilenende-Zeichen enden, also nicht gleich einer Telefonnummer ohne dieses sein werden. Und dann ist das Argument von `any()` viel zu umständlich. Eine "list comprehension" statt eines Generatorausdrucks, `readlines()` statt über das Dateiobjekt iterieren, literales `True` und angehängte ``if``-Bedingung statt *vorne* einfach *nur* die Bedingung. Also: ``any(call_from == line.strip() for line in in_file)``
Antworten