Seite 1 von 2
Anrufe aus einer Liste.Auf den AB schalten!Anfanger
Verfasst: Dienstag 12. Januar 2010, 11:09
von kabu
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.
Verfasst: Dienstag 12. Januar 2010, 11:26
von 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.
Verfasst: Dienstag 12. Januar 2010, 11:48
von kabu
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..

Verfasst: Dienstag 12. Januar 2010, 11:54
von /me
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.
Verfasst: Dienstag 12. Januar 2010, 11:58
von kabu
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:~#
Verfasst: Dienstag 12. Januar 2010, 12:01
von kabu
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?
Verfasst: Dienstag 12. Januar 2010, 14:10
von HWK
111 != "111"
MfG
HWK
Verfasst: Dienstag 12. Januar 2010, 15:09
von kabu
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.
Verfasst: Dienstag 12. Januar 2010, 15:13
von derdon
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.
Verfasst: Dienstag 12. Januar 2010, 15:40
von kabu
"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ß!
Verfasst: Dienstag 12. Januar 2010, 15:41
von numerix
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/
Verfasst: Dienstag 12. Januar 2010, 15:44
von 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
Re: Anrufe aus einer Liste.Auf den AB schalten!Anfanger
Verfasst: Dienstag 12. Januar 2010, 16:01
von Dav1d
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/
Verfasst: Dienstag 12. Januar 2010, 16:08
von kabu
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.
Verfasst: Dienstag 12. Januar 2010, 16:14
von jbs
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
Verfasst: Dienstag 12. Januar 2010, 22:49
von kabu
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:~#
Verfasst: Dienstag 12. Januar 2010, 23:01
von Hyperion
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]
Verfasst: Dienstag 12. Januar 2010, 23:04
von 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.
Verfasst: Dienstag 12. Januar 2010, 23:06
von Hyperion
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
Verfasst: Dienstag 12. Januar 2010, 23:12
von 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)``