CodeGym/Java Blog/यादृच्छिक/जावामध्ये टेलीग्राम बॉट तयार करणे: गर्भधारणेपासून उपयोजना...
John Squirrels
पातळी 41
San Francisco

जावामध्ये टेलीग्राम बॉट तयार करणे: गर्भधारणेपासून उपयोजनापर्यंत

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
सदस्य
मग सांगकामे काय आहेत? आपण याबद्दल अधिक येथे वाचू शकता . सुरू करण्यासाठी, तुम्हाला टेलीग्राम बॉट्स (यापुढे "API") विकसित करण्यासाठी वापरल्या जाणार्‍या लायब्ररीच्या अधिकृत दस्तऐवजांचे पुनरावलोकन करणे आवश्यक आहे. ते येथे आढळू शकते .
जावामध्ये टेलीग्राम बॉट तयार करणे: गर्भधारणेपासून उपयोजनापर्यंत - 1
तेथे सर्व काही अतिशय सुलभ आणि स्पष्ट आहे. असे दिसते की आम्ही फक्त कोड लिहू शकतो आणि आनंद करू शकतो! पण ते इतके सोपे नाही. शोधण्यात बराच वेळ घालवल्यानंतर, मला बॉट डेव्हलपमेंटवरील ज्ञानाच्या टिप्स सापडल्या आहेत, उदाहरणार्थ, कीबोर्ड कसा बनवायचा, एक हाताळणीCallbackQuery, आणि पुढे. परंतु, मला Java बॉट डेव्हलपमेंटसाठी संपूर्ण, संपूर्ण मार्गदर्शक सापडला नाही. त्यामुळे मला हा लेख लिहिण्यास प्रवृत्त केले. अशा अनेक वेबसाइट्स आहेत जिथे तुम्ही तुमचा स्वतःचा सहज उपयोज्य बॉट तयार करू शकता. परंतु वस्तुस्थिती अशी आहे की तयार केलेले बहुतेक बॉट्स संदर्भ माहिती आणि यासारखे प्रदान करतात. आमचा बॉट हा एक पूर्ण वेब ऍप्लिकेशन आहे. तुम्ही डेटाबेस बांधू शकता, विविध API विनंत्या कार्यान्वित करू शकता, वेबसाइट पार्स करू शकता, जटिल गणना करू शकता आणि बरेच काही करू शकता. शक्यता केवळ आपल्या कल्पनेद्वारे मर्यादित आहेत. मला आशा आहे की मी काय लिहणार आहे हे स्पष्ट करण्यात वरील गोष्टींनी मदत केली आहे. टेलिग्रामवर बॉटची नोंदणी करणे खूप सोपे आहे. या प्रक्रियेचे वरील लिंक केलेल्या दस्तऐवजीकरणात तपशीलवार वर्णन केले आहे. आमच्या अर्जासाठी, तुम्हाला फक्त बॉटचे नाव आणि बॉटची नोंदणी करताना तुम्हाला मिळणारे टोकन माहित असणे आवश्यक आहे. मुळात, बॉट हा फक्त कन्सोल-आधारित वेब अनुप्रयोग आहे. कोणतेही फ्रंट एंड नाही, फक्त शुद्ध कमांड प्रोसेसिंग. आपण मास्टर करू इच्छित असल्यासहायबरनेट करा किंवा JSON कसे पार्स करायचे ते शिका , मग हा तुमच्यासाठी प्रकल्प आहे. (तुम्ही Maven वापरत आहात असे मी गृहीत धरतो) वर अवलंबित्व जोडून सुरुवात करू pom.xml. तुम्ही हे असे करू शकता:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
मग Botवर्ग तयार करा जो TelegramLongPollingBotवर्गाचा वारसा घेतो आणि त्याच्या पद्धती अधिलिखित करा:
public class Bot extends TelegramLongPollingBot {

    /**
     * Method for receiving messages.
     * @param update Contains a message from the user.
     */
    @Override
    public void onUpdateReceived(Update update) {
    String message = update.getMessage().getText();
    sendMsg(update.getMessage().getChatId().toString(), message);
    }

    /**
     * Method for creating a message and sending it.
     * @param chatId chat id
     * @param s The String that you want to send as a message.
     */
    public synchronized void sendMsg(String chatId, String s) {
        SendMessage sendMessage = new SendMessage();
        sendMessage.enableMarkdown(true);
        sendMessage.setChatId(chatId);
        sendMessage.setText(s);
        try {
            sendMessage(sendMessage);
        } catch (TelegramApiException e) {
            log.log(Level.SEVERE, "Exception: ", e.toString());
        }
    }

    /**
     * This method returns the bot's name, which was specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        return "BotName";
    }

    /**
     * This method returns the bot's token for communicating with the Telegram server
     * @return the bot's token
     */
    @Override
    public String getBotToken() {
        return "BotToken";
    }
}
mainआणि आता पद्धतीची सामग्रीः
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
getBotUsername()आणि पद्धती भरल्यानंतर getBotToken(), बॉट सुरू करा. आत्तासाठी, आम्ही त्याला पाठवलेले कोणतेही संदेश ते फक्त आमच्याकडे पुनर्निर्देशित करते, जसे की " आरशा " सारखे. हे असे कार्य करते: जेव्हा तुम्ही अॅप्लिकेशन सुरू करता, तेव्हा ते टेलीग्राम सर्व्हरला, दर n सेकंदांनी एकदा, खालील URL वर विनंत्या पाठवण्यास सुरुवात करते: https://api.telegram.org/BotToken/getMe , जिथे BotToken हे तुमच्या बॉटचे टोकन आहे . प्रतिसादात, त्याला सर्व संदेश असलेले JSON प्राप्त होते. यातील प्रत्येक संदेशावर लायब्ररीद्वारे प्रक्रिया केली जाते आणि ती OnUpdateReceived(Update update)पद्धत म्हणून पाठविली जातेUpdateवस्तू आणि त्यासोबतच आम्ही काम करतो. येथे टेलीग्राम बॉट्सचे सौंदर्य आहे: ते कोणत्याही संगणकावर चालवू शकतात, त्याची चाचणी करण्यासाठी फक्त अनुप्रयोग सुरू करणे आवश्यक आहे आणि प्रत्येक बदलानंतर तुम्हाला ते होस्टवर तैनात करण्याची आवश्यकता नाही. हे खूप सोयीचे आहे. अर्थात, तुम्ही वेबहुक वापरून काम करण्यासाठी बॉट कॉन्फिगर करू शकता. त्यासाठी तुम्ही इंटरनेटवर दिशानिर्देश शोधू शकता. साधेपणासाठी, आम्ही LongPolling वापरू. संदेशांवर प्रक्रिया कशी केली जाते आणि तुम्ही प्रतिसादात काय पाठवता हे केवळ भाषा आणि लायब्ररीच्या क्षमतेद्वारे मर्यादित आहे. बाकी सर्व काही तुमच्यावर अवलंबून आहे. तुम्ही एक बॉट बनवू शकता जो तुमच्यासाठी YouTube व्हिडिओ शोधेल. तुम्ही एक बॉट बनवू शकता जो तुम्हाला दररोज जे पाठवता ते तुम्हाला पाठवेल, जसे की एक वर्षापूर्वीच्या टाइम कॅप्सूल. किंवा तुम्ही CRM सिस्टीममध्ये समाकलित होणे आणि छोट्या व्यवसायांसाठी बॉट्स बनवणे शिकू शकता—तुम्ही केवळ तुमच्या कल्पनेने मर्यादित आहात. पुढे. ज्यांनी बॉट्स वापरले आहेत त्यांना माहित आहे की " " वर्णाने सुरू होणार्‍या कमांडचा वापर करून त्यांच्याशी संवाद साधणे सोयीचे आहे /, उदाहरणार्थ, /start. परंतु एक अधिक सोयीस्कर मार्ग आहे: बटणे. दोन प्रकारची बटणे आहेत: इनपुट फील्डखाली दिसणारी ( ReplyKeyboardMarkup) आणि बटणे जी त्यांना जोडलेल्या संदेशाच्या थेट खाली आहेत (InlineKeyboardMarkup). दस्तऐवजीकरणातील त्यांच्या वर्णनावरून तुम्ही त्यांची मूलभूत माहिती मिळवू शकता.

रिप्लायकीबोर्डमार्कअप

प्रत्यक्षात, हे बटण अॅरेचे अॅरे आहे: List<KeyboardRow <KeyboardButton>>. येथे नमुना कोड आहे जो कीबोर्ड तयार करतो:
public synchronized void setButtons(SendMessage sendMessage) {
        // Create a keyboard
        ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
        sendMessage.setReplyMarkup(replyKeyboardMarkup);
        replyKeyboardMarkup.setSelective(true);
        replyKeyboardMarkup.setResizeKeyboard(true);
        replyKeyboardMarkup.setOneTimeKeyboard(false);

        // Create a list of keyboard rows
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First keyboard row
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first keyboard row
        keyboardFirstRow.add(new KeyboardButton("Hi"));

        // Second keyboard row
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add the buttons to the second keyboard row
        keyboardSecondRow.add(new KeyboardButton("Help");

        // Add all of the keyboard rows to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and assign this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
sendMsg()मेसेज पास केल्यावर आम्ही या पद्धतीला मेथड म्हणतो . अशा प्रकारे आम्ही त्या संदेशासाठी कीबोर्ड सेट करतो. जेव्हा आम्ही वापरकर्त्याला हा संदेश पाठवतो, तेव्हा त्याला आमच्या संदेशाचा मजकूर आणि "हाय" आणि "मदत" म्हणणारी 2 बटणे एकमेकांच्या खाली दिसेल. जेव्हा यापैकी एक बटण क्लिक केले जाते, तेव्हा बॉटला बटण मजकूर असलेला संदेश पाठविला जातो. म्हणून, क्लायंटने "मदत" वर क्लिक केल्यास , बॉटला "मदत" सह संदेश प्राप्त होईल. बॉटला, असे दिसते की क्लायंटने स्वतः "मदत" लिहिले आणि बॉटला मजकूर पाठवला. आणि मग तुम्ही संदेशांवर प्रक्रिया करता.

इनलाइन कीबोर्डमार्कअप

हे देखील अॅरेचे अॅरे आहे. हे मागील मार्कअप सारखेच आहे, परंतु तर्कशास्त्र येथे थोडे वेगळे कार्य करते. या प्रकारचा कीबोर्ड विशिष्ट संदेशाशी जोडलेला असतो आणि केवळ त्यासाठीच अस्तित्वात असतो. इनलाइन कीबोर्ड सेट करण्यासाठी येथे एक पद्धत आहे:
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText("Button").setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
Listमध्ये एक तयार करा Listआणि पहिल्या पंक्तीमध्ये इनलाइन बटण जोडा. या बटणामध्ये URL, चॅनेलची लिंक किंवा CallbackQuery, ज्याबद्दल मी थोड्या वेळाने लिहीन. येथे आम्ही आमच्या बटणाचा मजकूर सेट करतो, जो वापरकर्त्याला दिसेल आणि नंतर आम्ही बॉटला पाठवला जाणारा डेटा सेट करतो. आमच्या उदाहरणात, वापरकर्ता "हाय" पाहतो आणि जेव्हा बटण दाबले जाते तेव्हा 17 क्रमांक बॉटला पाठविला जाईल. हे आमचे आहे CallbackQuery. संबंधित काही शब्द CallbackQuery. ऑब्जेक्टवरून हा डेटा प्राप्त करण्यासाठी Update, आपल्याला कार्यान्वित करणे आवश्यक आहे update.getCallbackQuery(). ही पद्धत a परत करते CallbackQuery, ज्यामधून तुम्ही बॉटला पाठवलेला डेटा ऍक्सेस करू शकता. पद्धतीद्वारे हा डेटा मिळवण्याचा प्रयत्न करू नका update.getMessage().getText()—तुम्हाला एक मिळेल NullPointerException.
@Override
    public void onUpdateReceived(Update update) {
        if(update.hasMessage()) {
            ThreadClass thread = new ThreadClass(update.getMessage());
        } else  if(update.hasCallbackQuery()) {
            AnswerCallbackThread answerThread = new AnswerCallbackThread(update.getCallbackQuery());
        }
    }
संदेश असल्यास, आम्ही प्रक्रियेसाठी नवीन थ्रेडवर पाठवतो; तेथे असल्यास CallbackQuery, आम्ही प्रक्रियेसाठी योग्य थ्रेडवर पाठवू. आपण एक प्रतिसाद पाठवू शकता CallbackQuery. टेलीग्राममधील प्रत्येक वस्तूचा स्वतःचा आयडी असतो. एखाद्या विशिष्ट ला प्रतिसाद पाठवण्यासाठी CallbackQuery, तुम्हाला फक्त त्याची आयडी माहित असणे आवश्यक आहे, जी आम्हाला संबंधित ऑब्जेक्टवरून मिळते. प्रतिसाद पाठवण्यासाठी, आम्ही या पद्धतीला कॉल करतो:
public synchronized void answerCallbackQuery(String callbackId, String message) {
        AnswerCallbackQuery answer = new AnswerCallbackQuery();
        answer.setCallbackQueryId(callbackId);
        answer.setText(message);
        answer.setShowAlert(true);
        try {
            answerCallbackQuery(answer);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
महत्त्वाचे:प्रतिसादातील मजकूर CallbackQuery200 वर्णांपेक्षा जास्त नसावा! असा प्रतिसाद पाठवल्यानंतर, क्लायंटला संदेश असलेली एक पॉप-अप विंडो दिसेल. ही विंडो दिसल्यानंतर काही सेकंदात अदृश्य होऊ शकते किंवा वापरकर्त्याने ओके दाबेपर्यंत ती कायम राहू शकते. मोड स्विच करण्यासाठी, आम्ही answer.setShowAlert(true)पद्धत कॉल करतो. जर तुम्ही trueपद्धत पास केली, तर ओके दाबेपर्यंत विंडो कायम राहते. आपण खोटे पास केल्यास, नंतर ते 5 सेकंदांनंतर अदृश्य होते. ही सर्व टेलीग्राम बॉट लायब्ररीची मूलभूत वैशिष्ट्ये आहेत. तुम्हाला हवे असल्यास, तुम्ही मल्टीमीडिया, भौगोलिक स्थान इ. कसे पाठवायचे यासारख्या गोष्टी शिकू शकता. चला आमच्या बॉटला होस्टिंग प्लॅटफॉर्मवर तैनात करूया. माझ्या प्रकल्पासाठी, मी Heroku निवडले. मला वाटते की हे स्वतःचे CLI सह एक सोयीस्कर होस्टिंग प्लॅटफॉर्म आहे. हे विनामूल्य आहे, परंतु या योजनेवर कोणत्याही विनंत्या न मिळाल्यानंतर तुमचा बॉट 30 मिनिटांनंतर हायबरनेट होईल. विनंती प्राप्त झाल्यावर ते जागे होईल. हे इतक्या लवकर घडते, तुमच्या लक्षातही येणार नाही (जोपर्यंत, अर्थातच, डेटाबेस कनेक्शन रीस्टार्ट होत नाही). मोफत योजना 5MB डेटाबेस, 100MB डिस्क स्पेस, दरमहा 2TB डेटा आणि 1 डायनोद्वारे मर्यादित आहे. डायनो हा तुमचा रनिंग अॅप्लिकेशन आहे. मी ताबडतोब म्हणेन की तैनातीमुळे मला अडचणी आल्या, कारण मी यापूर्वी कधीही माझे अर्ज तैनात केले नव्हते. उपयोजनादरम्यान, Heroku ला Procfile नावाची फाईल (विस्तार न करता) आवश्यक आहे. आम्ही ते प्रोजेक्ट रूटमध्ये तयार करतो. आत, आम्ही लिहितो worker: sh target/bin/workerBot, जिथे workerBot मध्ये निर्दिष्ट केलेले नाव आहे pom.xml. ए स्क्रिप्ट, मॅवेन ऍप्लिकेशन असेंबलर प्लगइन (appassembler-maven-plugin) द्वारे व्युत्पन्न केली जाईल. संकलित जार फाइल कशी लाँच करायची याचे वर्णन स्क्रिप्टमध्ये आहे. लाँच करण्‍यासाठी वर्गाचे नाव <mainClass>आणि दरम्यान निर्दिष्ट केले आहे </mainClass>, तर स्क्रिप्टचे नाव <name>आणि </name>दरम्यान दिले pom.xmlआहे
...
<build>
    <plugins>
        ...
       <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>1.1.1</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>com.home.server.TelegramBot</mainClass>
                        <name>workerBot</name>
                    </program>
                </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
ही प्रक्रिया सुरू करण्यापूर्वी, तुम्ही Heroku वर नोंदणी करावी , आणि Git आणि Heroku CLI दोन्ही स्थापित करावे . तुमच्या अॅप्लिकेशनला डेटाबेसची आवश्यकता असल्यास, तुम्ही नवीन अॅप्लिकेशन तयार करता तेव्हा आवश्यक डेटाबेस जोडण्यास विसरू नका. पुढे, तुम्हाला तुमच्या डेटाबेससाठी होस्ट, वापरकर्तानाव, पासवर्ड आणि पोर्ट निश्चित करणे आवश्यक आहे आणि नंतर ते तुमच्या अनुप्रयोगात सूचित करा. पुढे, उपयोजित करण्यापूर्वी, Maven वापरून तुमचा प्रकल्प तयार करा .
mvn clean install
प्रथम, आम्ही आमच्या प्रोजेक्ट डिरेक्ट्रीवर जातो आणि कमांडसह रेपॉजिटरी सुरू करतो git init. मग आम्ही आमचा प्रकल्प या भांडारात जोडतो.
git add .
मग आम्ही बदल करू
git commit -m "First commit in the project"
पुढे, तुम्हाला heroku मध्ये साइन इन करणे आवश्यक आहे. कमांड लाइनवर खालील लिहा
heroku login
नोंदणी दरम्यान तुम्ही तयार केलेली क्रेडेन्शियल्स एंटर करा. त्यानंतर, heroku वर तुमच्या भांडाराची URL निश्चित करा. तुम्ही हे सेटिंग्जमध्ये करा. मग आम्ही लिहितो
git remote add heroku [url]
तुमच्या भांडारासाठी रिमोट हिरोकू रेपॉजिटरी जोडली आहे. पुढे आपण लिहितो
git push heroku master
मग आपण प्रतीक्षा करा... जर ऍप्लिकेशन यशस्वीरित्या तैनात झाले, तर खालील कमांड कार्यान्वित करा
heroku ps:scale worker=1
आणि तेच, तुमचा अर्ज चालू आहे. तसे नसल्यास, लॉग काळजीपूर्वक पहा. बहुधा, तुमच्या अर्जातील त्रुटीमुळे तो अयशस्वी झाला आहे. इतका मोठा लेख वाचल्याबद्दल धन्यवाद. मला आशा आहे की कोणालातरी ते उपयुक्त वाटेल आणि विकासादरम्यान ज्या क्षेत्रांनी मला त्रास दिला त्या क्षेत्रात तुमचा बराच वेळ वाचेल.
टिप्पण्या
  • लोकप्रिय
  • नवीन
  • जुने
टिप्पणी करण्यासाठी तुम्ही साईन इन केलेले असणे आवश्यक आहे
या पानावर अजून कोणत्याही टिप्पण्या नाहीत