Как использовать python urllib2 для отправки данных json для входа в систему
Я хочу использовать python urllib2 для имитации действия входа, я использую Fiddler, чтобы поймать пакеты и получил, что действие входа - это просто запрос ajax, а имя пользователя и пароль отправляются как данные json, но я понятия не имею, как использовать urllib2 для отправки json-данных, помощи...
Ответы
Ответ 1
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-объекта с именем пользователя и паролем.
Ответ 2
Для Python 3.x
Обратите внимание на следующее
-
В Python 3.x модули urllib
и urllib2
были объединены. Модуль называется urllib
. Итак, помните, что urllib
в Python 2.x и urllib
в Python 3.x являются РАЗЛИЧНЫМИ модулями.
-
Данные POST для urllib.request.Request
в Python 3 НЕ принимают строку (str
) - вам нужно передать объект bytes
(или итерабельность bytes
)
Пример
передать json
данные с POST в Python 3.x
import urllib.request
import json
json_dict = { 'name': 'some name', 'value': 'some value' }
# convert json_dict to JSON
json_data = json.dumps(json_dict)
# convert str to bytes (ensure encoding is OK)
post_data = json_data.encode('utf-8')
# we should also say the JSON content type header
headers = {}
headers['Content-Type'] = 'application/json'
# now do the request for a url
req = urllib.request.Request(url, post_data, headers)
# send the request
res = urllib.request.urlopen(req)
# res is a file-like object
# ...
Наконец, обратите внимание, что вы можете ТОЛЬКО отправлять запрос 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)
Ответ 3
Вы можете указать данные по запросу:
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()
Ответ 4
Вы можете использовать библиотеку python 'requests' для этого:
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)
Кажется, python не устанавливает хорошие заголовки, когда вы пытаетесь отправить JSON вместо urlencoded данных.