Подтвердить что ты не робот

Как использовать python urllib2 для отправки данных json для входа в систему

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

4b9b3361

Ответ 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 данных.