我正在使用Django构建网站。我希望用户能够在发布新主题时通过短信接收警报。
我测试了textlocal,但在尝试向多个号码发送短信时遇到了问题(numbers = ['xxxxx','xxxxx']
)。(我不想使用group_id
)。
一般来说,我希望能够做到这样的事情:
numbers = (SELECT number FROM users WHERE SMS_subscribe=1)
sender = 'mywebsite'
message = 'Hey, a new topic was posted'
send_sms(numbers, message, sender)
我的textlocal测试代码:
#!/user/bin/python
# -*- coding: utf-8 -*-
from urllib2 import Request, urlopen
from urllib import urlencode
def send_sms(uname, hash_code, numbers, message, sender):
data = urlencode({
'username' : uname,
'hash' : hash_code,
'numbers' : numbers,
'message' : message,
'sender' : sender,
'test' : True
})
#data = data.encode('utf-8')
request = Request('https://api.txtlocal.com/send/?')
response = urlopen(request, data)
return response.read()
def just_one_sms_message(message, annonce_link, sender):
links_len=len(annonce_link) + len(sender) + 1
sms_max_len = 160 - links_len
if len(message)>sms_max_len:
message = message[:sms_max_len-6]+'... : '
else:
message += ' : '
return message + annonce_link + '\n' + sender
username = 'xxxxxxx@gmail.com'
hash_code = '3b5xxxxxxxxxxxxxxxxxxxxxxxxxxx8d83818'
numbers = ('2126xxxxx096','2126xxxxx888')
annonce_link = 'http://example.com/'
sender = 'sender'
message = 'New topics..'
message = just_one_sms_message(message, annonce_link, sender)
resp = send_sms(username, hash_code, numbers, message, sender)
print resp
执行此代码我收到此错误:
{"warnings":[{"code":3,"message":"Invalid number"}],"errors":[{"code":4,"message":"No recipients specified"}],"status":"failure"}
但是如果我改变了:numbers=('2126xxxxx096')
它就可以了。
执行此操作的最佳方法或网络服务是什么?
答案 0 :(得分:3)
您遇到了一些问题。第一个是如何定义tuple
文字。
('somenumber')
相当于python中的'somenumber'
。它只是一个字符串。仅括号不能定义tuple
字面值。要定义单个元素tuple
文字,您需要第一个元素的尾随逗号。例如。 ('somenumber',)
。
第二个问题是urlencode
的工作原理。对于数据字典中的每个值,它要求字符串表示。
对于('2126xxxxx096','2126xxxxx888')
,由于它被评估为tuple
,因此它被编码为('2126xxxxx096','2126xxxxx888')
,从而产生%28%272126xxxxx096%27%2C+%272126xxxxx888%27%29
。< / p>
对于('2126xxxxx096')
,由于它被评估为string
,因此它被编码为2126xxxxx096
。请注意缺少%28
和%29
等垃圾字符。
因此,简而言之,由于numbers
字典中urlencode
的值为tuple
,当您有多个数字时,需要将tuple
转换为string
以逗号分隔",".join(numbers)
。这可以通过('2126xxxxx096','2126xxxxx888')
完成,2126xxxxx096%2C2126xxxxx888
生成{{1}}。使用固定编码,您的邮件现在应发送给多个号码。