【问题标题】:Sending automatic SMS alerts Python/Django发送自动短信警报 Python/Django
【发布时间】:2014-04-13 14:25:05
【问题描述】:

我正在使用 Django 构建一个网站。我希望用户能够在发布新主题时通过 SMS 接收警报。

我测试了 textlocal,但在尝试向多个号码 (numbers = ['xxxxx','xxxxx']) 发送 SMS 时遇到问题。(我不想使用 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')它可以工作。


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

【问题讨论】:

    标签: python django sms sms-gateway


    【解决方案1】:

    您遇到了几个问题。首先是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 这样的垃圾字符。

    所以,简而言之,由于urlencode字典中numbers的值是tuple,当您有多个数字时,您需要将tuple转换为逗号分隔的string。这可以通过",".join(numbers) 完成,在('2126xxxxx096','2126xxxxx888') 的情况下会产生2126xxxxx096%2C2126xxxxx888。使用固定编码,您的消息现在应该发送到多个号码。

    【讨论】:

    • 我忘了说我是 Python/Django 的初学者。非常感谢我从你的回答中学到了很多东西。它解决了我的问题。
    • 很高兴能帮上忙!作为一条建议,我强烈建议使用pdb 来观察正在发生的事情。 pdb,python 调试器,可让您随时随地检查变量和函数调用。要调用调试器,只需在要开始调试的任何位置插入 import pdb; pdb.set_trace()
    • 这很有帮助。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2022-11-08
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多