Automatinis didelio kiekio failų siuntimo per Telegram skriptas

 Įvadas

Prieš pradedant detaliai nagrinėti šį scenarijų, norėčiau paminėti, kad jau perkėliau savo tinklaraštį iš wordpress.com, nes gavau nusiskundimų dėl pernelyg didelio reklaminių partnerių kiekio mano tinklaraštyje. Taip pat nusprendžiau, kad komentarus skriptuose rašysiu anglų kalba. Tai ne tik pagerins mano anglų kalbos įgūdžius, bet ir padės kitiems programuotojams lengviau suprasti mano kodą.

  #!/bin/bash

# Įkelkite konfigūracijos failą (naudokite pilną arba reliatyvų kelią)
# Load the configuration file (use full or relative path)
CONFIG_FILE="$(dirname "$0")/config.sh"
if [ ! -f "$CONFIG_FILE" ]; then
    echo "Config failas nerastas: $CONFIG_FILE" # Configuration file not found
    exit 1
fi
source "$CONFIG_FILE"

echo "Naudojamas config.sh failas: $CONFIG_FILE" # Using config.sh file
echo "chat_id: $chat_id, bot_token: $bot_token"

chat_id="$group_chat_id"

# Nurodytas katalogas / Specified directory
directory="/home/vaidotak/Archyvuoti/calibre_pdf/"

# Patikrinkite, ar katalogas egzistuoja / Check if the directory exists
if [ ! -d "$directory" ]; then
    echo "Katalogas '$directory' neegzistuoja arba nėra katalogas" # Directory does not exist or is not a directory
    exit 1
fi

# Siuntimo žurnalo failas / Send log file
log_file="$directory/send_log.txt"

# Patikrinkite, ar siuntimo žurnalo failas egzistuoja, jei ne - sukurkite
# Check if the send log file exists, if not - create it
if [ ! -f "$log_file" ]; then
    touch "$log_file"
fi

# Pereikite per visus failus kataloge / Iterate over all files in the directory
for file in "$directory"/*; do
    if [ -f "$file" ]; then
        # Patikrinkite, ar failas jau buvo išsiųstas
        # Check if the file has already been sent
        if grep -q "$(basename "$file")" "$log_file"; then
            echo "Failas $(basename "$file") jau buvo išsiųstas. Praleidžiama." # File has already been sent. Skipping.
            continue
        fi

        echo "Siunčiamas failas: $file" # Sending file

        # Siųskite failą per Telegram / Send the file via Telegram
        response=$(curl -F chat_id="${chat_id}" -F document=@"$file" https://api.telegram.org/bot${bot_token}/sendDocument)
        if [ $? -ne 0 ]; then
            echo "Klaida siunčiant failą: $file" # Error sending file
            logger -p user.err "Klaida siunčiant failą per Telegram: $file" # Error sending file via Telegram
            # Užregistruokite klaidą žurnale / Register error in log
            echo "Failas: $(basename "$file"), Klaida siunčiant, Data: $(date '+%Y-%m-%d %H:%M:%S')" >> "$log_file"
        else
            # Išsiuntimo data ir laikas / Send date and time
            timestamp=$(date '+%Y-%m-%d %H:%M:%S')
            # Failo dydis baitais / File size in bytes
            filesize=$(stat -c%s "$file")
            # Užregistruokite sėkmingą siuntimą žurnale / Register successful send in log
            echo "Failas: $(basename "$file"), Data: $timestamp, Dydis: $filesize B" >> "$log_file"
            echo "Failas $file sėkmingai išsiųstas ir užregistruotas." # File successfully sent and registered
        fi
    fi
done

echo "Visi failai sėkmingai išsiųsti arba pažymėti klaidomis" # All files successfully sent or marked with errors
logger -p user.info "Visi failai sėkmingai išsiųsti arba pažymėti klaidomis" # All files successfully sent or marked with errors

Kam skirtas šis scenarijus?

Šis scenarijus skirtas vartotojams, kurie turi daug failų (šiuo metu siunčiu virš 3000 pdf failų, kurių dydis 64GB), kuriuos reikia nusiųsti per Telegram, ir nori tai padaryti efektyviai bei automatiškai. Tai gali būti naudinga:

  • Mokytojams, dalinantiems mokymo medžiagą.
  • Tyrėjams, skelbiantiems tyrimų rezultatus.
  • Verslininkams, dalinantiems dokumentus su klientais ar partneriais.
  • Bet kam, kas turi reguliariai siųsti failus per Telegram.

Kaip veikia scenarijus?

Skriptas veikia taip:

  1. Nuskaito konfigūracijos failą, kuriame yra chat_id ir bot_token, reikalingi siuntimui per Telegram.
  2. Patikrina, ar nurodytas katalogas egzistuoja.
  3. Sukuria (jei dar nėra) arba atnaujina siuntimo žurnalo failą.
  4. Pereina per visus failus kataloge ir patikrina, ar jie jau buvo išsiųsti (pagal žurnalo įrašus).
  5. Jei failas dar nebuvo išsiųstas, bando jį išsiųsti per Telegram.
  6. Jei siuntimas pavyksta, įrašo informaciją apie siuntimą į žurnalą (failo pavadinimas, data, dydis).
  7. Jei siuntimas nepavyksta, registruoja klaidą žurnale ir pereina prie kito failo.

Kaip naudotis scenarijumi?

Konfigūracijos failas: Įsitikinkite, kad turite konfigūracijos failą config.sh, kuriame yra:


chat_id="JŪSŲ_CHAT_ID"
bot_token="JŪSŲ_BOT_TOKEN"

Failų katalogas: Įdėkite visus failus į katalogą /home/vaidotak/Archyvuoti/calibre_pdf/
Paleiskite scenarijų: Terminale įveskite:

./siuntimo_scenarijus.sh

Stebėkite siuntimo procesą: Skirtuose kataloguose ir žurnalo faile send_log.txt bus registruojami išsiųsti failai bei klaidos.

Privalumai

  • Automatizacija: Sutaupo laiko, nes failai siunčiami automatiškai be vartotojo įsikišimo.
  • Klaidų tvarkymas: Jei siuntimas nepavyksta, klaida registruojama, bet scenarijus tęsia darbą.
  • Žurnalo failas: Sekami visi išsiųsti failai, užtikrinant, kad jie nebūtų siunčiami pakartotinai.
  • Paprastumas: Skriptas yra paprastas naudoti ir nereikalauja gilių programavimo žinių.

Trūkumai

  • Ribotas klaidų tvarkymas: Nors klaidos registruojamos, jų tvarkymas ir atkūrimas nėra automatinis.
  • Specifinis katalogas: Šiuo metu katalogas yra fiksuotas /home/vaidotak/Archyvuoti/calibre_pdf/, kas gali būti nepatogu kai kuriems vartotojams.
  • Telegram priklausomybė: Reikalingas chat_id ir bot_token, kurie turi būti gauti iš Telegram.

Galimi patobulinimai

  • Konfigūruojamas katalogas: Galima pridėti galimybę nurodyti katalogą kaip scenarijaus argumentą.
  • Daugiau klaidų tvarkymo: Patobulinti klaidų tvarkymą, kad būtų galima automatiškai bandyti išsiųsti nepavykusius failus vėliau.
  • Pranešimai: Pridėti pranešimus apie sėkmingą siuntimą ar klaidas vartotojui, naudojant el. paštą ar kitas komunikacijos priemones.
  • GUI: Sukurti grafinę vartotojo sąsają, kad būtų lengviau konfigūruoti ir naudoti scenarijų.

Išvada

Šis scenarijus yra paprastas ir efektyvus būdas automatizuoti failų siuntimą per Telegram. Jis tinka įvairiems vartotojams, kurie nori automatizuoti savo darbo eigą ir užtikrinti, kad visi failai būtų išsiųsti tik vieną kartą. Nors scenarijus turi keletą trūkumų, juos galima lengvai ištaisyti pritaikant scenarijų konkretiems poreikiams.

Atnaujinta: Susidūriau, kad nemažai failų pavadinimų turi įvairių ne kažką simbolių, kaip , ir panašiai. Tai dar vienas skriptukas padeda tą išspręst

  #!/bin/bash

# Nurodome katalogą
katalogas="/home/vaidotak/Archyvuoti/calibre_pdf/"

# Einame per visus failus kataloge
for failas in "$katalogas"*; do
    if [ -f "$failas" ]; then
        # Gauname failo pavadinimą be kelio
        pavadinimas=$(basename "$failas")
        
        # Pakeičiame netinkamus simbolius
        naujas_pavadinimas=$(echo "$pavadinimas" | tr -d ',:;*?<>|&$!#%^@()')
        
        # Pakeičiame tarpus į pabraukimus
        naujas_pavadinimas=${naujas_pavadinimas// /_}
        
        # Jei pavadinimas pasikeitė, pervardijame failą
        if [ "$pavadinimas" != "$naujas_pavadinimas" ]; then
            mv "$failas" "$katalogas$naujas_pavadinimas"
            echo "Pervardinta: $pavadinimas -> $naujas_pavadinimas"
        fi
    fi
done

Komentarai

Populiarūs šio tinklaraščio įrašai

Configuring a NixOS firewall for everyday use

Setting up syncthing as a service on openSUSE and other Linux distributions