Запрос в режиме PUT для python с файлом xls в качестве данных в запросах - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь использовать запросы в режиме PUT в Python, чтобы импортировать файл xls с белым списком в камеру. Мой файл находится на моем рабочем столе.

Я проверил API в почтальоне и попросил почтальона экспортировать мой API в python. Моя команда в почтальоне с разрешенной дайджест-авторизацией представлена ​​ниже.

http://admin:*******@192.168.88.243/ISAPI/Traffic/channels/1/licensePlateAuditData

Я попробовал ее в моем Python тесте запроса, как показано ниже, и работает с отчетом 200OK

PUT http://admin:*******@192.168.200.108/ISAPI/Traffic/channels/1/licensePlateAuditData
Content-Type: text/plain

I использовал почтальон для перевода моего API в Curl и Python Request, и результаты представлены ниже.

Python Request

import requests

url = "http://192.168.88.243/ISAPI/Traffic/channels/1/licensePlateAuditData"

payload = "<file contents here>"
headers = {
  'Content-Type': 'text/plain'
}

Curl

curl --location --request PUT 'http://192.168.88.243/ISAPI/Traffic/channels/1/licensePlateAuditData' \
--header 'Content-Type: text/plain' \
--data-binary '@/C:/Users/gerki/Desktop/me=teNolist_192.168.88.243_20200407142606.xls'

response = requests.request("PUT", url, headers=headers, data = payload)

print(response.text.encode('utf8'))

Я запустил свой код в Python, чтобы он заработал, сначала убедившись, что моя авторизация сначала работает с командой GET, что вы можете увидеть в режиме с комментариями в моем коде ниже. Авторизация работала нормально.

Python Код

ht4 = '/ISAPI/Traffic/channels/1/licensePlateAuditData'
ht1 = 'http://192.168.200.108'
ht3 = 'http://192.168.200.109'
ht = ht1 + ht4
htalt = ht3 + ht4

import requests

from requests.exceptions import HTTPError

for url in [ht, htalt]:
    try:
        from requests.auth import HTTPDigestAuth

        payload = "C:/Users/gerki/Desktop/me=teNolist_192.168.88.243_20200407142606.xls"
        headers = {
            'Content-Type': 'text/plain'
        }

        response = requests.request("PUT", url, data=payload, headers=headers, auth=HTTPDigestAuth('admin', 'OTE_2019'))

        # If the response was successful, no Exception will be raised
        response.raise_for_status()
    except HTTPError as http_err:
        print(f'HTTP error occurred: {http_err}')  # Python 3.6
    except Exception as err:
        print(f'Other error occurred: {err}')  # Python 3.6
    else:
        print('Success!')
        response.encoding = 'utf-8'
        print(response.text)

Затем я получаю ошибку 400, которая, как я подозреваю, связана с тем, как python открывает файл xls , Мой код ошибки

HTTP error occurred: 400 Client Error: Bad Request for url: http://192.168.200.108/ISAPI/Traffic/channels/1/licensePlateAuditData

Может ли кто-нибудь объяснить, могу ли я выполнить процедуру как-нибудь сработавшей? Мне нужно применить код на многих IP-адресах, чтобы применить файл XLS во многих камерах. Поэтому мне нужен код в python, чтобы создать исполняемый файл, и поэтому POSTMAN не работает.

1 Ответ

0 голосов
/ 10 апреля 2020

Наконец-то я нашел, что было не так. В документации указывалось на использование заголовка внутри запроса. Я просто удалил его и работал. Я прилагаю приведенный ниже код.

Кстати, этот ответ имеет отношение к совершенно уникальной проблеме, которая основана на том, как создать небольшое программное обеспечение для изменения белого / черного списка HIkvision Камеры Traffic / ANPR. До настоящего времени для этого можно было использовать только команды камеры GUI или PUT через POSTMAN или аналогичные системы.

Так что ответ действительно полезен для многих людей, которые имеют sh использовать HIKVISION SDK для камер ANPR .

ht1 = '/ISAPI/ITC/capability'
ht2 = '/ISAPI/Traffic/channels/1/licensePlateAuditData'
ht3 = 'http://192.168.200.108'
ht4 = 'http://192.168.200.109'
htc = ht3 + ht2
htc2 = ht4 + ht2

import requests

from requests.exceptions import HTTPError

for url in [htc, htc2]:
    try:
        from requests.auth import HTTPDigestAuth

        #response = requests.get(url, auth=HTTPDigestAuth('<username>', ',password>'))
        payload = open("<filename with full path>", 'rb')

        headers = {
            'Content-Type': 'text/plain'
        }

        response = requests.put(url, data=payload, auth=HTTPDigestAuth('<username>', ',password>'))

        # If the response was successful, no Exception will be raised
        response.raise_for_status()
    except HTTPError as http_err:
        print(f'HTTP error occurred: {http_err}')  # Python 3.6
    except Exception as err:
        print(f'Other error occurred: {err}')  # Python 3.6
    else:
        print('Success!')
        response.encoding = 'utf-8'
        print(response.text)
...