8

次のcurlコマンドは完全に機能します(プライベートデータは匿名化されています)。

curl -X POST 'https://api.twilio.com/2010-04-01/Accounts/abc/SMS/Messages.json' \
-d 'From=%2B14155551234' \
-d 'To=%2B17035551212' \
-d 'Body=This+is+a+test' \
-u foo:bar

これとまったく同じHTTPSPOSTリクエストを適切なPython3.3の方法で送信するにはどうすればよいですか?回避できる場合は、Python 3.3の標準ライブラリ以外のものを使用する必要はありません(つまり、twilio pythonモジュール、「リクエスト」、pycurl、またはプレーンなバニラPython以外のものを使用しないでください)。 3.3インストール)。

推奨されるPythonのアプローチはバージョンごとに進化し続けているようです。グーグルが見つけたスニペットは、使用しているバージョンやログイン部分を実行していないバージョンについては言及していません。Pythonドキュメントは「3.x以降非推奨」でいっぱいですが物事を行うための新しい方法のコード例を決して含めないでください。

curlがこれを簡単に実行できる場合は、標準のPython3.3も実行できます。しかし、これは今どの程度正確に行われることになっていますか?

4

1 に答える 1

19

Python2と3の両方で動作するバージョンを次に示します。

import requests # pip install requests

url = 'https://api.twilio.com/2010-04-01/Accounts/abc/SMS/Messages.json'
r = requests.post(url, dict(
        From='+17035551212',
        To='+17035551212',
        Body='This is a test'), auth=('foo', 'bar'))

print(r.headers)
print(r.text) # or r.json()

Python 3.3で基本http認証を使用してhttpsPOSTリクエストを行うには:

from base64 import b64encode
from urllib.parse import urlencode
from urllib.request import Request, urlopen

user, password = 'foo', 'bar'
url = 'https://api.twilio.com/2010-04-01/Accounts/abc/SMS/Messages.json'
data = urlencode(dict(From='+17035551212', To='+17035551212', 
                      Body='This is a test')).encode('ascii')
headers = {'Authorization': b'Basic ' +
        b64encode((user + ':' + password).encode('utf-8'))}
cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
response = urlopen(Request(url, data, headers), cafile=cafile)

print(response.info())
print(response.read().decode()) # assume utf-8 (likely for application/json)
于 2013-01-18T06:46:44.023 に答える