JavaRush /Java блогу /Random-KY /Telegram боту биринчи долбоор катары жана анын жеке тажры...
Pavel Mironov (Miroha)
Деңгээл
Москва

Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси

Группада жарыяланган
Баарына салам! Өзүңүз жөнүндө айтып бериңиз. Мен 24 жаштамын, былтыр техникалык университетти бүтүрдүм, дагы деле иш стажы жок. Алдыга карап, айткым келет, алгач түзүлгөн план боюнча (2019-жылдын күзүндө түзүлгөн) мен 2020-жылдын март-апрель айларында жумушка чыгам деп пландаган элем, тилекке каршы, карантин кийлигишип, баарын ортого жылдырдым. -жай жана келечекте өзүмдүн ийгorк баянымды жазсам деген үмүттөмүн. Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 1Мен эч качан программалоого кызыккан эмесмин. Университетте алар жетиштүү программалоону үйрөтүштү, бирок бул өнөр мени ал кезде кызыктырчу эмес. Ошондой эле proceduresалык тилдер (C), OOP (Java) боюнча бир жылдык курс, маалымат базалары, атүгүл ассемблер жана C++ да болгон. Бирок, чынын айтсам, мен көбүнчө окууга кайдыгер карачумун, анткени окутулган дисциплиналардын көбү мага пайдасыз, отчеттук максатта гана ылайыктуу (негизинен ушундай) көрүнгөн. Университетти аяктагандан кийин, мен чечим чыгарууга туура келди: мен кандайдыр бир көндүмдөрдү алган жокмун, бирок иштешим керек болчу. Мен өз алдынча бorм алуу жөнүндө ойлонушум керек болчу (оо, мен жок эле дегенде 2 жылды бекер отургузуп койдум) жана тандоо табигый түрдө Javaга туура келди, анткени университеттеги OOP курсунда балдардын бири жаваруш курсун сунуштаган. , жана ал, сиз билгендей, Java тorне атайын арналган. Мени курстун презентациясы кызыктырды. Ооба, мен ал кезде программалоону жактырчу эмесмин, анткени кандайдыр бир кыйынчылыкка туш болгондо дароо баш тарттым, программалоодо дагы көп кыйынчылыктар бар. Бирок ошол эле учурда мен code жазгым келгенин сезип, акырында программалоону чечтим. Мен кыскача javarush менен болгон тажрыйбам жөнүндө айтып берем. Мен 2019-жылдын августунда баштадым, дароо бир айга жазылууну сатып алдым, бирок 7-деңгээлде тапшырмалар оор экенин түшүндүм. Мен курсту четке коюп, Шилдтти көтөрдүм. Ошентип параллелдүү түрдө 3 ай курсту бүтүрдүм. Мен 20-деңгээлге жеттим (бул менин экинчи эсебим), Шилдтти дээрлик толугу менен окуп чыктым, анан бул жердеги тапшырмалардан чарчадым, анда мен өзүм үчүн практикалык пайда көрбөй калдым. Мен codewars, leetcode программаларына барып, видео курстарды көрө баштадым. Баса, 3 айдын ичинде мен "Ой жок, массив деген эмне? Аны менен кантип иштеш керек жана эмне үчүн мынчалык коркунучтуу"? чогултуу класстарынын баштапкы codeун деталдуу изилдөөгө (ArrayList, HashMap ж.б.). Жеке тажрыйбага таянып, мен башталгычтарга айтам: бул жерде эң негизгиси, эгер сиз эч нерсени түшүнбөсөңүз жана эч нерсени чече албасаңыз пайда болгон сезимди жеңүү. Ал пайда болгондо, сиз жөн гана бардыгын таштагыңыз келет жана сиз бул маселе үчүн өтө эле акылсыз окшойсуз. Мындай учурларды ичиңизден жеңип, психикалык жактан эс алсаңыз, анда ийгorк келет. Менимче, көп адамдар муну көтөрө алышпайт, ошондуктан алар мындай аракеттерден бат эле баш тартышат. Натыйжада, 2019-жылдын декабрында мен өзүмдүн долбоорум жөнүндө ойлоно баштадым. Мен Telegram ботун тандоону чечтим, бирок оюм жок болчу. Ошол эле учурда бир досу автоматташтырууну каалаган телеграммадагы тобу үчүн функцияга муктаж болчу. Ал менин программалоону тереңдетип окуп жатканымды бorп калып, мага долбоор сунуштады. Мен үчүн, тажрыйба жана келечектеги резюме үчүн, ал үчүн, топтун өнүгүшү үчүн. Мен анын идеясын келтирүүгө уруксат берем: "Недавно софтину хотел у программиста заказать, которая загружала бы в выбранное Облако файлы по прямым linkм. Это интересно, так How аналогов нет. И просто очень удобно. Суть: копируешь ссылку, вставляешь в окно и выбираешь нужное Облако (GDrive, Mail, Яндекс Диск и т.п), в своё время софт всё делает на стороне serverа и юзеру ничего не нужно загружать на свою машину (особенно круто, когда у тебя сборка на SSD-накопителях). Думали сделать в web-интерфейсе, чтобы можно было запускать How с телефонов, так и с десктопа... Можно в принципе через приложение реализовать, а не через web-интерфейс. Тебе такое по силам?"Мен иштей баштадым, бирок акырында, бир-эки күндөн кийин, бorмдин жетишсиздигинен биз үчүн эч нерсе болбой турганын түшүндүм. Досума Cloud.Mail'ге ушул эле шилтемелер керек болчу, бирок алар дагы эле" API жок. GDrive аркылуу бир нерсени бириктирүү аракети болду, бирок ишке ашыруу аксап, анын үстүнө бул булут кызматы “кардарга” туура келген жок. Башында ал тандоо үчүн бир нече булуттарды сунуштаганы менен, акыры почтадан башкасынын баарын четке Howты. .ru, аны чечүү үчүн эч кандай чечим табылган жок. Эмнегедир баары кымбат болуп чыкты, маалымат базасын туташтыруу, сактоо үчүн serverди колдонуу ж.б.у.с.. Айтмакчы, ага дагы эле бул веб-тиркеме керек. t биз үчүн иштебей, мен маалыматтык бот жасоону чечтим.Ал Google Play дүкөнүнөн оюнга шилтемелерди алып, шилтемени талдап, алынган маалыматты китепканага сактап, анан аны json файлына жазыш керек болчу. Ошентип, ар бир суроо-талап менен китепкана колдонуучулардын аракетинин аркасында кеңейе берет.Келечекте Google Play'ге кирип, оюн тууралуу маалыматты ыңгайлуу формада ала албайсыз. Сиз жөн гана /libraryHere_game_name буйругун жазып, керектүү нерселердин баарын аласыз. Бирок бир нече кыйынчылыктар бар, алар жөнүндө кийинчерээк айтып берем. Башында мен акырындык менен алга жылдым, анткени бир эле учурда эки SQL курсун ала баштадым. Мен боттун кантип иштегенин жана суроо-талаптарды кантип иштетүү керектигин түшүнө алган жокмун. Долбоордун үстүндө иштөөгө кызыккан досума жолугуп калдым. Боттун биринчи versionсы болжол менен бир айдын ичинде даяр болду, бирок досум менен пикир келишпестиктер пайда болду (мен тарапта). Мен боттун талдоо үчүн жооптуу бөлүгүн алдым, ал түздөн-түз ботко болгон суроо-талаптар жана аларды иштетүү боюнча иштеди. Эмнегедир ал ботту татаалдаштырып, кандайдыр бир авторизацияны киргизип, администраторлорду ойлоп таап, керексиз функцияларды кошо баштады, плюс анын codeдоо стor мага жаккан жок. Менин оюмча, бул маалыматтык ботто зарыл болгон эмес. Ошентип, мен өзүмө керектүү функция менен нөлдөн баштап бот жазам деп чечтим. Эми мен сизге боттун эмне кыларын айтып берем (долбоордун codeунан мисал менен). Мен макаланын аягында долбоордун толук codeун тиркейм жана тилекке каршы, ага толук комментарий бере албайм. Ботко жөнөтүлгөн ар бир колдонуучунун билдирүүсү Жаңыртуу классынын an objectиси болуп саналат. Ал көп маалыматты камтыйт (билдирүү id, чат id, уникалдуу колдонуучу id ж.б.). Жаңыртуунун бир нече түрү бар: бул тексттик билдирүү болушу мүмкүн, ал телеграмма клавиатурасынан жооп болушу мүмкүн (кайра чалуу), фото, аудио ж.б. Колдонуучунун ашыкча чатакташуусуна жол бербөө үчүн мен тергичтен тексттик суроо-талаптарды жана кайра чалууларды гана иштетем. Колдонуучу сүрөт жөнөтсө, бот аны менен эч нерсе кылгысы келбегенин эскертет. Негизги бот классында, onUpdateReceived методунда, бот жаңыртууну алат.
@Override
    public void onUpdateReceived(Update update) {
        UpdatesReceiver.handleUpdates(update);
    }
аны мен иштеткичке өткөрүп берем (өздүк UpdatesReceiver классы):
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 - бул борбордук иштеткич, ал жаңыртуу түрүнө жараша башкарууну башка адистештирилген иштеткичке өткөрүп берет: TextMessageHandler же CallbackQueryHandler, алардын конструкторлоруна мен жаңыртууну чынжырдан ары өткөрүп берем. Жаңыртуу - бот менен иштөөдө эң маанилүү нерсе жана аны жоготууга болбойт, анткени жаңыланууда сакталган маалыматтын жардамы менен биз жооп кайсы колдонуучуга жана кайсы чатка жөнөтүлүшү керек экенин билебиз. Колдонуучуга жоопторду түзүү үчүн мен өзүнчө класс жаздым. Ал кадимки текст кабарын, саптык баскычтоп менен билдирүүнү, сүрөтү бар билдирүүнү жана жооп баскычтобу менен билдирүүнү жөнөтө алат. Киргизилген клавиатура мындай көрүнөт: Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 1Ал баскычтарды аныктайт, аларды басуу менен колдонуучу serverге кайра чалуу жөнөтөт, аны кадимки билдирүүлөр сыяктуу эле иштетүүгө болот. Аны "камдоо" үчүн сизге өзүңүздүн иштеткичиңиз керек. Биз ар бир баскычка иш-аракетти койдук, ал андан кийин Жаңыртуу an objectисине жазылат. Ошол. "Чыгым" баскычы үчүн биз кайра чалуу үчүн "/баа" сыпаттамасын койдук, аны кийинчерээк жаңыртуудан ала алабыз. Андан кийин, өзүнчө класста мен бул кайра чалууну иштете алам:
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;
...
Жооп берүү клавиатурасы төмөнкүдөй көрүнөт: Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 2Негизи, ал колдонуучунун терүүсүн алмаштырат. "Китепкана" баскычын басуу ботко "Китепкана" билдирүүсүн тез жөнөтөт. Ар бир клавиатура түрү үчүн мен Builder үлгүсүн ишке ашыруу менен өз классымды жаздым: inline жана жооп берүү . Натыйжада, сиз өзүңүздүн талаптарыңызга жараша каалаган клавиатураны "чыйра аласыз". Бул абдан ыңгайлуу, анткени клавиатура ар кандай болушу мүмкүн, бирок принцип ошол эле бойдон калууда. Бул жерде ички баскычтоп менен билдирүү жөнөтүүнүн интуитивдик ыкмасы:
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());
        }
    }
Ботко катуу функционалдуулук берүү үчүн, слэш белгисин колдонуу менен атайын буйруктар ойлоп табылган: /library, /help, /game ж.б. Болбосо, колдонуучу жазган таштандыны кайра иштетүүгө туура келет. Чынында, бул MessageHandler үчүн жазылган:
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());
}
 ...
Ошентип, ботко кандай буйрук жибергениңизге жараша, ишке атайын иштеткич кошулат. Андан ары барып, талдоочу менен китепкананын ишин карап көрөлү. Эгер сиз ботко Google Play дүкөнүндөгү оюнга шилтеме жөнөтсөңүз, анда атайын иштеткич автоматтык түрдө иштейт . Жооп катары колдонуучу оюн жөнүндө маалыматты төмөнкү формада алат: Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 3Ошол эле учурда, оюнду боттун китепканасына кошууга аракет кылган ыкма чакырылат (адегенде жергorктүү картага, андан кийин -> json файлына ). Эгерде оюн мурунтан эле китепканада болсо, анда текшерүү жүргүзүлөт (кадимки хэшмаптагыдай), ал эми талаа маалыматтары (мисалы, versionнын номери өзгөргөн болсо), китепканадагы оюн кайра жазылат. Эгерде эч кандай өзгөртүүлөр аныкталбаса, анда эч кандай жазуулар жасалbyte. Эгерде китепканада таптакыр оюн жок болсо, анда ал адегенде жергorктүү картага ( tyk сыяктуу an object ) жазылып, андан кийин json файлына жазылат, анткени serverдеги тиркеме күтүүсүз жабылып калса, маалыматтар жоголгон, бирок аны ар дайым файлды колдонуп окуса болот. Чынында, программа башталганда, китепкана ар дайым статикалык блоктогу файлдан биринчи жолу жүктөлөт:
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());
        }
    }
Бул жерде сиз кошумча түрдө файлдан маалыматты убактылуу картага окушуңуз керек, андан кийин файлдагы оюнду издөөдө регистрге маани бербөө үчүн толук картага “көчүрүлөт” (tITan QuEST жазуу менен, бот дагы эле табат китепканадагы Titan Quest оюну). Башка чечимди табуу мүмкүн болгон жок, бул Джексондун жардамы менен сериядан чыгаруунун өзгөчөлүктөрү. Ошентип, ар бир шилтемеге суроо-талап менен оюн мүмкүн болсо, китепканага кошулуп, китепкана ошону менен кеңейет. Белгилүү бир оюн жөнүндө кошумча маалыматты /libraryGame_Name буйругу аркылуу алса болот . Сиз бир эле учурда белгилүү бир параметрди (мисалы, учурдагы version) жана бардык параметрлерди биле аласыз. Бул мурун талкууланган саптык клавиатураны колдонуу менен ишке ашырылат. Иш учурунда бул жерден алган шык-жөндөмдөрүмдү маселелерди чечүүдө да колдондум. Мисалы, китепканада жайгашкан кокус оюндардын аталыштарынын тизмеси (опция /library буйругун колдонуу менен жеткorктүү):
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);
    }
Бот шилтемелерди кантип иштетет? Ал алардын Google Play'ге (хост, протокол, порт) таандык экендигин текшерүү үчүн текшерет:
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;
            }
        }
Эгерде баары өз нугунда болсо, анда бот Jsoup китепканасын колдонуу менен шилтеме аркылуу туташат, бул барактын HTML codeун алууга мүмкүндүк берет, ал андан ары талдоо жана талдоо жүргүзүүгө тийиш. Сиз ботту туура эмес же зыяндуу шилтеме менен алдай албайсыз.
if (GooglePlayCorrectURL.isLinkValid(link)){
     if (!link.getPath().contains("apps")){
         throw new InvalidGooglePlayLinkException("К сожалению, бот работает исключительно с играми. Введите другую ссылку.");
     }
     URL = forceToRusLocalization(URL);
     document = Jsoup.connect(URL).get();
 }
     else {
         throw new NotGooglePlayLinkException();
      }
...
Бул жерде биз аймактык орнотуулар менен көйгөйдү чечүүгө туура келди. Бот Google Play дүкөнүнө Европада жайгашкан serverден туташат, андыктан Google Play дүкөнүндөгү баракча тиешелүү тилде ачылат. Мен балдакты жазууга туура келди, ал беттин орусча versionсына мажбурлап "багыттоо" (долбоор, баары бир, биздин аудиторияга багытталган). Бул үчүн, шилтеменин аягында кылдаттык менен hl: &hl=ru параметрин Google Play serverине GET өтүнүчүн кошуу керек .
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;
    }
Ийгorктүү туташуудан кийин биз талдоо жана талдоо үчүн даяр HTML documentин алабыз, бирок бул макаланын алкагынан чыкпайт. Талдоочу codeу бул жерде . Талдоочу өзү керектүү маалыматты алат жана оюн менен an objectти түзөт, ал кийинчерээк керек болсо китепканага кошулат. <h2>Кыскача айтканда</h2>Бот белгилүү бир функцияны камтыган бир нече буйруктарды колдойт. Ал колдонуучудан билдирүүлөрдү кабыл алат жана аларды буйруктары менен дал келтирет. Эгер бул шилтеме же /game + шилтеме буйругу болсо, ал шилтемени Google Play'ге таандык же жокпу, текшерет. Шилтеме туура болсо, ал Jsoup аркылуу туташып, HTML documentин алат. Бул document жазылган талдоочу негизинде талданат. Оюн жөнүндө керектүү маалымат documentтен чыгарылат, андан кийин оюну бар an object бул маалыматтар менен толтурулат. Андан кийин, оюну бар an object жергorктүү сактагычка жайгаштырылат (эгерде оюн али жок болсо) жана маалыматтарды жоготуп албаш үчүн дароо файлга жазылат. Китепканада жазылган оюнду (оюндун аталышы картанын ачкычы, оюну бар an object картанын мааниси) /library Game_name командасынын жардамы менен алынышы мүмкүн. Көрсөтүлгөн оюн боттун китепканасынан табылса, колдонуучуга оюн жөнүндө маалымат ала турган саптык клавиатура кайтарылып берилет. Эгер оюн табылбаса, анда сиз же аталыштын туура жазылганын текшеришиңиз керек (ал Google Play дүкөнүндөгү оюндун аталышына толугу менен дал келиши керек, учурдан тышкары) же ботту жөнөтүү менен оюнду китепканага кошуңуз оюнга шилтеме. Мен ботту герокуга жайгаштырдым жана келечекте өз ботун жазып, аны герокуда бекер жайгаштырууну пландап жаткандар үчүн, сиз кабылышы мүмкүн болгон кыйынчылыктарды чечүү боюнча бир нече сунуштарды берем (анткени мен аларга өзүм туш болгонмун). Тилекке каршы, Heroku табиятынан улам, бот китепканасы ар 24 саатта бир жолу "кайра орнотулат". Менин планым Heroku serverлеринде файлдарды сактоону колдобойт, ошондуктан ал жөн гана менин оюн файлымды Github'дан тартып алат. Бир нече чечимдер бар болчу: маалымат базасын колдонуңуз же бул файлды оюн менен кошо сактай турган башка serverди издеңиз. Мен азыр эч нерсе кылбайм деп чечтим, анткени бот анчалык деле пайдалуу эмес. Бул мага толук тажрыйба алуу үчүн керек болчу, бул мен жетиштим. Ошентип, Heroku үчүн сунуштар:
  1. Эгер сиз Россияда жашасаңыз, VPN аркылуу герокуда катталууга туура келет.

  2. Долбоордун түбүнө сиз Procfile деп аталган кеңейтүүсүз файлды коюшуңуз керек. Анын мазмуну мындай болушу керек: https://github.com/miroha/Telegram-Bot/blob/master/Procfile

  3. pom.xml ичинде, мисалга ылайык, төмөнкү саптарды кошуңуз , мында mainClass тегинде негизги методду камтыган класска жол көрсөтүлөт: bot.BotApplication (эгерде BotApplication классы бот папкасында болсо).

  4. Mvn пакетинин буйруктарын ж.б. колдонуп эч кандай долбоорду курбаңыз, Heroku сиз үчүн баарын чогултат.

  5. Бул долбоорго gitignore кошуу максатка ылайыктуу, мисалы, бул:

    # Log file
    *.log
    
    # Compiled resources
    target
    
    # Tests
    test
    
    # IDEA files
    .idea
    *.iml
  6. Чындыгында долбоорду githubга жүктөп, андан кийин репозиторийди Heroku менен туташтырыңыз (же башка ыкмаларды колдонуңуз, эгер жаңылбасам, алардын 3ү бар).

  7. Жүктөп алуу ийгorктүү болсо ("Ийгorктүү куруу"), Dynos конфигурациясына өтүңүз:

    Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 4

    жана сыдырманы которуңуз, андан кийин анын КҮЙҮК абалында экенин текшериңиз (мен муну жасабагандыктан, менин ботум иштебей калды жана мен бир-эки күн мээмди кысып, көп керексиз кыймылдарды жасадым. ).

  8. Githubда бот белгисин жашырыңыз. Бул үчүн, сиз чөйрө өзгөрмөсүнөн белгини алышыңыз керек:

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

    Анан ботту жайгаштыргандан кийин, бул өзгөрмөнү Орнотуулар өтмөгүндөгү Heroku тактасына орнотуңуз (TOKENдин оң жагында VALUE талаасы болот, боттун белгисин ошол жерге көчүрүңүз):

    Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 5
Бардыгы болуп, 2 айдын ичинде өзүмдүн долбоормдун үстүндө иштеп, мен:
  • Java тorнде жазылган толук иштеп жаткан долбоорду алды;
  • үчүнчү тарап API (Telegram Bot API) менен иштөөнү үйрөнгөн;
  • практикада мен сериялаштырууга тереңирээк кирдим, JSON жана Джексон китепканасы менен көп иштедим (башында мен GSON колдондум, бирок аны менен көйгөйлөр бар);
  • файлдар менен иштөөдө көндүмдөрүм бекемделди, Java NIO менен тааныштым;
  • конфигурация .xml файлдары менен иштөөнү үйрөндүм жана журналга көнүп калдым;
  • Өнүктүрүү чөйрөсүндө жакшыртылган тажрыйба (IDEA);
  • git менен иштөөнү үйрөндү жана gitignore баалуулугун үйрөндү;
  • веб-баракчаларды талдоо боюнча көндүмдөрдү алган (Jsoup library);
  • бир нече дизайн үлгүлөрүн үйрөнгөн жана колдонгон;
  • codeду жакшыртуу сезимин жана каалоосун иштеп чыккан (рефакторинг);
  • Чечимдерди интернеттен тапканды жана жооп таба албаган суроолорду берүүдөн тартынбоону үйрөндүм.
Telegram боту биринчи долбоор катары жана анын жеке тажрыйбанын негизинде кесиптик өсүү үчүн мааниси - 7Мен бот канчалык пайдалуу же пайдасыз болуп чыкканын же codeдун канчалык татынакай/чиркин экенин билбейм, бирок мен алган тажрыйбам сөзсүз түрдө татыктуу болду. Мен өзүмдүн долбоорум үчүн жоопкерчorкти сездим. Анда-санда мен аны өркүндөтүп, жаңы нерсе кошкум келет. Мен аны иштетип, баары мен каалагандай иштеп жатканын көргөндө, бул чыныгы толкундануу болду. Эң негизгиси ушул эмеспи? Жасаган ишиңизден ырахат алыңыз жана акыркы шоколад батинкасы сыяктуу codeдун ар бир жумушчу сабынан ырахат алыңыз. Ошондуктан, эгер сиз программалоону өздөштүрүп жатсаңыз, анда менин кеңешим: бул жерде 40-деңгээлге чейин калбай, өзүңүздүн долбооруңузду мүмкүн болушунча эрте баштаңыз. Эгер кимдир бирөө кызыкдар болсо, долбоордун баштапкы codeу бул жерде (Жаз үчүн кайра жазылган): https://github.com/miroha/GooglePlayGames-TelegramBot Акыркы эки айдан бери мен жаңы материалды дээрлик изилдеп жаткан жокмун, анткени мага окшош көрүнөт. мен туюкка жеттим деп. Жумушсуз, мен мындан ары кайда өнүгүүнү көрө албайм, балким, жазгы алHowтарды окутуудан башка, мен кийинки айда эмнени пландап жатам. Анан мен бул алHowтын жардамы менен ботту "кайра жазууга" аракет кылам. Бардык суроолорго жооп берүүгө даяр. :) Баарыңарга ийгorк! 07/07/2020 ЖАҢЫРТУУ. Таза Javaдагы бот менен репозиторий жоголду (мен аны жок кылдым, көчүрмөсү башка жергorктүү машинада калды), бирок мен Spring Boot үчүн кайра жазылган ботту жүктөп алдым: https://github.com/miroha /GooglePlayGames-TelegramBot
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION