refactor telegram message reporting
This commit is contained in:
parent
fa97ccaa64
commit
58a4a28f58
@ -3,6 +3,7 @@ import asyncio
|
||||
import logging
|
||||
import os.path
|
||||
import tempfile
|
||||
import home.telegram.aio as telegram
|
||||
|
||||
from home.config import config
|
||||
from home.camera.esp32 import WebClient
|
||||
@ -53,12 +54,19 @@ class ESP32CamCaptureDiffNode:
|
||||
|
||||
self.nextpic = 1 if self.nextpic == 2 else 2
|
||||
if not self.first:
|
||||
score = await pyssim(filename, os.path.join(self.directory, self.getfilename()))
|
||||
logger.debug(f'pyssim: diff={score}')
|
||||
second_filename = os.path.join(self.directory, self.getfilename())
|
||||
score = await pyssim(filename, second_filename)
|
||||
logger.debug(f'pyssim: score={score}')
|
||||
if score < config['pyssim']['threshold']:
|
||||
logger.info(f'score = {score}, informing central server')
|
||||
send_datagram(stringify([config['node']['name'], 2]), self.server_addr)
|
||||
|
||||
# send to telegram
|
||||
if 'telegram' in config:
|
||||
await telegram.send_message(f'pyssim: score={score}')
|
||||
await telegram.send_photo(filename)
|
||||
await telegram.send_photo(second_filename)
|
||||
|
||||
self.first = False
|
||||
|
||||
logger.debug('capture: done')
|
||||
|
1
src/home/telegram/__init__.py
Normal file
1
src/home/telegram/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from .telegram import send_message, send_photo
|
18
src/home/telegram/aio.py
Normal file
18
src/home/telegram/aio.py
Normal file
@ -0,0 +1,18 @@
|
||||
import functools
|
||||
import asyncio
|
||||
|
||||
from .telegram import (
|
||||
send_message as _send_message_sync,
|
||||
send_photo as _send_photo_sync
|
||||
)
|
||||
|
||||
|
||||
async def send_message(*args, **kwargs):
|
||||
loop = asyncio.get_event_loop()
|
||||
return await loop.run_in_executor(None, functools.partial(_send_message_sync, *args, **kwargs))
|
||||
|
||||
|
||||
async def send_photo(*args, **kwargs):
|
||||
loop = asyncio.get_event_loop()
|
||||
return await loop.run_in_executor(None, functools.partial(_send_photo_sync, *args, **kwargs))
|
||||
|
46
src/home/telegram/telegram.py
Normal file
46
src/home/telegram/telegram.py
Normal file
@ -0,0 +1,46 @@
|
||||
import requests
|
||||
import logging
|
||||
|
||||
from ..config import config
|
||||
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def send_message(text: str,
|
||||
parse_mode: str = None,
|
||||
disable_web_page_preview: bool = False):
|
||||
data, token = _send_telegram_data(text, parse_mode, disable_web_page_preview)
|
||||
req = requests.post('https://api.telegram.org/bot%s/sendMessage' % token, data=data)
|
||||
return req.json()
|
||||
|
||||
|
||||
def send_photo(filename: str):
|
||||
data = {
|
||||
'chat_id': config['telegram']['chat_id'],
|
||||
}
|
||||
token = config['telegram']['token']
|
||||
|
||||
url = f'https://api.telegram.org/bot{token}/sendPhoto'
|
||||
with open(filename, "rb") as fd:
|
||||
req = requests.post(url, data=data, files={"photo": fd})
|
||||
return req.json()
|
||||
|
||||
|
||||
def _send_telegram_data(text: str,
|
||||
parse_mode: str = None,
|
||||
disable_web_page_preview: bool = False) -> tuple[dict, str]:
|
||||
data = {
|
||||
'chat_id': config['telegram']['chat_id'],
|
||||
'text': text
|
||||
}
|
||||
|
||||
if parse_mode is not None:
|
||||
data['parse_mode'] = parse_mode
|
||||
elif 'parse_mode' in config['telegram']:
|
||||
data['parse_mode'] = config['telegram']['parse_mode']
|
||||
|
||||
if disable_web_page_preview or 'disable_web_page_preview' in config['telegram']:
|
||||
data['disable_web_page_preview'] = 1
|
||||
|
||||
return data, config['telegram']['token']
|
@ -1,17 +1,13 @@
|
||||
import functools
|
||||
import json
|
||||
import socket
|
||||
import time
|
||||
import requests
|
||||
import subprocess
|
||||
import traceback
|
||||
import logging
|
||||
import string
|
||||
import random
|
||||
import asyncio
|
||||
|
||||
from enum import Enum
|
||||
from .config import config
|
||||
from datetime import datetime
|
||||
from typing import Tuple, Optional
|
||||
|
||||
@ -100,49 +96,6 @@ def send_datagram(message: str, addr: Addr) -> None:
|
||||
sock.sendto(message.encode(), addr)
|
||||
|
||||
|
||||
def send_telegram(text: str,
|
||||
parse_mode: str = None,
|
||||
disable_web_page_preview: bool = False):
|
||||
data, token = _send_telegram_data(text, parse_mode, disable_web_page_preview)
|
||||
r = requests.post('https://api.telegram.org/bot%s/sendMessage' % token, data=data)
|
||||
if r.status_code != 200:
|
||||
logger.error(r.text)
|
||||
raise RuntimeError("telegram returned %d" % r.status_code)
|
||||
|
||||
|
||||
async def send_telegram_aio(text: str,
|
||||
parse_mode: str = None,
|
||||
disable_web_page_preview: bool = False):
|
||||
loop = asyncio.get_event_loop()
|
||||
data, token = _send_telegram_data(text, parse_mode, disable_web_page_preview)
|
||||
r = await loop.run_in_executor(None,
|
||||
functools.partial(requests.post,
|
||||
'https://api.telegram.org/bot%s/sendMessage' % token,
|
||||
data=data))
|
||||
if r.status_code != 200:
|
||||
logger.error(r.text)
|
||||
raise RuntimeError("telegram returned %d" % r.status_code)
|
||||
|
||||
|
||||
def _send_telegram_data(text: str,
|
||||
parse_mode: str = None,
|
||||
disable_web_page_preview: bool = False) -> tuple[dict, str]:
|
||||
data = {
|
||||
'chat_id': config['telegram']['chat_id'],
|
||||
'text': text
|
||||
}
|
||||
|
||||
if parse_mode is not None:
|
||||
data['parse_mode'] = parse_mode
|
||||
elif 'parse_mode' in config['telegram']:
|
||||
data['parse_mode'] = config['telegram']['parse_mode']
|
||||
|
||||
if disable_web_page_preview or 'disable_web_page_preview' in config['telegram']:
|
||||
data['disable_web_page_preview'] = 1
|
||||
|
||||
return data, config['telegram']['token']
|
||||
|
||||
|
||||
def format_tb(exc) -> Optional[list[str]]:
|
||||
tb = traceback.format_tb(exc.__traceback__)
|
||||
if not tb:
|
||||
|
@ -3,11 +3,12 @@ import logging
|
||||
import os
|
||||
import asyncio
|
||||
import time
|
||||
import home.telegram.aio as telegram
|
||||
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
|
||||
from home.config import config
|
||||
from home.util import parse_addr, send_telegram_aio
|
||||
from home.util import parse_addr
|
||||
from home import http
|
||||
from home.database.sqlite import SQLiteBase
|
||||
from home.camera import util as camutil
|
||||
@ -362,7 +363,7 @@ async def motion_notify_tg(camera: int,
|
||||
text += f'\nFragment: <b>{duration}s</b>, {dt1.strftime(fmt)}-{dt2.strftime(fmt)} '
|
||||
text += _tg_links(TelegramLinkType.FRAGMENT, camera, f'{dt1.strftime(datetime_format)}__{dt2.strftime(datetime_format)}.mp4')
|
||||
|
||||
await send_telegram_aio(text)
|
||||
await telegram.send_message(text)
|
||||
|
||||
|
||||
def _tg_links(link_type: TelegramLinkType,
|
||||
|
@ -1,7 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
import home.telegram as telegram
|
||||
|
||||
from home.config import config
|
||||
from home.database import BotsDatabase, SimpleState
|
||||
from home.util import send_telegram
|
||||
|
||||
"""
|
||||
config.toml example:
|
||||
@ -44,7 +45,7 @@ def main(mac: str, title: str) -> int:
|
||||
max_id = log.id
|
||||
|
||||
text = '\n'.join(map(lambda s: str(s), data))
|
||||
send_telegram(f'<b>{title}</b>\n\n' + text)
|
||||
telegram.send_message(f'<b>{title}</b>\n\n' + text)
|
||||
|
||||
return max_id
|
||||
|
||||
|
@ -4,7 +4,7 @@ import sys
|
||||
import os.path
|
||||
sys.path.extend([
|
||||
os.path.realpath(
|
||||
os.path.join(os.path.dirname(os.path.join(__file__)), '..', '..')
|
||||
os.path.join(os.path.dirname(os.path.join(__file__)), '..')
|
||||
)
|
||||
])
|
||||
|
||||
|
31
test/test_telegram_aio_send_photo.py
Normal file
31
test/test_telegram_aio_send_photo.py
Normal file
@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env python3
|
||||
import asyncio
|
||||
import sys
|
||||
import os.path
|
||||
sys.path.extend([
|
||||
os.path.realpath(
|
||||
os.path.join(os.path.dirname(os.path.join(__file__)), '..')
|
||||
)
|
||||
])
|
||||
|
||||
import src.home.telegram.aio as telegram
|
||||
|
||||
from src.home.config import config
|
||||
|
||||
|
||||
async def main():
|
||||
await telegram.send_message(f'test message')
|
||||
await telegram.send_photo('/tmp/3.jpg')
|
||||
await telegram.send_photo('/tmp/4.jpg')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
config.load('test_telegram_aio_send_photo')
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
asyncio.ensure_future(main())
|
||||
|
||||
try:
|
||||
loop.run_forever()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
Loading…
x
Reference in New Issue
Block a user