web-dev-qa-db-ja.com

python urllib2を使用してログイン用のjsonデータを送信する方法

python urllib2を使用してログインアクションをシミュレートしたいのですが、Fiddlerを使用してパケットをキャッチすると、ログインアクションは単なるajaxリクエストであり、ユーザー名とパスワードはjsonデータとして送信されます。しかし、urllib2を使用してjsonデータを送信する方法がわかりません。

16
richie
import urllib2
import json
# Whatever structure you need to send goes here:
jdata = json.dumps({"username":"...", "password":"..."})
urllib2.urlopen("http://www.example.com/", jdata)

これは、HTTP POSTを使用して、ユーザー名とパスワードを含む単純なjsonオブジェクトを送信していることを前提としています。

20
Thomas K

Python 3.x

次の点に注意してください

  • Python 3.xでは、urllibモジュールとurllib2モジュールが結合になっています。モジュールの名前はurllibです。したがって、urllib in Python 2.xとurllib in Python 3.xは異なるモジュールであることに注意してください。

  • POST urllib.request.RequestのデータPython 3は文字列を受け入れません(str)-を渡す必要がありますbytesオブジェクト(またはbytesの反復可能)

jsonデータをPOST in Python 3.x

 import urllib.request 
 import json 
 
 json_dict = {'name': 'some name'、 'value': 'some value'} 
 
#json_dictをJSONに変換
 json_data = json.dumps(json_dict)
 
#strをバイトに変換(エンコードに問題がないことを確認)
 post_data = json_data.encode( 'utf-8')
 
#JSONコンテンツタイプheader 
 headers = {} 
 headers [' Content-Type '] =' application/json '
 
#は、url 
 req = urllib.request.Request(url、post_data、headers)[のリクエストを実行します。 ____。] 
#リクエストを送信
 res = urllib.request.urlopen(req)
 
#resはファイルのようなオブジェクトです
 #... 
 

最後に、送信するデータがある場合にのみPOSTリクエストを送信できることに注意してください。

データを送信せずにHTTP POSTを実行する場合は、空のdictをデータとして送信する必要があります。

 data_dict = {} 
 post_data = json.dumps(data_dict).encode()
 
 req = urllib.request.Request(url、post_data)
 res = urllib.request.urlopen(req)
20
treecoder

リクエストに応じてデータを指定できます。

import urllib
import urllib2

url = 'http://example.com/login'
values = YOUR_CREDENTIALS_JSON

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
5
Reto Aebersold

'requests' pythonライブラリを使用してこれを実現できます:

http://docs.python-requests.org/en/latest/index.html

この例が見つかります:

http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests (より複雑なPOSTリクエスト)

>>> import requests
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)

Urlencodedデータの代わりにJSONを送信しようとすると、python適切なヘッダーを設定しないようです。

3
toutpt