Update telegram library, add docs
This commit is contained in:
		
							
								
								
									
										44
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								README.md
									
									
									
									
									
								
							| @@ -2,10 +2,50 @@ | |||||||
|  |  | ||||||
| This lets my deranged friend monitor his drunken campground shenanigans from a Telegram bot. | This lets my deranged friend monitor his drunken campground shenanigans from a Telegram bot. | ||||||
|  |  | ||||||
|  | ## Usage | ||||||
|  |  | ||||||
|  | Add @robbcampbot to your Telegram group. | ||||||
|  |  | ||||||
|  | Send the `/campcam` command. | ||||||
|  |  | ||||||
| ## Installation | ## Installation | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| $ pip install --force-reinstall 'python-telegram-bot==v13.15' 'picamera' | $ sudo raspi-config  # enable the camera | ||||||
|  | $ sudo apt install python3 python3-pip python3-virtualenv | ||||||
| $ git clone https://git.tannercollin.com/tanner/campcam.git | $ git clone https://git.tannercollin.com/tanner/campcam.git | ||||||
| $ python campcam.py | $ cd campcam/ | ||||||
|  | $ virtualenv -p python3 env | ||||||
|  | $ . env/bin/activate | ||||||
|  | (env) $ pip install -r requirements.txt | ||||||
|  | # edit secrets.py.example, save as secrets.py | ||||||
|  | (env) $ python campcam.py | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Process Control | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ sudo apt install supervisor | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Append to `/etc/supervisor/supervisor.conf`, replace `tanner` with your Linux username: | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | [program:campcam] | ||||||
|  | user=tanner | ||||||
|  | directory=/home/tanner/campcam | ||||||
|  | command=/home/tanner/campcam/env/bin/python -u campcam.py | ||||||
|  | stopsignal=INT | ||||||
|  | stopasgroup=true | ||||||
|  | killasgroup=true | ||||||
|  | autostart=true | ||||||
|  | autorestart=true | ||||||
|  | stderr_logfile=/var/log/campcam.log | ||||||
|  | stderr_logfile_maxbytes=10MB | ||||||
|  | stdout_logfile=/var/log/campcam.log | ||||||
|  | stdout_logfile_maxbytes=10MB | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ sudo supervisorctl reread; sudo supervisorctl update | ||||||
| ``` | ``` | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								campcam.py
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								campcam.py
									
									
									
									
									
								
							| @@ -1,39 +1,52 @@ | |||||||
| import telegram | import logging | ||||||
| from telegram.ext import CommandHandler, Updater |  | ||||||
| import picamera | import picamera | ||||||
| import time | import time | ||||||
| import os |  | ||||||
|  | from telegram import ForceReply, Update | ||||||
|  | from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters | ||||||
|  |  | ||||||
| import secrets | import secrets | ||||||
|  |  | ||||||
| bot = telegram.Bot(token=secrets.API_TOKEN) | logging.basicConfig( | ||||||
|  |     format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO | ||||||
|  | ) | ||||||
|  | logging.getLogger('httpx').setLevel(logging.WARNING) | ||||||
|  |  | ||||||
| def send_photo(update, context): | logger = logging.getLogger(__name__) | ||||||
|     # Take a photo with the Raspberry Pi camera |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | async def start(update, context): | ||||||
|  |     user = update.effective_user | ||||||
|  |     await update.message.reply_html( | ||||||
|  |         rf'Hi {user.mention_html()}!', | ||||||
|  |         reply_markup=ForceReply(selective=True), | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  | async def campcam(update, context): | ||||||
|     print('Got campcam command') |     print('Got campcam command') | ||||||
|  |  | ||||||
|     with picamera.PiCamera() as camera: |     with picamera.PiCamera() as camera: | ||||||
|         camera.resolution = (2592, 1944) |         camera.resolution = (2592, 1944) | ||||||
|         camera.start_preview() |         camera.start_preview() | ||||||
|         # Camera warm-up time |  | ||||||
|         time.sleep(5) |         time.sleep(5) | ||||||
|         # Save the photo to a file |  | ||||||
|         filename = 'data/' + str(int(time.time())) + '.jpg' |         filename = 'data/' + str(int(time.time())) + '.jpg' | ||||||
|         camera.capture(filename) |         camera.capture(filename) | ||||||
|  |  | ||||||
|     print('Saved file to', filename) |     print('Saved file to', filename) | ||||||
|  |  | ||||||
|     chat_id = update.message.chat_id |     await update.message.reply_photo(photo=open(filename, 'rb'), connect_timeout=300, write_timeout=300, read_timeout=300) | ||||||
|     message_id = update.message.message_id |  | ||||||
|     bot.send_photo(chat_id=chat_id, photo=open(filename, 'rb'), reply_to_message_id=message_id) |  | ||||||
|  |  | ||||||
|     print('Sent to chat') |     print('Sent to chat') | ||||||
|  |  | ||||||
| send_photo_handler = CommandHandler('campcam', send_photo) |  | ||||||
| updater = Updater(bot=bot, workers=1) |  | ||||||
| dispatcher = updater.dispatcher |  | ||||||
| dispatcher.add_handler(send_photo_handler) |  | ||||||
|  |  | ||||||
| print('Loaded.') | def main(): | ||||||
|  |     application = Application.builder().token(secrets.API_TOKEN).build() | ||||||
|  |  | ||||||
| updater.start_polling() |     application.add_handler(CommandHandler('start', start)) | ||||||
|  |     application.add_handler(CommandHandler('campcam', campcam)) | ||||||
|  |  | ||||||
|  |     application.run_polling(allowed_updates=Update.ALL_TYPES) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | anyio==4.3.0 | ||||||
|  | APScheduler==3.6.3 | ||||||
|  | cachetools==4.2.2 | ||||||
|  | certifi==2024.2.2 | ||||||
|  | exceptiongroup==1.2.1 | ||||||
|  | h11==0.14.0 | ||||||
|  | httpcore==1.0.5 | ||||||
|  | httpx==0.27.0 | ||||||
|  | idna==3.7 | ||||||
|  | picamera==1.13 | ||||||
|  | python-telegram-bot==21.1.1 | ||||||
|  | pytz==2024.1 | ||||||
|  | six==1.16.0 | ||||||
|  | sniffio==1.3.1 | ||||||
|  | tornado==6.1 | ||||||
|  | typing-extensions==4.11.0 | ||||||
|  | tzlocal==5.2 | ||||||
							
								
								
									
										1
									
								
								secrets.py.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								secrets.py.example
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | API_TOKEN = '' | ||||||
		Reference in New Issue
	
	Block a user