Отправка JSON Post с использованием запросов в python 3.7.2 - PullRequest
0 голосов
/ 10 марта 2019

Так что я пытаюсь использовать python для отправки сообщения на URL, я в основном скопировал все из моей сетевой консоли в Firefox, но я не могу заставить его работать.

import requests
import json

url = 'https://www.example.com/example?handle'
cookie = {'UID':'b56f14d8-02b1-4ae8-ad5e-3485cf0abdbe'}
data ={'example':'example'}
headers = {'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'en-US,en;q=0.5',
'Connection':'keep-alive',
'Content-Length':'78',
'Content-Type':'text/plain;charset=UTF-8',
'Cookie':'UID=b56f14d8-02b1-4ae8-ad5e-3485cf0abdbe',
'Host':'www.example.com',
'Referer':'https:/example.com/example',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'}


req = requests.post(url, cookies=cookie, params=json.dumps(data), headers=headers)

print(req)

Я заменилфактические данные и URL с примером.После этого я получаю большую длинную ошибку:

Traceback (most recent call last):
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32    \lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
chunked=chunked)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request
six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request
httplib_response = conn.getresponse()
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1321, in getresponse
response.begin()
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 296, in begin
version, status, reason = self._read_status()
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 257, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\socket.py", line 589, in readinto
return self._sock.recv_into(b)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\ssl.py", line 1052, in recv_into
return self.read(nbytes, buffer)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\ssl.py", line 911, in read
return self._sslobj.read(len, buffer)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\adapters.py", line 449, in send
timeout=timeout
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
_stacktrace=sys.exc_info()[2])
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\util\retry.py", line 367, in increment
raise six.reraise(type(error), error, _stacktrace)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\packages\six.py", line 685, in reraise
raise value.with_traceback(tb)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
chunked=chunked)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\connectionpool.py", line 384, in _make_request
six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\urllib3\connectionpool.py", line 380, in _make_request
httplib_response = conn.getresponse()
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 1321, in getresponse
response.begin()
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 296, in begin
version, status, reason = self._read_status()
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\http\client.py", line 257, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\socket.py", line 589, in readinto
return self._sock.recv_into(b)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\ssl.py", line 1052, in recv_into
return self.read(nbytes, buffer)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\ssl.py", line 911, in read
return self._sslobj.read(len, buffer)
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/Kaiser/Documents/python ddoser.py", line 19, in <module>
req = requests.post(url, cookies=cookie, params=json.dumps(data).encode('UTF-8'), headers=headers)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\api.py", line 116, in post
return request('post', url, data=data, json=json, **kwargs)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\api.py", line 60, in request
return session.request(method=method, url=url, **kwargs)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
  File "C:\Users\Kaiser\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\adapters.py", line 498, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.',     ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))

Кто-нибудь знает о том, что я могу делать неправильно.Извините, если это ошибка новичка.

Ответы [ 2 ]

3 голосов
/ 10 марта 2019

Эта ошибка возникает, когда веб-сервер отклоняет ваше соединение. Веб-сервер может отклонить ваше соединение по разным причинам. Скорее всего, вы неправильно имитировали HTTP-запрос, ожидаемый веб-сервером.

Вам не нужно вручную заполнять все параметры HTTP такой длины содержимого. Библиотека автоматически заполняет эти поля для вас. Если вы планируете делать последующие HTTP-запросы с использованием тех же файлов cookie, рассмотрите возможность создания объекта сеанса, который хранит и обрабатывает файлы cookie для вас:

session = requests.Session()
session.post(url, data=payload)

Кроме того, осознайте разницу между параметром data и параметром params. Так как вы отправляете запрос POST, есть вероятность, что веб-сервер ожидает передачи данных через параметр data (который помещает данные в тело запроса, а не в строку запроса в URL). Другая причина, по которой веб-сервер может отклонить ваше соединение, заключается в том, что вы отправили HTTP-запрос, а не HTTPS-запрос, поэтому всегда проверяйте, все ли правильно с вашей стороны.

0 голосов
/ 10 марта 2019

Ниже кода, который я использую для отправки информации о сообщении и чтения ответа,

import urllib2
from urllib2 import URLError, HTTPError 
import urllib
import ssl

    mydata=[('funcion',funcion),('codigo',codigo)]    #The first is the var name the second is the value

    headers = {"Content-type", "application/x-www-form-urlencoded","User-Agent", "Mozilla/5.0",}

    handler=urllib2.HTTPHandler(debuglevel=1)
    opener = urllib2.build_opener(handler)
    urllib2.install_opener(opener)

    mydata=urllib.urlencode(mydata)
    path=url   #the url you want to POST to

    ctx = ssl.create_default_context() 
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE    #In my case i need accept certificates


    req=urllib2.Request(path, mydata)

    req.add_header("Content-type", "application/x-www-form-urlencoded")
    req.add_header("User-Agent", "Mozilla/5.0")

    page=urllib2.urlopen(req).read()
...