{"id":15575595,"url":"https://github.com/wiltonsr/pyintelbras","last_synced_at":"2026-02-24T16:34:54.699Z","repository":{"id":255421932,"uuid":"849557054","full_name":"wiltonsr/PyIntelbras","owner":"wiltonsr","description":"Python Wrapper for Intelbras API","archived":false,"fork":false,"pushed_at":"2025-03-19T18:34:18.000Z","size":11892,"stargazers_count":6,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-19T19:27:07.210Z","etag":null,"topics":["api","hacktoberfest","intelbras","wrapper","wrapper-api"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/pyintelbras","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wiltonsr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-29T20:03:35.000Z","updated_at":"2025-03-19T18:34:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"c5a29d67-99b9-4a38-b1ac-e6da6ca4a4d6","html_url":"https://github.com/wiltonsr/PyIntelbras","commit_stats":null,"previous_names":["wiltonsr/pyintelbras"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiltonsr%2FPyIntelbras","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiltonsr%2FPyIntelbras/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiltonsr%2FPyIntelbras/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wiltonsr%2FPyIntelbras/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wiltonsr","download_url":"https://codeload.github.com/wiltonsr/PyIntelbras/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248077159,"owners_count":21043907,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","hacktoberfest","intelbras","wrapper","wrapper-api"],"created_at":"2024-10-02T18:39:15.724Z","updated_at":"2026-02-24T16:34:54.618Z","avatar_url":"https://github.com/wiltonsr.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PyIntelbras\n\n[![PyPI Python Versions](https://img.shields.io/pypi/pyversions/pyintelbras.svg)](https://pypi.org/project/pyintelbras/)\n[![PyPI Package Version](https://img.shields.io/pypi/v/pyintelbras.svg)](https://pypi.org/project/pyintelbras/)\n![GitHub Issues](https://img.shields.io/github/issues/wiltonsr/pyintelbras)\n![GitHub commit activity (branch)](https://img.shields.io/github/last-commit/wiltonsr/pyintelbras/main)\n![GitHub License](https://img.shields.io/github/license/wiltonsr/pyintelbras?link=https%3A%2F%2Fgithub.com%2Fwiltonsr%2FPyIntelbras%2Fblob%2Fmain%2FLICENSE)\n\n**PyIntelbras** é um módulo Python para trabalhar com a [API Intelbras V3.59](https://botminio.apps.intelbras.com.br/dvr/HTTP_API_V3_59_Intelbras.pdf).\n\n_Obs:_ Caso o link da documentação esteja _offline_, a mesma também está disponível no diretório [docs](docs) do repositório.\n\n## Requisitos\n\n- Testado com a API `2.84` de um `iNVD 9116 PE FT`.\n\n### Iniciando\n\nInstale PyIntelbras usando pip:\n\n```bash\npip install pyintelbras\n```\n\nAgora é possível importar e usar o PyIntelbras da seguinte forma:\n\n```python\nfrom pyintelbras import IntelbrasAPI\n\nintelbras = IntelbrasAPI(\"http://device-server.example.com\")\nintelbras.login(\"api-user\", \"api-pass\")\n\nresponse = intelbras.configManager(action='getConfig', name='ChannelTitle')\n```\n\n## Documentação\n\nO **PyIntelbras** utiliza a biblioteca [_requests_](https://requests.readthedocs.io/en/master/) para HTTP. Todos os _paths_ existentes na API da Intelbras podem ser utilizados como métodos e seus respectivos parâmetros também podem ser passados como parâmetros das funções.\n\n```python\nfrom pyintelbras import IntelbrasAPI\n\nintelbras = IntelbrasAPI(\"http://device-server.example.com\")\nintelbras.login(\"api-user\", \"api-pass\")\n\nresponse = intelbras.configManager(action='getConfig', name='ChannelTitle')\n```\n\nO exemplo acima irá realizar uma requisição `GET` para o endereço:\n\n`http://device-server.example.com/cgi-bin/configManager.cgi?action=getConfig\u0026name=ChannelTitle`.\n\nNote que tanto o prefixo `cgi-bin` quanto o sufixo `.cgi`, exigidos pela API, são automaticamente adicionados.\n\n### Tipo de Requisição\n\nÉ possível definir o tipo de requisição, sendo permitidos apenas 2 verbos HTTP.\n\nPor padrão e caso seja omitido, a requisição será do tipo `GET`.\n\n#### GET\n\n```python\nfrom pyintelbras import IntelbrasAPI\n\nintelbras = IntelbrasAPI(\"http://device-server.example.com\")\nintelbras.login(\"api-user\", \"api-pass\")\n\n# Mesmo efeito para ambas as requisições\nresponse = intelbras.configManager(action='getConfig', name='ChannelTitle')\nresponse = intelbras.configManager.get(action='getConfig', name='ChannelTitle')\n```\n\n#### POST\n\n```python\nfrom pyintelbras import IntelbrasAPI\n\nintelbras = IntelbrasAPI(\"http://device-server.example.com\")\nintelbras.login(\"api-user\", \"api-pass\")\n\nresponse = intelbras.api.LogicDeviceManager.getCameraState.post(body={ 'uniqueChannels': [-1] })\n```\n\nO exemplo acima irá realizar uma requisição `POST` para o endereço:\n\n`http://device-server.example.com/cgi-bin/api/LogicDeviceManager/getCameraState.cgi`.\n\nE enviar o conteúdo da variável `body` como corpo da requisição.\n\n### Diferenciação entre Maiúsculas e Minúsculas\n\nA API da Intelbrás é _case sensitive_, ou seja, faz diferenciação entre maiúsculas e minúsculas. Por conta disto, a URL de requisição é montada exatamente conforme os métodos e parâmetros são passados.\n\nSendo assim, a requisição abaixo deverá retornar o código de status HTTP `200`:\n\n\u003cpre\u003e\nintelbras.config\u003cb\u003eM\u003c/b\u003eanager(action='getConfig', name='ChannelTitle')\n\u003c/pre\u003e\n\nEnquanto isso, a requisição abaixo retornará o código de status HTTP `400`:\n\n\u003cpre\u003e\nintelbras.config\u003cb\u003em\u003c/b\u003eanager(action='getConfig', name='ChannelTitle')\n\u003c/pre\u003e\n\nNote a diferença da grafia da letra _M_. Isso irá ocorrer pelo fato de não existir a rota:\n\n`.../cgi-bin/configmanager.cgi/...`\n\ne sim:\n\n`.../cgi-bin/configManager.cgi/...`.\n\n### Uso de Parâmetros\n\nOs componente de consulta (_query parameters_), utilizados como parâmetros das funções, devem ser tratados adequadamente quando possuírem sintaxe inválida no python. Basicamente isso será necessário quando houver\n`.` ou `[]` nos parâmetros. O seguinte exemplo:\n\n```python\n...\nresponse = intelbras.mediaFileFind(action='findFile', condition.Channel=1)\n```\n\nRetornará o erro:\n\n```python\n  Cell In[1], line 1\n    response = intelbras.mediaFileFind(action='findFile', condition.Channel=1)\n                                                    ^\nSyntaxError: expression cannot contain assignment, perhaps you meant \"==\"?\n```\n\nA forma correta de lidar neste caso é utilizando a [descompactação de listas de argumentos](https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists).\n\n```python\n...\nparams = {\n    'action': 'findFile',\n    'condition.Channel': 1\n}\n\nresponse = intelbras.mediaFileFind(**params)\n```\n\n### Habilitando Logs\n\nSe for necessário debugar algum problema com as requisições para a API da Intelbras, é possível habilitar a saída de logs. O `pyintelbras` utiliza o sistema de _logging_ do Python, mas por padrão, ele registra para _Null_. É possível alterar esse comportamento. Segue um exemplo:\n\n```python\nimport sys\nimport logging\nfrom pyintelbras import IntelbrasAPI\n\nstream = logging.StreamHandler(sys.stdout)\nstream.setLevel(logging.DEBUG)\nlog = logging.getLogger('pyintelbras')\nlog.addHandler(stream)\nlog.setLevel(logging.DEBUG)\n\nintelbras = IntelbrasAPI(\"http://device-server.example.com\")\nintelbras.login(\"api-user\", \"api-pass\")\n\nresponse = intelbras.configManager(action='getConfig', name='ChannelTitle')\n```\n\n### Métodos Helpers\n\nExistem alguns métodos para facilitar determinadas comunicações com a `API`.\n\n- Verificar versão da API\n\n```python\n...\nintelbras.api_version\n# {'version': 2.84}\n```\n\n- Listar canais\n\n```python\n...\nintelbras.channels\n# [{'Name': 'Lab01'},\n# {'Name': 'Lab02'},\n# {'Name': 'Lab03'},\n# {'Name': 'Lab04'},\n# {'Name': 'Lab05'},\n# {'Name': 'Lab06'},\n# {'Name': 'Canal7'},\n# {'Name': 'Canal8'},\n# {'Name': 'Canal9'},\n# {'Name': 'Canal10'},\n# {'Name': 'Canal11'},\n# {'Name': 'Canal12'},\n# {'Name': 'Canal13'},\n# {'Name': 'Canal14'},\n# {'Name': 'Canal15'},\n# {'Name': 'Canal16'}]\n```\n\n- Encontrar mídias\n\nBuscar por mídias na `API` envolve `5` ações:\n\n1. factory.create\n1. findFile\n1. findNextFile\n1. close\n1. destroy\n\nO método `find_media_files` facilita esse procedimento, internalizando toda essa complexidade, sendo necessário informar apenas os parâmetros da busca.\n\n```python\n...\nparams = {\n  'condition.Channel': 1,\n  'condition.StartTime': '2024-8-27 12:00:00',\n  'condition.EndTime': '2024-8-29 12:00:00'\n}\n\nintelbras.find_media_files(params)\n# {'found': 1,\n# 'items': [{'VideoStream': 'Main',\n#   'Channel': 0,\n#   'Type': 'dav',\n#   'StartTime': datetime.datetime(2024, 8, 28, 2, 40, 49),\n#   'EndTime': datetime.datetime(2024, 8, 28, 2, 41),\n#   'Disk': 2,\n#   'Partition': 2,\n#   'Cluster': 371211,\n#   'FilePath': '/mnt/dvr/2024-08-28/0/dav/02/0/2/371211/02.40.49-02.41.00[R][0@0][0].dav',\n#   'Length': 3276800,\n#   'Flags': ['Event'],\n#   'Events': ['FaceRecognition'],\n#   'CutLength': 3276800}]}\n```\n\n- Processar respostas\n\nAlgumas repostas da `API` são enviadas no formato `chave=valor` no corpo da resposta.\n\nNestes casos, é possível utilizar a função `parse_response` para converter a resposta em um [dicionário](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) python para facilitar a manipulação dos dados.\n\n```python\n...\nfrom pyintelbras.helpers import parse_response\n...\nresponse = intelbras.recordManager(action='getCaps')\nprint(response.text)\n# caps.MaxPreRecordTime=30\n# caps.PacketLengthRange[0]=1\n# caps.PacketLengthRange[1]=60\n# caps.PacketSizeRange[0]=131072\n# caps.PacketSizeRange[1]=2097152\n# caps.SupportExtraRecordMode=true\n# caps.SupportHoliday=true\n# caps.SupportPacketType[0]=Time\n# caps.SupportPacketType[1]=Size\n# caps.SupportResumeTransmit=false\n\nd = parse_response(response.text)\nprint(d)\n# {'caps': {'MaxPreRecordTime': 30,\n#   'PacketLengthRange': [1, 60],\n#   'PacketSizeRange': [131072, 2097152],\n#   'SupportExtraRecordMode': True,\n#   'SupportHoliday': True,\n#   'SupportPacketType': ['Time', 'Size'],\n#   'SupportResumeTransmit': False}}\n\nprint(d.get('caps').get('PacketLengthRange')[1])\n# 60\n```\n\n### Exemplos\n\nOutros exemplos de uso da API estão disponíveis no diretório [examples](examples) do repositório.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwiltonsr%2Fpyintelbras","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwiltonsr%2Fpyintelbras","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwiltonsr%2Fpyintelbras/lists"}