我正在使用Django建立网站。我希望发布新主题时,用户能够通过SMS接收警报。
我测试了textlocal,但是尝试将SMS发送到多个号码(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 = '[email protected]'
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')
它可以工作。什么是最好的方法或Web服务做到这一点?
最佳答案
您遇到了几个问题。首先是tuple
文字的定义方式。('somenumber')
等同于python中的'somenumber'
。这只是一个字符串。仅括号不能定义tuple
文字。要定义单元素tuple
文字,您需要第一个元素的结尾逗号。例如。 ('somenumber',)
。
第二个问题是urlencode
的工作方式。对于数据字典中的每个值,它都要求字符串表示形式。
对于('2126xxxxx096','2126xxxxx888')
,由于它被评估为tuple
,因此被编码为('2126xxxxx096','2126xxxxx888')
,结果为%28%272126xxxxx096%27%2C+%272126xxxxx888%27%29
。
对于('2126xxxxx096')
,由于它被评估为string
,因此被编码为2126xxxxx096
。请注意,缺少诸如%28
和%29
之类的垃圾字符。
简而言之,由于当您有多个数字时,由于numbers
词典中urlencode
的值是tuple
,因此您需要将tuple
转换为逗号分隔的string
。这可以通过",".join(numbers)
完成,在('2126xxxxx096','2126xxxxx888')
的情况下会生成2126xxxxx096%2C2126xxxxx888
。使用固定的编码,您的消息现在应该发送到多个号码。