发送自动短信提醒Python / Django

时间:2014-04-13 14:25:06

标签: python django sms sms-gateway

我正在使用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')它就可以了。


执行此操作的最佳方法或网络服务是什么?

1 个答案:

答案 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}}。使用固定编码,您的邮件现在应发送给多个号码。