| author | Sandro Knauß <knauss@netzguerilla.net> |
| Sat, 18 Feb 2012 19:50:36 +0100 | |
| branch | devel |
| changeset 172 | adfe245c377d |
| parent 129 | iro/anbieter/smstrade.py@d6704178a18f |
| child 180 | 55ab949cf0f8 |
| permissions | -rw-r--r-- |
| 9 | 1 |
# -*- coding: utf-8 -*- |
2 |
#Copyright (C) 2009 Georg Bischoff |
|
3 |
||
4 |
#This program is free software; you can redistribute it and/or modify it under the terms |
|
5 |
#of the GNU General Public License as published by the Free Software Foundation; |
|
6 |
#either version 3 of the License, or any later version. |
|
7 |
#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
|
8 |
#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
9 |
#See the GNU General Public License for more details. |
|
10 |
||
11 |
#You should have received a copy of the GNU General Public License |
|
12 |
#along with this program; if not, see <http://www.gnu.org/licenses/>. |
|
13 |
||
14 |
||
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
15 |
import urllib |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
16 |
import copy |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
17 |
from functools import partial |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
18 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
19 |
from ..error import UnknownOption, NeededOption |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
20 |
from ..model.status import Status |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
21 |
from .provider import Provider |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
22 |
from ..offer import providers |
| 9 | 23 |
|
|
23
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
24 |
import logging |
|
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
25 |
logger=logging.getLogger("smstrade") |
|
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
26 |
|
| 15 | 27 |
class UnknownStatusCode(Exception): |
28 |
def __init__(self,code): |
|
29 |
self.code=code |
|
| 9 | 30 |
|
| 15 | 31 |
def __str__(self): |
32 |
return "StatusCode %i is unknown"%self.code |
|
| 9 | 33 |
|
34 |
||
| 15 | 35 |
class StatusCode: |
36 |
statusCodes = {10 : "Empfaengernummer nicht korrekt", |
|
| 9 | 37 |
20 : "Absenderkennung nicht korrekt", |
38 |
30 : "Nachrichtentext nicht korrekt", |
|
39 |
31 : "Messagetyp nicht korrekt", |
|
40 |
40 : "SMS Route nicht korrekt", |
|
41 |
50 : "Identifikation fehlgeschlagen", |
|
42 |
60 : "nicht genuegend Guthaben", |
|
43 |
70 : "Netz wird von Route nicht abgedeckt", |
|
44 |
71 : "Feature nicht ueber diese Route moeglich", |
|
45 |
80 : "Uebergabe an SMS-C fehlgeschlagen", |
|
46 |
90 : "Versand nicht moeglich", |
|
47 |
100 : "SMS wurde versendet", |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
48 |
} |
| 9 | 49 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
50 |
def __init__(self,code, mID=None, cost=None, count=None): |
| 15 | 51 |
if code in self.statusCodes.keys(): |
52 |
self.code=code |
|
53 |
else: |
|
54 |
raise UnknownStatusCode(code) |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
55 |
self.mID=mID |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
56 |
self.cost = cost |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
57 |
self.count = count |
| 15 | 58 |
|
59 |
def __str__(self): |
|
60 |
try: |
|
61 |
return self.statusCodes[self.code] |
|
62 |
except IndexError: |
|
| 49 | 63 |
raise UnknownStatusCode(self.code) |
| 15 | 64 |
|
65 |
def __int__(self): |
|
66 |
if not self.code in self.statusCodes.keys(): |
|
67 |
raise UnknownStatusCode(self.code) |
|
68 |
return self.code |
|
69 |
||
70 |
||
71 |
||
72 |
||
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
73 |
class Smstrade(Provider): |
| 15 | 74 |
""" |
75 |
s. auch http://kundencenter.smstrade.de/sites/smstrade.de.kundencenter/__pdf/SMS-Gateway_HTTP_API_v2.pdf |
|
76 |
""" |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
77 |
params= {"debug":("boolean",False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
78 |
"concat_sms":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
79 |
"message_id":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
80 |
"count":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
81 |
"cost":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
82 |
} |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
83 |
def __init__(self, name, config): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
84 |
self.url = "https://gateway.smstrade.de" |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
85 |
Provider.__init__(self,name,config,{"sms":["basic","economy","gold","direct"]}) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
86 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
87 |
def loadConfig(self): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
88 |
"""Read options from config""" |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
89 |
needed=["key"] |
| 9 | 90 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
91 |
for n in needed: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
92 |
setattr(self,n,None) |
| 9 | 93 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
94 |
for (n, v) in self.config: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
95 |
if n in needed: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
96 |
setattr(self,n,v) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
97 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
98 |
raise UnknownOption(self.name, n) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
99 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
100 |
for n in needed: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
101 |
if getattr(self,n) is None: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
102 |
raise NeededOption(self.name, n) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
103 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
104 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
105 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
106 |
def send(self, route, sms, recipient): |
| 9 | 107 |
"""send SMS with $sms to $recipients""" |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
108 |
logger.debug('smstrade.sendSMS(%s,%s)'%(sms, recipient)) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
109 |
route = unicode(route) |
| 9 | 110 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
111 |
if recipient.land != '49' and route == "basic": |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
112 |
return Exception() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
113 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
114 |
to ='00'+recipient.land+recipient.number |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
115 |
try: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
116 |
smsSendStatus = self.__send(route, to, sms) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
117 |
logger.info('smstrade._send(...)=%i(%s)'%(int(smsSendStatus),str(smsSendStatus))) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
118 |
if int(smsSendStatus) in (100,): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
119 |
return Status(self,route) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
120 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
121 |
raise Exception() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
122 |
except UnknownStatusCode: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
123 |
raise Exception() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
124 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
125 |
def __send(self, route, to, sms): |
| 9 | 126 |
""" This function is the main part of the request to the sms service. |
127 |
The function has to return a unicode formated string that will represent the answer of the sms service |
|
128 |
to the request.""" |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
129 |
logger.debug('smstrade._send(%s,%s,%s)'%( route, to, sms)) |
|
21
e6302069d772
daten sind in der klasse gespeichert - müssen nicht übergeben werden
Sandro Knauß <knauss@netzguerilla.net>
parents:
20
diff
changeset
|
130 |
parameters= {"key": self.key, |
| 15 | 131 |
"route": route, |
132 |
"to": to, |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
133 |
"message": sms.content.encode("utf-8"), |
|
18
f0d31c70744d
Unterscheidung von Dt.Mobilnetz / weltweit
Sandro Knauß <knauss@netzguerilla.net>
parents:
15
diff
changeset
|
134 |
"charset":"utf-8", |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
135 |
"debug": self.testmode, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
136 |
"message_id":True, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
137 |
"count":True, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
138 |
"cost":True, |
| 15 | 139 |
} |
| 9 | 140 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
141 |
doubleChar="€[]{}|\\^~" #these charactar need two GSM Chars |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
142 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
143 |
if sms.from_ is not None: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
144 |
parameters["from"] = sms.from_ |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
145 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
146 |
length=len(sms.content) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
147 |
for s in doubleChar: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
148 |
length += sms.content.count(s) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
149 |
parameters["concat_sms"] = True if length > 160 else False |
| 9 | 150 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
151 |
ps={} |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
152 |
for p in parameters: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
153 |
if p in self.params.keys(): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
154 |
if self.params[p][0] == "boolean": |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
155 |
if parameters[p] != self.params[p][1]: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
156 |
ps[p]=int(not self.params[p][1]) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
157 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
158 |
ps[p] = parameters[p] |
| 9 | 159 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
160 |
params = urllib.urlencode(ps) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
161 |
dp=copy.deepcopy(ps) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
162 |
dp["key"]="<KEY>" |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
163 |
logger.debug('smstrade._send-parameters:%s\n\t->%s'%(str(dp), urllib.urlencode(dp)) ) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
164 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
165 |
response = urllib.urlopen(self.url, params) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
166 |
data = response.readlines() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
167 |
if len(data) == 1: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
168 |
return StatusCode(int(data[0])) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
169 |
return StatusCode(int(data[0]),mID=data[1],cost=data[2],count=data[3]) |
| 9 | 170 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
171 |
def getSendFunc(self, typ, route): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
172 |
Provider.getSendFunc(self, typ, route) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
173 |
return partial(self.send,route) |
| 9 | 174 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
175 |
providers["smstrade"]=Smstrade |