我正在使用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。使用固定的编码,您的消息现在应该发送到多个号码。

08-18 18:10