0

USBモデムを使用してUbuntuでKannelをセットアップしました。以下に示すように、URLを使用してブラウザ経由でSMSを送信できます

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")

メッセージにスペースを入れずに関数を呼び出すと、機能しメッセージが送信されます。

sms.send_sms('+254781923855', 'kid_got_swag')

メッセージにスペースがある場合、次のエラーで失敗します

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 を呼び出す他のバリエーションを試しましたが、メッセージ内のスペースが原因ですべて失敗します....

4

3 に答える 3

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:このようなリクエストにはリクエストを使用することをお勧めします。あなたはこのようにあなたのURLをより良く構築することができます-

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)
于 2013-03-23T11:51:42.700 に答える
1

URL にスペースを含めることはできません。ブラウザで試したところ、ブラウザはリクエストを発行する前に URL を正しくエンコードしました。プログラムでは、URL をエンコードする必要があります。幸いなことurllibに、詳細を処理する機能が組み込まれています。

http://docs.python.org/3.3/library/urllib.parse.html#url-quoting

于 2013-03-23T12:40:53.557 に答える
0

パラメータとして渡した値をURLエンコードする必要があります。そうしないと、壊れたURLが作成されるため、リクエストは失敗します。urllib.parse.urlencodeが必要なことを実行すると思います。

于 2013-03-23T14:44:34.853 に答える