Я хочу использовать python urllib2 для имитации действия входа, я использую Fiddler, чтобы поймать пакеты и получил, что действие входа - это просто запрос ajax, а имя пользователя и пароль отправляются как данные json, но я понятия не имею, как использовать urllib2 для отправки json-данных, помощи...
Как использовать python 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 данных.