AndroGoTeleCam

Используем старый Android телефон для фото наблюдения.

Опубликовано 05-12-2016
Эксперементы
Теги go, android, telegram

Что бы не выбрасывать старый android телефон можно использовать его для наблюдения за дачным периметром или за подачей электроэнергии. Можно даже сделать удаленное управление электро приборами через iot розетки. И для этого совсем необязательно разрабатывать полноценное приложение под android.

Попытаемся реализовать съёмку по удаленной команде. Управлять устройством мы будем через Telegram, отсылая нужные команды botу запущенному под androidом. Список команд:

  • /photo - получить фотографию.
  • /info - получить информацию о телефоне.

Воспользуемся приложениями из маркета: Termux,Termux:API. Это полноценный shell с пакетным менеджером.

Из termuxа выполняем:

apt update
apt upgrade
apt install termux-api golang
termux-setup-storage
mkdir ~/storage/shared/golang
echo "export GOPATH=~/storage/shared/golang" > ~/.bash_profile

Сделаем снимок из консоли:

termux-camera-photo test.jpg

Создаем бота через @BotFather. Полученый token и ваш username подставим в код бота:

package main

import (
	"gopkg.in/telegram-bot-api.v4"
	"log"
	"os/exec"
)

var (
	token    = "key"
	username = "user"
)

func main() {
	bot, err := tgbotapi.NewBotAPI(token)
	if err != nil {
		log.Panic(err)
	}
	bot.Debug = true
	log.Printf("Authorized on account %s", bot.Self.UserName)
	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60
	updates, err := bot.GetUpdatesChan(u)
	for update := range updates {
		if update.Message == nil {
			continue
		}

		log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
		if update.Message.From.UserName == username {
			if update.Message.Text == "/info" {
				out, err := exec.Command("termux-battery-status").Output()
				txt := ""
				if err != nil {
					txt = err.Error()
				} else {
					txt = string(out)
				}

				msg := tgbotapi.NewMessage(update.Message.Chat.ID, txt)
				//msg.ReplyToMessageID = update.Message.MessageID
				bot.Send(msg)
			}
			if update.Message.Text == "/photo" {
				_, err := exec.Command("termux-camera-photo", "send.jpg").Output()

				if err != nil {
					bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, err.Error()))
				} else {

					photo := tgbotapi.NewPhotoUpload(update.Message.Chat.ID, "send.jpg")
					bot.Send(photo)
				}
			}
		}
	}
}