Send-To-Kindle 텔레그램 봇 개발

18416 단어 bookskindlego
최근에 저는 태블릿에서 Kindle 앱을 많이 사용하고 있으며 전자책을 태블릿으로 보내는 것이 항상 번거롭습니다. 제대로 된 포맷으로 변환해서 어떻게든 옮겨야지... 머...

그래서 저는 여러분을 위해 이 모든 작업을 수행하는 Telegram 봇을 만들기로 결정했습니다. 책을 보내면 Kindle에 나타납니다. 모든 형식이 지원됩니다. 그게 다야 - 그렇게 간단해!

Go를 더 연습하고 싶어서 언어로 사용하기로 결정했습니다.

프로그래밍 방식으로 책을 .mobi로 변환



주요 과제였습니다. 변환기를 직접 코딩하고 싶지 않았기 때문에 다른 방법으로 인터넷 검색을 시작했습니다. 또한 API에 의존하고 싶지 않았기 때문에 API가 있는 일부 온라인 변환 도구를 사용하지 않기로 결정했습니다.
그래서 얼마 후 전자책 관리용 인기 소프트웨어인 Calibre에 CLI tools이 있다는 사실을 우연히 발견했습니다. 그들은 모든 것을 가지고 있었고 완벽했습니다!

그래서 코딩을 시작했습니다.
변환 자체는 다음과 같습니다. 전자책에 대한 입력 및 출력 경로를 허용하고 이를 ebook-convert CLI 도구로 전달하는 간단한 방법입니다.

func convert(in, out string) error {
    cmd := exec.Command("ebook-convert", in, out)
    if err := cmd.Run(); err != nil {
        return err
    }
    if err := cmd.Wait(); err != nil {
        return err
    }
    if _, err := os.Stat(out); errors.Is(err, os.ErrNotExist) {
        return errConversion
    }
    return nil
}


텔레그램 통합



다음은 텔레그램 통합이었습니다. 쉽습니다.

BotFather을 사용하여 봇 자격 증명을 생성했습니다.
Telegram과의 통합을 위해 Go용 봇 프레임워크를 찾았습니다. - Telebot
설정은 매우 쉬웠습니다.

func (b *SendToKindleBot) Start() error {
    bot, err := tb.NewBot(tb.Settings{
        Token:  b.Token,
        Poller: &tb.LongPoller{Timeout: 10 * time.Second},
    })
    if err != nil {
        return ErrStartup
    }
    bot.Start()
    return nil
}


이메일로 보내기



내 봇이 전자책을 보내는 데 사용할 이메일을 만들었습니다.
그런 다음 킨들 설정에서 Approved Personal Document Email List 에 추가하는 것을 잊지 마십시오.

방법 자체는 매우 간단합니다.

func (b *SendToKindleBot) sendFileViaEmail(path string) error {
    msg := email.NewMessage("", "")
    msg.From = mail.Address{Name: "From", Address: b.EmailFrom}
    msg.To = []string{b.EmailTo}

    if err := msg.Attach(path); err != nil {
        return err
    }

    auth := smtp.PlainAuth("", b.EmailFrom, b.Password, b.SMTPHost)
    addr := fmt.Sprintf("%s:%s", b.SMTPHost, b.SMTPPort)
    if err := email.Send(addr, auth, msg); err != nil {
        return err
    }
    return nil
}


물건 모으기



그래서 다음으로 전보 봇의 모든 내부를 작성했습니다. 중요한 것은 파일을 수신하고 내 빛나기로 보내는 처리기입니다.

func (b *SendToKindleBot) documentHandler(bot *tb.Bot) func(msg *tb.Message) {
    return func(msg *tb.Message) {
        doc := msg.Document
        nameParts := strings.Split(doc.FileName, ".")
        fileNameWithoutExtension := strings.Join(nameParts[:len(nameParts)-1], "")
        extension := nameParts[len(nameParts)-1]

        originalFilePath := tmpFilesPath + doc.FileName
        if err := bot.Download(&doc.File, originalFilePath); err != nil {
            log.Println("could not download file", err)
            respond(bot, msg, "Sorry. I could not download file")
        }
        defer removeSilently(originalFilePath)

        fileToSend := originalFilePath
        if needToConvert(extension) {
            outputFilePath := tmpFilesPath + fileNameWithoutExtension + ".mobi"
            if err := convert(originalFilePath, outputFilePath); err != nil {
                log.Println("could not convert file", err)
                respond(bot, msg, "Sorry. I could not convert file")
            }
            fileToSend = outputFilePath
            defer removeSilently(outputFilePath)
        }

        if err := b.sendFileViaEmail(fileToSend); err != nil {
            log.Println("could not send file", err)
            respond(bot, msg, "Sorry. I could not send file")
        }
    }
}


그리고 그것을 봇에 등록했습니다:

...
bot.Handle(tb.OnDocument, b.documentHandler(bot))
...


도커 컨테이너 생성



DigitalOcean에 쉽게 배포하고 연중무휴로 실행할 수 있도록 이 앱을 도커 컨테이너에 넣고 싶었습니다.
이것은 약간 까다로워졌습니다. Calibre Tools의 설치는 간단하지 않았습니다. 그래도 많은 시도 끝에 다음 Dockerfile을 생각해 냈습니다.

FROM amd64/ubuntu
COPY --from=golang:1.16.11-bullseye /usr/local/go/ /usr/local/go/
ENV PATH="/usr/local/go/bin:${PATH}"

RUN go env -w GOPROXY=direct GOFLAGS="-insecure"
ENV TZ=Europe/Minsk
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y git && \
    apt-get install wget && \
    apt-get install -y python
RUN apt-get install -y ffmpeg libsm6 libxext6
RUN wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sh /dev/stdin
RUN mkdir -p files
WORKDIR /app

COPY . .

RUN go build

RUN chmod +x ./send-to-kindle-telegram-bot
CMD ["./send-to-kindle-telegram-bot"]


결론



많은 테스트를 거친 후 마침내 DigitalOcean에서 앱을 실행했습니다.

이 봇이 유용하길 바랍니다!
내 GitHub에서 찾을 수 있는 전체 코드: https://github.com/michaelfmnk/send-to-kindle-telegram-bot
제안, 아이디어 또는 협업에 열려 있습니다 :)

좋은 웹페이지 즐겨찾기