我使用USB调制解调器在Ubuntu中设置了Kannel,我可以通过浏览器使用URL发送短信,如下所示
localhost:13013/cgi-bin/sendsms?username=kannel&password=kannel&to=+254781923855&text='Kid got swag'
在python中,我有以下脚本,只有当要发送的消息没有空格时才有效。
import urllib.request
def send_sms(mobile_no, message):
url="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text=%s" \
% ('localhost', 13013, 'kannel', 'kannel', str(mobile_no), message)
f = urllib.request.urlopen(url)
print("sms sent")
如果我在消息中使用 NO 空格调用该函数,则它会起作用并发送消息。
sms.send_sms('+254781923855', 'kid_got_swag')
如果我在消息中有空格,则失败并显示错误belw
sms.send_sms('+254781923855', 'kid got swag')
Traceback (most recent call last):
File "/home/lukik/workspace/projx/src/short_message.py", line 24, in <module>
sms.send_sms('+254781923855', 'kid got swag')
File "/home/lukik/workspace/projx/src/short_message.py", line 18, in send_sms
f = urllib.request.urlopen(url)
File "/usr/lib/python3.2/urllib/request.py", line 139, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.2/urllib/request.py", line 376, in open
response = meth(req, response)
File "/usr/lib/python3.2/urllib/request.py", line 488, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.2/urllib/request.py", line 414, in error
return self._call_chain(*args)
File "/usr/lib/python3.2/urllib/request.py", line 348, in _call_chain
result = func(*args)
File "/usr/lib/python3.2/urllib/request.py", line 496, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request
我已经尝试过调用urllib的其他变种但是它们都无法通过消息中的空格来表达....
答案 0 :(得分:1)
在您通过浏览器发送的请求中,消息在引号内 -
&text='Kid got swag'
在您的请求中尝试 -
url="http://%s:%d/cgi-bin/sendsms?username=%s&password=%s&to=%s&text='%s'" \
% ('localhost', 13013, 'kannel', 'kannel', str(mobile_no), message)
请注意&text='%s'
上的单引号。
PS:我建议对这样的请求使用requests。您可以更好地构建您的网址,就像这样 -
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)
答案 1 :(得分:1)
不允许包含空格。当您在浏览器中尝试时,浏览器会在发出请求之前正确编码URL。在您的程序中,您需要对URL进行编码。幸运的是,urllib
具有内置的功能来处理细节。
http://docs.python.org/3.3/library/urllib.parse.html#url-quoting
答案 2 :(得分:0)
您需要URL-encode作为参数传递的值,否则会构造损坏的URL,这就是请求失败的原因。我相信urllib.parse.urlencode可以满足您的需求。