New feature: send a message using Telegram API with obtained data.
This commit is contained in:
parent
115370b1a6
commit
0ae887a81e
1
Pipfile
1
Pipfile
|
@ -18,6 +18,7 @@ selenium = "*"
|
|||
opensky-api = {editable = true, git = "https://github.com/openskynetwork/opensky-api.git", subdirectory = "python"}
|
||||
webdriver-manager = "*"
|
||||
shapely = "*"
|
||||
python-telegram-bot = "*"
|
||||
|
||||
[requires]
|
||||
python_version = "3.9"
|
||||
|
|
32
README.md
32
README.md
|
@ -104,6 +104,38 @@ docker-compose up -d
|
|||
|
||||
After running this command, due to the `-d` flag the container will be running in the background. To see the logs of the docker container use `docker logs CONTAINER` (add `-f` to continue streaming the containers output)
|
||||
|
||||
### Telegram message feature - march/2022
|
||||
|
||||
Data obtained can be sent through Telegram to a chat (contact), channel or groups.
|
||||
|
||||
Creating a Telegram Bot
|
||||
- Start a conversation with [BotFather](https://t.me/BotFather);
|
||||
- Send it to the BotFather: /newbot
|
||||
- Choose a name for your bot;
|
||||
- Choose a username for your bot;
|
||||
- Done! You'll get a token to access the HTTP API.
|
||||
|
||||
Getting channel or chat (contact) ID
|
||||
- Start a conversation with [JsonDumpBot](https://t.me/JsonDumpBot);
|
||||
- It will reply with a json with information from the message;
|
||||
- Go to the channel or chat you want the id and forward a message from there to JsonDumpBot;
|
||||
- Find the id in the reply. It'll look something like this:
|
||||
```
|
||||
{...
|
||||
"forward_from_chat": {
|
||||
"id": xxxxxxxxx,
|
||||
...}
|
||||
```
|
||||
- Don't forget to add the bot as admin in channel so messages can be sent.
|
||||
|
||||
Getting a group ID
|
||||
- Open [Telegram web](https://web.telegram.org);
|
||||
- Go to group and check the url on address bar of browser;
|
||||
- That's the group ID (-xxxxxxxxx), it'll look something like this:
|
||||
```
|
||||
https://web.telegram.org/z/#-xxxxxxxxx
|
||||
```
|
||||
|
||||
### TODO
|
||||
|
||||
- General Cleanup
|
||||
|
|
|
@ -66,3 +66,7 @@
|
|||
### OurAirports / airports.csv / regions.csv
|
||||
|
||||
- <https://ourairports.com/data/>
|
||||
|
||||
### Telegram Bot
|
||||
|
||||
- <https://github.com/python-telegram-bot/python-telegram-bot>
|
|
@ -39,4 +39,10 @@ URL = webhookurl
|
|||
#Role to tag optional, the role ID
|
||||
ROLE_ID =
|
||||
Title =
|
||||
USERNAME = plane-notify
|
||||
USERNAME = plane-notify
|
||||
|
||||
[TELEGRAM]
|
||||
ENABLE = FALSE
|
||||
TITLE = Title Of Telegram message
|
||||
ROOM_ID = -100xxxxxxxxxx
|
||||
BOT_TOKEN = xxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
@ -0,0 +1,38 @@
|
|||
def sendTeleg(photo, message, config):
|
||||
import telegram
|
||||
sent = False
|
||||
retry_c = 0
|
||||
while sent == False:
|
||||
try:
|
||||
bot = telegram.Bot(token=config.get('TELEGRAM', 'BOT_TOKEN'), request=telegram.utils.request.Request(connect_timeout=20, read_timeout=20))
|
||||
sent = bot.send_photo(chat_id=config.get('TELEGRAM', 'ROOM_ID'), photo=photo, caption=message, parse_mode=telegram.ParseMode.MARKDOWN, timeout=20)
|
||||
except Exception as err:
|
||||
print('err.args:')
|
||||
print(err.args)
|
||||
print(f"Unexpected {err=}, {type(err)=}")
|
||||
print("\nString err:\n"+str(err))
|
||||
if retry_c > 4:
|
||||
print('Telegram attempts exceeded. Message not sent.')
|
||||
break
|
||||
elif str(err) == 'Unauthorized':
|
||||
print('Invalid Telegram bot token, message not sent.')
|
||||
break
|
||||
elif str(err) == 'Timed out':
|
||||
retry_c += 1
|
||||
print('Telegram timeout count: '+str(retry_c))
|
||||
pass
|
||||
elif str(err) == 'Chat not found':
|
||||
print('Invalid Telegram Chat ID, message not sent.')
|
||||
break
|
||||
elif str(err)[:35] == '[Errno 2] No such file or directory':
|
||||
print('Telegram module couldn\'t find an image to send.')
|
||||
break
|
||||
elif str(err) == 'Media_caption_too_long':
|
||||
print('Telegram image caption lenght exceeds 1024 characters. Message not send.')
|
||||
break
|
||||
else:
|
||||
print('[X] Unknown Telegram error. Message not sent.')
|
||||
break
|
||||
else:
|
||||
print("Telegram message successfully sent.")
|
||||
return sent
|
|
@ -69,7 +69,7 @@ class Plane:
|
|||
self.reg = get_aircraft_reg_by_icao(self.icao)
|
||||
self.type = get_type_code_by_icao(self.icao)
|
||||
self.last_pos_datetime = datetime.fromtimestamp(ac_dict.time_position)
|
||||
except ValueError as e:
|
||||
except Exception as e:
|
||||
print("Got data but some data is invalid!")
|
||||
print(e)
|
||||
self.printheader("foot")
|
||||
|
@ -407,6 +407,11 @@ class Plane:
|
|||
append_airport(self.map_file_name, nearest_airport_dict)
|
||||
else:
|
||||
raise ValueError("Map option not set correctly in this planes conf")
|
||||
#Telegram
|
||||
if self.config.getboolean('TELEGRAM', 'ENABLE'):
|
||||
from defTelegram import sendTeleg
|
||||
photo = open(self.map_file_name, "rb")
|
||||
sendTeleg(photo, message, self.config)
|
||||
#Discord
|
||||
if self.config.getboolean('DISCORD', 'ENABLE'):
|
||||
dis_message = f"{self.dis_title} {message}".strip()
|
||||
|
@ -436,6 +441,11 @@ class Plane:
|
|||
route_to = self.route_info()
|
||||
if route_to != None:
|
||||
print(route_to)
|
||||
#Telegram
|
||||
if self.config.getboolean('TELEGRAM', 'ENABLE'):
|
||||
message = f"{self.dis_title} {route_to}".strip()
|
||||
photo = open(self.map_file_name, "rb")
|
||||
sendTeleg(photo, message, self.config)
|
||||
#Discord
|
||||
if self.config.getboolean('DISCORD', 'ENABLE'):
|
||||
dis_message = f"{self.dis_title} {route_to}".strip()
|
||||
|
@ -563,6 +573,10 @@ class Plane:
|
|||
else:
|
||||
message = f"Circling {round(nearest_airport_dict['distance_mi'], 2)}mi {cardinal} of {nearest_airport_dict['icao']}, {nearest_airport_dict['name']} at {self.alt_ft}ft"
|
||||
print(message)
|
||||
#Telegram
|
||||
if self.config.getboolean('TELEGRAM', 'ENABLE'):
|
||||
photo = open(self.map_file_name, "rb")
|
||||
sendTeleg(photo, message, self.config)
|
||||
if self.config.getboolean('DISCORD', 'ENABLE'):
|
||||
role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') else None
|
||||
sendDis(message, self.config, self.map_file_name, role_id)
|
||||
|
|
Loading…
Reference in New Issue