CodeGym/Java Blog/अनियमित/जावा में टेलीग्राम बॉट बनाना: गर्भाधान से लेकर तैनाती तक
John Squirrels
स्तर 41
San Francisco

जावा में टेलीग्राम बॉट बनाना: गर्भाधान से लेकर तैनाती तक

अनियमित ग्रुप में प्रकाशित
सदस्य
तो बॉट्स क्या हैं? आप इसके बारे में यहाँ और अधिक पढ़ सकते हैं । शुरू करने के लिए, आपको टेलीग्राम बॉट्स (इसके बाद "एपीआई") विकसित करने के लिए उपयोग की जाने वाली लाइब्रेरी के लिए आधिकारिक दस्तावेज़ीकरण की समीक्षा करने की आवश्यकता है। यह यहां पाया जा सकता है ।
जावा में टेलीग्राम बॉट बनाना: गर्भाधान से लेकर तैनाती तक - 1
वहां सब कुछ बहुत ही सुलभ और स्पष्ट है। ऐसा लगता है कि हम सिर्फ कोड लिख सकते हैं और आनन्दित हो सकते हैं! लेकिन यह इतना आसान नहीं है. खोज करने में बहुत समय बिताने के बाद, मुझे बॉट के विकास पर ज्ञान के छोटे-छोटे अंश मिले हैं, उदाहरण के लिए, कीबोर्ड कैसे बनाएं, कैसे संभालेंCallbackQuery, इत्यादि। लेकिन, मुझे Java bot विकास के लिए पूर्ण, संपूर्ण मार्गदर्शिका नहीं मिली। इसने मुझे यह लेख लिखने के लिए प्रेरित किया। ऐसी बहुत सी वेबसाइटें हैं जहां आप अपना खुद का आसानी से परिनियोजन योग्य बॉट बना सकते हैं। लेकिन तथ्य यह है कि बनाए गए अधिकांश बॉट्स संदर्भ जानकारी और पसंद प्रदान करते हैं। हमारा बॉट एक संपूर्ण वेब एप्लिकेशन है। आप एक डेटाबेस को बाइंड कर सकते हैं, विभिन्न एपीआई अनुरोधों को निष्पादित कर सकते हैं, वेबसाइटों को पार्स कर सकते हैं, जटिल गणनाएँ कर सकते हैं, और बहुत कुछ कर सकते हैं। केवल आपकी कल्पना द्वारा संभावनाएं सीमित हैं। मुझे उम्मीद है कि उपरोक्त ने स्पष्ट करने में मदद की है कि मैं किस बारे में लिखने जा रहा हूं। टेलीग्राम पर बॉट को पंजीकृत करना बहुत आसान है। इस प्रक्रिया को ऊपर से जुड़े दस्तावेज़ों में विस्तार से वर्णित किया गया है। हमारे आवेदन के लिए, आपको केवल बॉट का नाम और बॉट को पंजीकृत करते समय प्राप्त होने वाले टोकन को जानना होगा। मूल रूप से, एक बॉट केवल एक कंसोल-आधारित वेब एप्लिकेशन है। कोई फ्रंट एंड नहीं है, केवल शुद्ध कमांड प्रोसेसिंग है। यदि आप मास्टर करना चाहते हैंहाइबरनेट करें या JSON को पार्स करना सीखें , तो यह आपके लिए प्रोजेक्ट है। आइए एक निर्भरता जोड़कर शुरू करें 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के अंदर a बनाएँ List, और पहली पंक्ति में इनलाइन बटन जोड़ें। इस बटन में एक URL, एक चैनल का लिंक, या एक हो सकता है CallbackQuery, जिसके बारे में मैं थोड़ी देर बाद लिखूंगा। यह वह जगह है जहां हम अपने बटन का पाठ सेट करते हैं, जो उपयोगकर्ता को दिखाई देगा, और फिर हम वह डेटा सेट करते हैं जो बॉट को भेजा जाएगा। हमारे उदाहरण में, उपयोगकर्ता "हाय" देखता है, और जब बटन दबाया जाता है तो 17 नंबर बॉट को भेजा जाएगा। यह हमारा है CallbackQuery। के बारे में कुछ शब्द CallbackQuery। इस डेटा को Updateऑब्जेक्ट से प्राप्त करने के लिए, आपको निष्पादित करने की आवश्यकता है update.getCallbackQuery()। यह विधि एक लौटाती है 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 सेकंड के बाद गायब हो जाता है। ये सभी टेलीग्राम बॉट लाइब्रेरी की मूलभूत विशेषताएं हैं। यदि आप चाहें, तो आप मल्टीमीडिया, जियोलोकेशन इत्यादि जैसी चीजें सीख सकते हैं। चलिए अपने बॉट को एक होस्टिंग प्लेटफॉर्म पर तैनात करने के लिए आगे बढ़ते हैं। अपने प्रोजेक्ट के लिए, मैंने हरोकू को चुना. मुझे लगता है कि यह अपने स्वयं के सीएलआई के साथ एक सुविधाजनक होस्टिंग प्लेटफॉर्म है। यह मुफ़्त है, लेकिन इस योजना पर कोई अनुरोध प्राप्त न होने के 30 मिनट बाद आपका बॉट हाइबरनेट हो जाएगा। अनुरोध प्राप्त होने पर यह जाग जाएगा। यह इतनी जल्दी होता है, आप नोटिस भी नहीं करेंगे (जब तक, निश्चित रूप से, डेटाबेस कनेक्शन पुनरारंभ नहीं होता है)। मुफ्त योजना 5MB डेटाबेस, 100MB डिस्क स्थान, प्रति माह 2TB डेटा और 1 डायनो द्वारा सीमित है। एक डायनो आपका चल रहा एप्लिकेशन है। मैं तुरंत कहूंगा कि यह परिनियोजन था जिसने मुझे कठिनाइयों का कारण बना दिया, क्योंकि मैंने पहले कभी अपने आवेदनों को तैनात नहीं किया था। परिनियोजन के दौरान, Heroku को Procfile (विस्तार के बिना) नाम की एक फ़ाइल की आवश्यकता होती है। हम इसे प्रोजेक्ट रूट में बनाते हैं। अंदर, हम लिखते हैं worker: sh target/bin/workerBot, जहां वर्करबॉट में निर्दिष्ट नाम है pom.xml। एक मावेन एप्लिकेशन असेंबलर प्लगइन (एपसेम्बलर-मावेन-प्लगइन) द्वारा उत्पन्न स्क्रिप्ट लॉन्च होगी। स्क्रिप्ट बताती है कि संकलित जार फ़ाइल को कैसे लॉन्च किया जाए। लॉन्च करने के लिए कक्षा का नाम <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>
इस प्रक्रिया को शुरू करने से पहले, आपको हेरोकू पर पंजीकरण करना चाहिए , और गिट और हेरोकू सीएलआई दोनों को स्थापित करना चाहिए । यदि आपके एप्लिकेशन को डेटाबेस की आवश्यकता है, तो नया एप्लिकेशन बनाते समय आवश्यक डेटाबेस जोड़ना न भूलें। इसके अलावा, आपको अपने डेटाबेस के लिए होस्ट, उपयोगकर्ता नाम, पासवर्ड और पोर्ट निर्धारित करने की आवश्यकता है, और फिर उन्हें अपने आवेदन में इंगित करें। अगला, परिनियोजित करने से पहले, मावेन का उपयोग करके अपना प्रोजेक्ट बनाएं ।
mvn clean install
सबसे पहले, हम अपनी प्रोजेक्ट डायरेक्टरी में जाते हैं और कमांड के साथ रिपॉजिटरी को इनिशियलाइज़ करते हैं git init। फिर हम अपने प्रोजेक्ट को इस रिपॉजिटरी में जोड़ते हैं।
git add .
फिर हम बदलाव करते हैं
git commit -m "First commit in the project"
इसके बाद, आपको हरोकू में साइन इन करना होगा। कमांड लाइन पर निम्नलिखित लिखें
heroku login
पंजीकरण के दौरान आपके द्वारा बनाए गए क्रेडेंशियल दर्ज करें। उसके बाद, अपने रिपॉजिटरी के URL को उसकेोकू पर निर्धारित करें। आप इसे सेटिंग में करें। फिर हम लिखते हैं
git remote add heroku [url]
आपके रिपॉजिटरी के लिए एक दूरस्थ हेरोकू रिपॉजिटरी जोड़ा गया है। आगे हम लिखते हैं
git push heroku master
फिर हम प्रतीक्षा करते हैं ... यदि एप्लिकेशन सफलतापूर्वक तैनात होता है, तो निम्न कमांड निष्पादित करें
heroku ps:scale worker=1
और बस इतना ही, आपका आवेदन तैयार है और चल रहा है। यदि ऐसा नहीं है, तो लॉग को ध्यान से देखें। सबसे अधिक संभावना है, आपके आवेदन में किसी त्रुटि के कारण यह विफल हो गया है। इतना लंबा लेख पढ़ने के लिए धन्यवाद। मुझे उम्मीद है कि किसी को यह उपयोगी लगेगा और यह उन क्षेत्रों में आपका बहुत समय बचाएगा, जिन्होंने विकास के दौरान मुझे परेशानी दी थी।
टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं