JavaRush /Java blogi /Random-UZ /Telegram boti birinchi loyiha sifatida va uning shaxsiy t...
Pavel Mironov (Miroha)
Daraja
Москва

Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati

Guruhda nashr etilgan
Hammaga salom! O'zingiz haqingizda gapirib bering. Men 24 yoshdaman, o'tgan yili texnik universitetni tugatganman va hali ish tajribasi yo'q. Oldinga qarab shuni aytmoqchimanki, dastlab belgilangan rejada (2019 yil kuzida tuzilgan) men 2020 yilning mart-aprel oylarida ishga borishni rejalashtirgandim, lekin afsuski, karantin aralashib ketdi, shuning uchun hammasini o'rtalariga qoldirdim. -yoz va kelajakda o'z muvaffaqiyat hikoyamni yozishga umid qilaman. Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 1Men hech qachon dasturlashga qiziqmaganman. Universitetda ular etarli darajada dasturlashni o'rgatishdi, lekin bu hunar o'shanda meni qiziqtirmasdi. Shuningdek, protsessual tillar (C), OOP (Java) bo'yicha bir yillik kurs, ma'lumotlar bazalari, hatto assembler va C++ ham bor edi. Ammo rostini aytsam, men o'qishga umuman befarq edim, chunki o'qitiladigan fanlarning aksariyati menga foydasiz bo'lib tuyuldi, faqat hisobot berish uchun mos edi (asosan, shunday). Universitetni tugatgandan so'ng, men qaror qabul qilishim kerak edi: men ba'zi ko'nikmalarga ega bo'lmaganman, lekin ishlashim kerak edi. Men o'z-o'zini tarbiyalash haqida o'ylashim kerak edi (oh, men hech bo'lmaganda 2 yilni qo'ldan boy berib o'tkazib yubordim) va tanlov tabiiy ravishda Java-ga tushdi, chunki universitetdagi OOP kursida yigitlardan biri javarush kursini tavsiya qilgan. , va u, siz bilganingizdek, Java tiliga bag'ishlangan. Kurs taqdimoti meni qiziqtirdi. Ha, men o'shanda dasturlashni yoqtirmasdim, chunki har qanday qiyinchilikka duch kelganimda darhol taslim bo'ldim va dasturlashda yetarlicha qiyinchiliklar mavjud. Ammo shu bilan birga, men kod yozishni xohlayotganimni his qildim, shuning uchun oxir-oqibat dasturlash bilan shug'ullanishga qaror qildim. Men sizga javarush bilan bo'lgan tajribam haqida qisqacha aytib beraman. Men 2019 yil avgust oyida boshladim, darhol bir oyga obuna sotib oldim, lekin 7-darajada men vazifalar qiyinligini angladim. Men kursni chetga surib, Shildtni oldim. Shunday qilib, parallel ravishda men 3 oylik kursni tugatdim. Men 20-darajaga yetdim (bu mening ikkinchi hisobim), Shildtni deyarli toʻliq oʻqib chiqdim, keyin bu yerdagi vazifalardan charchadim, bunda oʻzim uchun amaliy foyda koʻrishni toʻxtatdim. Men codewars, leetcode-ga bordim va video kurslarni tomosha qilishni boshladim. Aytgancha, 3 oy ichida men "Oh, yo'q, massiv nima? U bilan qanday ishlash kerak va nima uchun bu juda qo'rqinchli" dan ketdim? yig'ish sinflarining manba kodini batafsil o'rganishga (ArrayList, HashMap va boshqalar). Shaxsiy tajribaga asoslanib, men yangi boshlanuvchilarga aytaman: bu erda asosiy narsa, agar siz hech narsani tushunmasangiz va hech narsani hal qila olmasangiz, paydo bo'ladigan tuyg'uni engishdir. Bu paydo bo'lganda, siz shunchaki hamma narsadan voz kechmoqchisiz va siz bu masalada juda ahmoq bo'lib tuyulasiz. Agar siz o'zingizning ichingizda bunday daqiqalarni engib, ruhiy dam olsangiz, muvaffaqiyat keladi. O'ylaymanki, ko'p odamlar bunga dosh bera olmaydilar, shuning uchun ular tezda bunday harakatlardan voz kechishadi. Natijada, 2019 yil dekabr oyida men o'z loyiham haqida o'ylay boshladim. Men Telegram botini tanlashga qaror qildim, lekin hech qanday fikr yo'q edi. Shu bilan birga, bitta do'stga telegrammada o'z guruhi uchun funksiya kerak bo'lib, u avtomatlashtirishni xohlaydi. U dasturlashni chuqur o'rganayotganimni bildi va menga loyiha taklif qildi. Men uchun, tajriba va kelajakdagi rezyume uchun, u uchun, guruhni rivojlantirish uchun. Men hatto uning fikrini keltirishga ruxsat beraman: "Недавно софтину хотел у программиста заказать, которая загружала бы в выбранное Облако файлы по прямым linkм. Это интересно, так How аналогов нет. И просто очень удобно. Суть: копируешь ссылку, вставляешь в окно и выбираешь нужное Облако (GDrive, Mail, Яндекс Диск и т.п), в своё время софт всё делает на стороне serverа и юзеру ничего не нужно загружать на свою машину (особенно круто, когда у тебя сборка на SSD-накопителях). Думали сделать в web-интерфейсе, чтобы можно было запускать How с телефонов, так и с десктопа... Можно в принципе через приложение реализовать, а не через web-интерфейс. Тебе такое по силам?"Men ishlay boshladim, lekin oxir-oqibat, bir necha kundan so'ng, biz uchun hech narsa ish bermasligini tushundim, bu asosan bilim etishmasligi tufayli. Do'stim Cloud.Mail-ga xuddi shunday havolalar kerak edi, lekin ular hali ham yo'q. API-ga ega emasman. GDrive orqali biror narsani birlashtirishga urinish bo'ldi, lekin amalga oshirish cho'loq edi, bundan tashqari, bu bulut xizmati “mijoz”ga mos kelmadi. Garchi dastlab u tanlash uchun bir nechta bulutlarni taklif qilgan bo'lsa-da, oxir-oqibat u pochtadan boshqa hamma narsani rad etdi. .ru, buning uchun hech qanday yechim topilmadi. Negadir hammasi qimmat bo'lib chiqdi, ma'lumotlar bazasini ulash, saqlash uchun serverdan foydalanish va hokazo. Aytgancha, unga hali ham ushbu veb-ilova kerak. t biz uchun ishlamasam, men ma'lumot botini yaratishga qaror qildim.Bu Google Play do'konidan o'yinga havolalarni olish, havolani tahlil qilish va olingan ma'lumotlarni kutubxonaga saqlash va keyin uni json fayliga yozish kerak edi. Shunday qilib, har bir so‘rov bilan foydalanuvchilarning sa’y-harakatlari evaziga kutubxona kengayishi mumkin.Kelgusida Google Play’ga o‘tish orqali o‘yin haqida ma’lumotni qulay shaklda ololmaysiz. Siz shunchaki /libraryHere_game_name buyrug'ini yozasiz va kerakli hamma narsani olasiz. Ammo bir qancha qiyinchiliklar bor, ular haqida keyinroq aytib beraman. Avvaliga men sekin rivojlandim, chunki men bir vaqtning o'zida ikkita SQL kursini o'ta boshladim. Men bot qanday ishlashini va so'rovlarni qanday ko'rib chiqishni tushuna olmadim. Men loyiha ustida ishlashga qiziqqan do'stim bilan uchrashdim. Botning birinchi versiyasi taxminan bir oy ichida tayyor edi, ammo do'stim bilan kelishmovchiliklar paydo bo'ldi (mening tomondan). Men botning tahlil qilish uchun mas'ul bo'lgan qismini oldim va u bevosita botga bo'lgan so'rovlar va ularni qayta ishlash ustida ishladi. Negadir u botni murakkablashtira boshladi, qandaydir avtorizatsiyani joriy qila boshladi, administratorlarni ixtiro qildi, keraksiz funksiyalarni qo'shdi, bundan tashqari uning kodlash uslubi menga yoqmadi. Menimcha, bu axborot botida kerak emas edi. Shunday qilib, men o'zimga kerak bo'lgan funksionallik bilan noldan bot yozishga qaror qildim. Endi men sizga bot aslida nima qilishini aytib beraman (loyiha kodidan misol yordamida). Maqolaning oxirida loyihaning to'liq kodini ilova qilaman va afsuski, bu haqda to'liq sharhlay olmayman. Botga yuborilgan har qanday foydalanuvchi xabari Update sinfining ob'ekti hisoblanadi. U juda ko'p ma'lumotlarni o'z ichiga oladi (xabar identifikatori, chat identifikatori, noyob foydalanuvchi identifikatori va boshqalar). Yangilashning bir nechta turlari mavjud: bu matnli xabar bo'lishi mumkin, bu telegram klaviaturasidan javob (qayta qo'ng'iroq), fotosurat, audio va boshqalar bo'lishi mumkin. Foydalanuvchini ortiqcha chalkashmaslik uchun men klaviaturadan faqat matn so'rovlari va qayta qo'ng'iroqlarni qayta ishlayman. Agar foydalanuvchi fotosurat yuborsa, bot unga u bilan hech narsa qilmoqchi emasligi haqida xabar beradi. Asosiy bot sinfida onUpdateReceived usulida bot yangilanishni oladi.
@Override
    public void onUpdateReceived(Update update) {
        UpdatesReceiver.handleUpdates(update);
    }
men ishlov beruvchiga o'tkazaman (o'z UpdatesReceiver klassi):
public static void handleUpdates(Update update) {
        ...
        if (update.hasMessage() && update.getMessage().hasText()){
            log.info("[Update (id {}) типа \"Текстовое сообщение\"]", update.getUpdateId());
            new TextMessageHandler(update, replyGenerator).handleTextMessage();
        }
        else if (update.hasCallbackQuery()) {
            //логгирование
            new CallbackQueryHandler(update, replyGenerator).handleCallBackQuery();
        }
        else {
           //логгирование
            replyGenerator.sendTextMessage(update.getMessage().getChatId(), "Я могу принимать только текстовые messages!");
        }
    }
UpdatesReceiver - bu yangilanish turiga qarab boshqaruvni boshqa ixtisoslashtirilgan ishlov beruvchiga o'tkazadigan markaziy ishlov beruvchi: TextMessageHandler yoki CallbackQueryHandler, men ularning konstruktorlariga zanjir bo'ylab yangilanishni uzataman. Yangilanish bot bilan ishlashda eng muhim narsa va uni yo'qotib bo'lmaydi, chunki yangilanishda saqlangan ma'lumotlar yordamida biz qaysi foydalanuvchi va qaysi chatga javob jo'natish kerakligini bilib olamiz. Foydalanuvchiga javoblar yaratish uchun men alohida sinf yozdim. U oddiy matnli xabar, ichki klaviaturali xabar, rasmli xabar va javob klaviaturasi bilan xabar yuborishi mumkin. Inline klaviatura quyidagicha ko'rinadi: Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 1u tugmalarni bosish orqali foydalanuvchi serverga qayta qo'ng'iroqni yuboradigan tugmalarni belgilaydi, ularni oddiy xabarlar bilan deyarli bir xil tarzda qayta ishlash mumkin. Uni "qo'llab-quvvatlash" uchun sizga o'zingizning ishlov beruvchingiz kerak. Biz har bir tugma uchun amalni o'rnatamiz, so'ngra u Update ob'ektiga yoziladi. Bular. "Xarajat" tugmasi uchun biz qayta qo'ng'iroq qilish uchun "/price" tavsifini o'rnatamiz, uni keyinchalik yangilanishdan olishimiz mumkin. Keyinchalik, alohida sinfda men ushbu qayta qo'ng'iroqni qayta ishlashim mumkin:
public void handleCallBackQuery() {
  String call_data = update.getCallbackQuery().getData();
  long message_id = update.getCallbackQuery().getMessage().getMessageId();
  long chat_id = update.getCallbackQuery().getMessage().getChatId();
    switch (call_date){
      case "/price" :
        //тут что-то сделать
        break;
...
Javob berish klaviaturasi quyidagicha ko'rinadi: Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 2Va mohiyatiga ko'ra, u foydalanuvchi yozishni almashtiradi. “Kutubxona” tugmasini bosish tezda botga “Kutubxona” xabarini yuboradi. Klaviaturaning har bir turi uchun men Builder naqshini qo'llagan holda o'z sinfimni yozdim: inline va reply . Natijada, siz o'zingizning talablaringizga qarab, mohiyatan kerakli klaviaturani "chizishingiz" mumkin. Bu juda qulay, chunki klaviaturalar boshqacha bo'lishi mumkin, ammo printsip bir xil bo'lib qoladi. Ichki klaviatura yordamida xabar yuborishning intuitiv usuli:
public synchronized void sendInlineKeyboardMessage(long chat_id, String gameTitle) {
        SendMessage keyboard = InlineKeyboardMarkupBuilder.create(chat_id)
                .setText("Вы может узнать следующую информацию об игре " + gameTitle)
                .row()
                .button("Стоимость " + "\uD83D\uDCB0", "/price " + gameTitle)
                .button("Обновлено " + "\uD83D\uDDD3", "/updated " + gameTitle)
                .button("Версия " + "\uD83D\uDEE0", "/version " + gameTitle)
                .endRow()
                .row()
                .button("Требования " + "\uD83D\uDCF5", "/requirements " + gameTitle)
                .button("Покупки " + "\uD83D\uDED2", "/iap " + gameTitle)
                .button("Размер " + "\uD83D\uDD0E", "/size " + gameTitle)
                .endRow()
                .row()
                .button("Получить всю информацию об игре" + "\uD83D\uDD79", "/all " + gameTitle)
                .endRow()
                .row()
                .button("Скрыть клавиатуру", "close")
                .endRow()
                .build();
        try {
            execute(keyboard);
        } catch (TelegramApiException e) {
            log.error("[Не удалось отправить сообщение с -inline- клавиатурой]: {}", e.getMessage());
        }
    }
Botga qat'iy funksionallik berish uchun slash belgisidan foydalangan holda maxsus buyruqlar ixtiro qilindi: /library, /help, /o'yin va boshqalar. Aks holda, foydalanuvchi yozishi mumkin bo'lgan har qanday axlatni qayta ishlashimiz kerak bo'ladi. Aslida, bu MessageHandler uchun yozilgan:
if (message.equals(ChatCommands.START.getDescription())) {
     replyGenerator.sendTextMessage(chat_id, new StartMessageHandler().reply());
     replyGenerator.sendReplyKeyboardMessage(chat_id);
}
else if (message.equals(ChatCommands.HELP.getDescription())
             || message.equalsIgnoreCase("Помощь")) {
      replyGenerator.sendTextMessage(chat_id, new HelpMessageHandler().reply());
}
 ...
Shunday qilib, siz botga qanday buyruq yuborishingizga qarab, ishga maxsus ishlov beruvchi kiritiladi. Keling, uzoqroqqa boraylik va tahlilchi va kutubxonaning ishini ko'rib chiqaylik. Agar siz botga Google Play do'konidagi o'yinga havola yuborsangiz, maxsus ishlov beruvchi avtomatik ravishda ishlaydi . Bunga javoban foydalanuvchi o'yin haqida ma'lumotni quyidagi shaklda oladi: Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 3Shu bilan birga, o'yinni bot kutubxonasiga (avval mahalliy xaritaga, keyin -> json fayliga) qo'shishga harakat qiladigan usul chaqiriladi. ). Agar o'yin allaqachon kutubxonada bo'lsa, u holda tekshiruv o'tkaziladi (odatiy xashmapda bo'lgani kabi) va agar maydon ma'lumotlari (masalan, versiya raqami o'zgargan bo'lsa), kutubxonadagi o'yin ustiga yoziladi. Hech qanday o'zgarishlar aniqlanmasa, hech qanday yozuv kiritilmaydi. Agar kutubxonada umuman o'yin bo'lmasa, u avval mahalliy xaritaga ( tyk kabi ob'ekt ) yoziladi va keyin json fayliga yoziladi, chunki agar serverdagi dastur kutilmaganda yopilsa, ma'lumotlar yo'qolgan, lekin uni har doim fayl yordamida o'qish mumkin. Aslida, dastur ishga tushganda kutubxona har doim statik blokdagi fayldan birinchi marta yuklanadi:
static {
        TypeFactory typeFactory = mapper.getTypeFactory();
        MapType mapType = typeFactory.constructMapType(ConcurrentSkipListMap.class, String.class, GooglePlayGame.class);

        try {
            Path path = Paths.get(LIBRARY_PATH);
            if (!Files.exists(path)) {
                Files.createDirectories(path.getParent());
                Files.createFile(path);
                log.info("[Файл библиотеки создан]");
            }
            else {
                ConcurrentMap<string, googleplaygame=""> temporary = mapper.readValue(new File(LIBRARY_PATH), mapType);
                games.putAll(temporary);
                log.info("[Количество игр в загруженной библиотеке] = " + games.size());
            }
        }
        catch (IOException e) {
            log.error("[Ошибка при чтении/записи file] {}", e.getMessage());
        }
    }
Bu erda siz qo'shimcha ravishda fayldagi ma'lumotlarni vaqtinchalik xaritaga o'qishingiz kerak, so'ngra faylda o'yinni qidirishda katta harflar sezgirligini saqlab qolish uchun to'liq xaritaga "nusxalanadi" (tITan QuEST yozish orqali bot hali ham topadi. kutubxonadagi Titan Quest o'yini). Boshqa yechim topishning iloji bo'lmadi, bu Jekson yordamida deserializatsiya xususiyatlari. Shunday qilib, havola uchun har bir so'rov bilan, agar iloji bo'lsa, o'yin kutubxonaga qo'shiladi va shu bilan kutubxona kengayadi. Muayyan o'yin haqida qo'shimcha ma'lumotni /libraryGame_Name buyrug'i yordamida olish mumkin . Siz bir vaqtning o'zida ma'lum bir parametrni (masalan, joriy versiya) va barcha parametrlarni topishingiz mumkin. Bu avvalroq muhokama qilingan inline klaviatura yordamida amalga oshiriladi. Ish davomida bu yerda olingan ko‘nikmalarni masalalar yechishda ham qo‘lladim. Masalan, kutubxonada joylashgan tasodifiy o'yinlar nomlari ro'yxati (variant /library buyrug'i yordamida mavjud):
private String getRandomTitles(){
        if (LibraryService.getLibrary().size() < 10){
            return String.join("\n", LibraryService.getLibrary().keySet());
        }
        List<string> keys = new ArrayList<>(LibraryService.getLibrary().keySet());
        Collections.shuffle(keys);
        List<string> randomKeys = keys.subList(0, 10);
        return String.join("\n", randomKeys);
    }
Bot havolalarni qanday qayta ishlaydi? U ularni Google Play-ga tegishli yoki yo'qligini tekshiradi (xost, protokol, port):
private static class GooglePlayCorrectURL {

        private static final String VALID_HOST = "play.google.com";

        private static final String VALID_PROTOCOL = "https";

        private static final int VALID_PORT = -1;

        private static boolean isLinkValid(URI link) {
            return (isHostExist(link) && isProtocolExist(link) && link.getPort() == VALID_PORT);
        }

        private static boolean isProtocolExist(URI link) {
            if (link.getScheme() != null) {
                return link.getScheme().equals(VALID_PROTOCOL);
            }
            else {
                return false;
            }
        }

        private static boolean isHostExist(URI link) {
            if (link.getHost() != null) {
                return link.getHost().equals(VALID_HOST);
            }
            else {
                return false;
            }
        }
Agar hamma narsa tartibda bo'lsa, u holda bot Jsoup kutubxonasidan foydalangan holda havola orqali ulanadi, bu sizga sahifaning HTML kodini olish imkonini beradi, bu keyingi tahlil va tahlil qilish kerak. Siz noto'g'ri yoki zararli havola bilan botni alday olmaysiz.
if (GooglePlayCorrectURL.isLinkValid(link)){
     if (!link.getPath().contains("apps")){
         throw new InvalidGooglePlayLinkException("К сожалению, бот работает исключительно с играми. Введите другую ссылку.");
     }
     URL = forceToRusLocalization(URL);
     document = Jsoup.connect(URL).get();
 }
     else {
         throw new NotGooglePlayLinkException();
      }
...
Bu erda biz mintaqaviy sozlamalar bilan bog'liq muammoni hal qilishimiz kerak edi. Bot Google Play do'koniga Evropada joylashgan serverdan ulanadi, shuning uchun Google Play do'konidagi sahifa tegishli tilda ochiladi. Men sahifaning rus tilidagi versiyasiga majburan "yo'naltiruvchi" tayoqchani yozishim kerak edi (loyiha, axir, bizning auditoriyamizga qaratilgan edi). Buni amalga oshirish uchun havolaning oxirida hl parametrini diqqat bilan qo'shishingiz kerak: &hl=ru Google Play serveriga GET so'rovida .
private String forceToRusLocalization(String URL) {
        if (URL.endsWith("&hl=ru")){
            return URL;
        }
        else {
            if (URL.contains("&hl=")){
                URL = URL.replace(
                        URL.substring(URL.length()-"&hl=ru".length()), "&hl=ru");
            }
            else {
                URL += "&hl=ru";
            }
        }
        return URL;
    }
Muvaffaqiyatli ulanishdan so'ng, biz tahlil qilish va tahlil qilish uchun tayyor HTML hujjatini olamiz, ammo bu ushbu maqola doirasidan tashqarida. Parser kodi bu yerda . Tahlil qiluvchining o'zi kerakli ma'lumotlarni oladi va o'yin bilan ob'ekt yaratadi, agar kerak bo'lsa, keyinchalik kutubxonaga qo'shiladi. <h2>Xulosa qilish</h2>Bot ma'lum funksiyalarni o'z ichiga olgan bir nechta buyruqlarni qo'llab-quvvatlaydi. U foydalanuvchidan xabarlarni oladi va ularni o'z buyruqlari bilan moslashtiradi. Agar bu havola yoki /game + link buyrug'i bo'lsa, u o'sha havolani Google Play-ga tegishli yoki yo'qligini tekshiradi. Agar havola to'g'ri bo'lsa, u Jsoup orqali ulanadi va HTML hujjatini oladi. Ushbu hujjat yozma parser asosida tahlil qilinadi. Hujjatdan o'yin haqida kerakli ma'lumotlar olinadi, so'ngra o'yinga ega ob'ekt ushbu ma'lumotlar bilan to'ldiriladi. Keyinchalik, o'yinli ob'ekt mahalliy xotiraga joylashtiriladi (agar o'yin hali mavjud bo'lmasa) va ma'lumotlar yo'qolishining oldini olish uchun darhol faylga yoziladi. Kutubxonada yozilgan o'yinni (o'yin nomi xarita uchun kalit, o'yinga ega ob'ekt xarita uchun qiymat) /library Game_name buyrug'i yordamida olinishi mumkin. Agar ko'rsatilgan o'yin bot kutubxonasida topilsa, foydalanuvchiga o'yin haqida ma'lumot olishi mumkin bo'lgan ichki klaviatura qaytariladi. Agar o'yin topilmasa, siz yoki nomning to'g'ri yozilganligiga ishonch hosil qilishingiz kerak (u Google Play do'konidagi o'yin nomiga to'liq mos kelishi kerak, bundan tashqari) yoki botni yuborish orqali o'yinni kutubxonaga qo'shishingiz kerak. o'yinga havola. Men botni heroku-ga joylashtirdim va kelajakda o'z botini yozishni va uni heroku-da bepul joylashtirishni rejalashtirganlar uchun siz duch kelishi mumkin bo'lgan qiyinchiliklarni hal qilish uchun bir nechta tavsiyalar beraman (chunki men ularga o'zim duch kelganman). Afsuski, Heroku-ning tabiatiga ko'ra, bot kutubxonasi doimo har 24 soatda bir marta "qayta o'rnatiladi". Mening rejam Heroku serverlarida fayllarni saqlashni qo'llab-quvvatlamaydi, shuning uchun u mening o'yin faylimni Github'dan tortib oladi. Bir nechta echim bor edi: ma'lumotlar bazasidan foydalaning yoki ushbu faylni o'yin bilan saqlaydigan boshqa serverni qidiring. Men hozircha hech narsa qilmaslikka qaror qildim, chunki aslida bot unchalik foydali emas. Bu menga to'liq tajriba orttirish uchun kerak edi, bu men erishgan narsadir. Shunday qilib, Heroku uchun tavsiyalar:
  1. Agar siz Rossiyada yashasangiz, VPN orqali heroku-da ro'yxatdan o'tishingiz kerak bo'ladi.

  2. Loyihaning ildiziga Procfile deb nomlangan kengaytmasiz faylni qo'yish kerak. Uning mazmuni shunday bo'lishi kerak: https://github.com/miroha/Telegram-Bot/blob/master/Procfile

  3. Pom.xml da, misolga muvofiq quyidagi qatorlarni qo'shing , bu erda mainClass tegida asosiy usulni o'z ichiga olgan sinfga yo'l ko'rsatiladi: bot.BotApplication (agar BotApplication klassi bot papkasida bo'lsa).

  4. Mvn paketi buyruqlari va boshqalar yordamida hech qanday loyiha qurmang, Heroku siz uchun hamma narsani yig'adi.

  5. Loyihaga gitignore qo'shish tavsiya etiladi, masalan:

    # Log file
    *.log
    
    # Compiled resources
    target
    
    # Tests
    test
    
    # IDEA files
    .idea
    *.iml
  6. Aslida loyihani github-ga yuklang va keyin omborni Heroku-ga ulang (yoki boshqa usullardan foydalaning, adashmasam, ulardan 3 tasi bor).

  7. Agar yuklab olish muvaffaqiyatli bo'lsa ("Yaratish muvaffaqiyatli bo'ldi"), Dynos sozlamalariga o'tishni unutmang:

    Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 4

    va slayderni o'zgartiring, so'ngra uning ON holatida ekanligiga ishonch hosil qiling (men buni qilmaganim sababli, mening botim ishlamadi va men bir necha kun miyamni sindirib tashladim va juda ko'p keraksiz harakatlar qildim. ).

  8. Github-da bot tokenini yashiring. Buning uchun siz muhit o'zgaruvchisidan tokenni olishingiz kerak:

    public class Bot extends TelegramLongPollingBot {
    
        private static final String BOT_TOKEN = System.getenv("TOKEN");
    
        @Override
        public String getBotToken() {
            return BOT_TOKEN;
        }
    ...
    }

    Va keyin botni joylashtirgandan so'ng, ushbu o'zgaruvchini Sozlamalar yorlig'idagi Heroku asboblar paneliga o'rnating (TOKENning o'ng tomonida VALUE maydoni bo'ladi, u erda bot tokenini nusxalash):

    Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 5
Umuman olganda, o'z loyiham ustida ishlagan 2 oy ichida men:
  • Java-da yozilgan to'liq ishlaydigan loyihani oldi;
  • uchinchi tomon API (Telegram Bot API) bilan ishlashni o'rgangan;
  • amalda men seriallashtirishni chuqurroq o'rgandim, JSON va Jekson kutubxonasi bilan ko'p ishladim (dastlab men GSON dan foydalandim, lekin u bilan bog'liq muammolar bor edi);
  • fayllar bilan ishlash ko'nikmalarimni mustahkamladim, Java NIO bilan tanishdim;
  • konfiguratsiya .xml fayllari bilan ishlashni o'rgandim va o'zimni jurnalga o'rgandim;
  • Rivojlanish muhitida (IDEA) yaxshilangan malaka;
  • git bilan ishlashni o'rgandi va gitignore qiymatini o'rgandi;
  • veb-sahifalarni tahlil qilish bo'yicha ko'nikmalarga ega bo'ldi (Jsoup kutubxonasi);
  • bir nechta dizayn naqshlarini o'rgangan va qo'llagan;
  • kodni yaxshilash tuyg'usi va istagi rivojlangan (refaktoring);
  • Men Internetda yechim topishni va javob topa olmagan savollarni berishdan uyalmaslikni o'rgandim.
Telegram boti birinchi loyiha sifatida va uning shaxsiy tajribaga asoslangan kasbiy o'sishdagi ahamiyati - 7Bot qanchalik foydali yoki befoyda ekanligini yoki kod qanchalik chiroyli/xunuk ekanligini bilmayman, lekin men olgan tajriba, albatta, bunga arziydi. Loyiham uchun mas'uliyat hissini his qildim. Vaqti-vaqti bilan men uni yaxshilashni, yangi narsalarni qo'shishni xohlayman. Men uni ishga tushirganimda va hamma narsa men xohlagandek ishlayotganini ko'rganimda, bu haqiqiy hayajon edi. Bu asosiy narsa emasmi? Qilayotgan ishingizdan rohatlaning va oxirgi shokolad bari kabi har bir ishlaydigan kod qatoridan zavqlaning. Shuning uchun, agar siz dasturlashni o'zlashtirayotgan bo'lsangiz, unda sizga maslahatim: bu erda 40-darajagacha qolmang, balki imkon qadar ertaroq o'z loyihangizni boshlang. Agar kimdir qiziqsa, loyihaning manba kodi bu erda (Bahor uchun qayta yozilgan): https://github.com/miroha/GooglePlayGames-TelegramBot So'nggi ikki oy davomida men yangi materialni deyarli o'rganmadim, chunki menga shunday tuyuladi. men boshi berk ko'chaga yetdim. Ishsiz, men endi qaerda rivojlanishni ko'rmayapman, faqat bahorgi ramkani o'rgatishdan tashqari, keyingi oyda qilishni rejalashtirgan narsam. Va keyin men ushbu ramka yordamida botni "qayta yozishga" harakat qilaman. Har qanday savolga javob berishga tayyor. :) Hammaga omad! 07.07.2020 YANGILANISh Sof Java-dagi bot ombori yoʻqoldi (men uni oʻchirib tashladim, nusxasi boshqa mahalliy mashinada qoldi), lekin Spring Boot uchun qayta yozilgan botni yuklab oldim: https://github.com/miroha /GooglePlayGames-TelegramBot
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION