Как сформировать правильный Python Requests? Http POST

User9854

Новичок
Пользователь
Июн 9, 2020
2
1
3
Здравствуйте, есть камера с Aliexpress, доступ к ней возможен через android приложение. Логика следующая(по моим скудным представлениям):
Некий сервер отправляет запрос на мою камеру, после чего она в свою очередь отправляет на этот сервер информацию о изображении, затем эта информация отправляется на устройство с которого зашли в приложение и наконец информация обрабатывается и выводится на дисплей в виде картинки. Разумеется из за перекидывания туда сюда информации появляется существенная задержка, что для моих целей не подходит. Просто прописав в браузере ip камеры получаю: "Сайт 192.168.1.102 не позволяет установить соединение.", а продавец написал что доступ к камере возможен только через приложение. Но моя логика подсказывает мне что должна быть возможность получить картинку с камеры на прямую, так как камера находится в одной локальной сети с компьютером на котором я планирую использовать данные с камеры.
Итак что я имею на данный момент:
Пропустил трафик через сниффер и выудил следующее:
Безымянный.png
POST /topActivityInfo HTTP/1.1
x_api_token: a84cca91-6cdd-4370-b1fb-b6dafd43a46d
Content-Type: application/x-www-form-urlencoded
User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1.2; SM-G955F Build/NRD90M)
Host: 10.0.2.2:2861
Connection: Keep-Alive
Accept-Encoding: gzip
Content-Length: 109

callingPackage=&activityName=com.mycam.cam%2Fcom.danale.video.NDNCameraLiveActivity&packageName=com.mycam.cam

На этот запрос получаем следующий ответ от камеры:
HTTP/1.1 200 OK
Content-Length: 28
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 10 Jun 2020 09:06:39 GMT

{"success":true,"reason":""}

Вообще там много всяких запросов и ответов, но я почему то решил что это основное, если нужно сделаю скрины других пакетов.

А дальше я просто написал код который просто отправляет соответствующий запрос на ip который указан в выловленном сниффером пакете:


Python:
from requests import post
import gzip

# Указываем head запроса
headers = {'x_api_token': 'a84cca91-6cdd-4370-b1fb-b6dafd43a46d',
           'Content-Type': 'application/x-www-form-urlencoded',
           'Connection': 'Keep-Alive',
           'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; SM-G955F Build/NRD90M)',
           'Host': '10.0.2.2:2861',
           'Accept-Encoding': 'gzip'
           }
# Переменная с телом запроса
message = str('callingPackage=&activityName=com.thirtydays.microshare.module.MainActivity&packageName=com.mycam.cam').encode('utf-8')
# Сжатие в gzip
payload = gzip.compress(message)
# Словарь с телом запроса
payload1 = {'callingPackage': 'com.mycam.cam', 'activityName': 'com.thirtydays.microshare.module.MainActivity', 'packageName' : 'com.mycam.cam'}

# Отправляем запрос с помощью POST
foo = post('http://127.0.0.1:2861/', headers=headers, data=payload1)

#Выводим то что вернуло устройство
print (foo.content)

Пробовал отправлять и payload и payload1
И так и так возвращает:

{"success":false,"reason":"Request NotFound(404)"}

Что говорит о том что запрос не верный

К сожалению я далеко не эксперт в TCP запросах и в целом в этой теме, попробовал разобраться сам - ничего не вышло, зашел в тупик. К сожалению времени не так много разбираться с камерой, у меня еще есть возможность ее вернуть и заказать другую, решил пока еще есть неделя времени на возврат обратиться к вам, надеюсь поможете. Всю дополнительную информацию постараюсь предоставлять как можно скорее.

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

P.S. Извините что так много текста
 
  • Мне нравится
Реакции: Student

BPRO

Пользователь
Пользователь
Апр 22, 2020
12
8
3
Добрый день! При помощи обычного реквеста вы врядли получите изображения с камеры. Многие камеры с Алика работают поддерживают трансляцию по протоколу RTSP. Вот пример для для работы:
Код:
import cv2

cap = cv2.VideoCapture("rtsp://admin:123456@192.168.1.100:554/mpeg4", cv2.CAP_FFMPEG)

while cap.isOpened():
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Не факт что оно будет работать у вас так как адресс RTSP может отличаться.
 
  • Мне нравится
Реакции: Student

BPRO

Пользователь
Пользователь
Апр 22, 2020
12
8
3
Мой адрес камеры 192.168.1.102, но как Вы и предполагали код все равно не хочет работать. Хотел бы уточнить, может ли у меня быть отличный от "554" порт и "admin:123456", наверняка тоже зависит от конкретного случая и может отличатся, если все так, есть ли возможность узнать что конкретно мне нужно указывать после "rtsp://"?
Порт камеры на врядли может быть отличительным от моего так как в большистве случаев RTSP рабоатет на этом порту, admin:123456 - это логин и пароль к камере. rtsp:// это протокол передачи (его менять не надо)
Вот пример: rtsp://логин:пароль@IPадресс:554/адрессВещания
 
  • Мне нравится
Реакции: Student

User9854

Новичок
Пользователь
Июн 9, 2020
2
1
3
Добрый день! При помощи обычного реквеста вы врядли получите изображения с камеры. Многие камеры с Алика работают поддерживают трансляцию по протоколу RTSP. Вот пример для для работы:
Код:
import cv2

cap = cv2.VideoCapture("rtsp://admin:123456@192.168.1.100:554/mpeg4", cv2.CAP_FFMPEG)

while cap.isOpened():
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Не факт что оно будет работать у вас так как адресс RTSP может отличаться.
Мой адрес камеры 192.168.1.102, но как Вы и предполагали код все равно не хочет работать. Хотел бы уточнить, может ли у меня быть отличный от "554" порт и "admin:123456", наверняка тоже зависит от конкретного случая и может отличатся, если все так, есть ли возможность узнать что конкретно мне нужно указывать после "rtsp://"?
 

Форум IT Специалистов