JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ هڪ ٽيليگرام بوٽ ٺاهڻ: خيال کان ڊپلائيمينٽ تائين
John Watson
سطح

جاوا ۾ هڪ ٽيليگرام بوٽ ٺاهڻ: خيال کان ڊپلائيمينٽ تائين

گروپ ۾ شايع ٿيل
بهرحال بوٽس ڇا آهن؟ توھان ھن بابت تفصيل سان پڙھي سگھوٿا هتي . پهرين، توهان کي پڙهڻ جي ضرورت آهي سرڪاري دستاويز لائبريري لاءِ ٽيليگرام تي بوٽس ٺاهڻ لاءِ (هتي ان کي API طور حوالو ڏنو ويو آهي). هوءَ هتي بيٺي آهي . جاوا ۾ ٽيليگرام بوٽ ٺاهيندي: خيال کان ڊپلائيمينٽ تائين - 1اتي هر شيء بلڪل قابل ۽ سمجھڻ لائق آهي. لڳي ٿو ته لکو ۽ خوش ٿيو! پر اهو ايترو سادو ناهي. سرچ انجڻ ۾ گھڻو وقت گذارڻ کان پوءِ، مون کي بوٽ ڊولپمينٽ بابت ڄاڻ جا ٽڪڙا مليا، مثال طور، ڪيبورڊ ڪيئن ٺاھيو، CallbackQuery تي عمل ڪيو، ۽ ان جھڙو. مون کي جاوا ۾ بوٽس ٺاهڻ لاءِ مڪمل ۽ جامع گائيڊ ڪڏهن به نه مليو آهي. هن مون کي هن مضمون لکڻ لاء زور ڏنو. انٽرنيٽ تي ڪيتريون ئي سائيٽون آهن جتي توهان ٺاهي سگهو ٿا پنهنجو بوٽ ٺاهي هڪ تيار ڪيل ترتيب سان. پر ڳالهه اها آهي. ته گهڻو ڪري، بوٽ ٺاهيا ويا آهن جيڪي مهيا ڪري سگھن ٿيون پس منظر جي معلومات وغيره وغيره. اسان جو بوٽ هڪ مڪمل ويب ايپليڪيشن آهي جنهن سان توهان هڪ ڊيٽابيس کي پابند ڪري سگهو ٿا، مختلف APIs ڏانهن درخواستون ڪري سگهو ٿا، سائيٽن کي پارس ڪري سگهو ٿا، پيچيده حساب ڪتاب، وغيره. معاملو صرف توهان جي تخيل تائين محدود آهي. مون کي اميد آهي ته انهن سٽن ۾ مون توهان کي ٿورو وضاحت ڪري ڇڏيو آهي ته مان ڇا لکڻ وارو آهيان. ٽيليگرام ۾ هڪ بوٽ رجسٽر ڪرڻ تمام سادو آهي؛ اهو عمل تفصيل سان بيان ڪيو ويو آهي دستاويزن ۾ مٿي ڏنل لنڪ تي. اسان جي ايپليڪيشن لاءِ توهان کي صرف بوٽ جو نالو ۽ ٽوڪن ڄاڻڻ جي ضرورت آهي جيڪا توهان کي رجسٽريشن تي ملندي. لازمي طور تي، هڪ بوٽ صرف هڪ ڪنسول ويب ايپليڪيشن آهي. ڪوبه فرنٽ اينڊ، خالص ڪمانڊ پروسيسنگ. جيڪڏھن توھان چاھيو ٿا ھائبرنيٽ کي چڱيءَ طرح ماسٽر ڪرڻ يا سکو ته JSON کي ڪيئن پارس ڪجي، ته پوءِ ھي پروجيڪٽ توھان لاءِ آھي. اچو ته pom.xml ۾ انحصار شامل ڪندي شروع ڪريو (اسان فرض ڪريون ٿا ته توهان Maven استعمال ڪري رهيا آهيو). توهان هن طرح ڪري سگهو ٿا:
<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 setting up a message and sending it.
     * @param chatId chat id
     * @param s The string 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());
        }
    }

    /**
     * The method returns the name of the bot specified during registration.
     * @return bot name
     */
    @Override
    public String getBotUsername() {
        returnBotName;
    }

    /**
     * The method returns the bot's token to communicate with the Telegram server
     * @return token for the bot
     */
    @Override
    public String getBotToken() {
        returnBotToken;
    }
}
خير، طريقي جي مواد main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
        try {
            telegramBotsApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
ان کي طريقن ۾ داخل ڪرڻ سان getBotUsername()، getBotToken()اسان بوٽ لانچ ڪريون ٿا. في الحال، هو صرف اسان ڏانهن موڪلي ٿو ڪنهن به پيغام کي جيڪو اسان هن ڏانهن موڪليو، هڪ قسم جو "عڪس". اهو سڀ ڪجهه هن ريت ڪم ڪري ٿو: جڏهن توهان ايپليڪيشن لانچ ڪريو ٿا، اهو هيٺ ڏنل URL تي هر n سيڪنڊن ۾ هڪ ڀيرو ٽيليگرام سرور ڏانهن GET درخواست موڪلڻ شروع ڪري ٿو: https://api.telegram.org/BotToken/getMe، جتي BotToken آهي توهان جي بوٽن جو نشان، هڪ JSON جواب ۾ وصول ڪيو جنهن ۾ سڀني پيغامن تي مشتمل آهي. هر اهڙو پيغام لائبريري طرفان پروسيس ڪيو ويندو آهي ۽ طريقي سان OnUpdateReceived(Update update)هڪ اعتراض جي طور تي اچي ٿو Update. اهو آهي جيڪو اسان سان ڪم ڪري رهيا آهيون. هي آهي ٽيليگرام بوٽس جي خوبصورتي، اهي ڪنهن به ڪمپيوٽر تي ڪم ڪري سگهن ٿا، ٽيسٽ لاءِ توهان کي صرف ايپليڪيشن لانچ ڪرڻ جي ضرورت آهي، توهان کي هر تبديلي کان پوءِ ان کي ميزباني تي لڳائڻ جي ضرورت ناهي. اهو تمام آرامده آهي. يقينا، بوٽ کي ويب هڪ استعمال ڪندي ڪم ڪرڻ لاءِ ترتيب ڏئي سگهجي ٿو؛ دستياب انٽرنيٽ تي ملي سگهي ٿو؛ سادگي لاءِ، اسان لانگ پولنگ استعمال ڪندي ڪم ڪنداسين. پيغامن کي ڪيئن پروسيس ڪيو وڃي ۽ جواب ۾ ڇا موڪليو وڃي صرف ٻوليءَ جي اوزارن ۽ لائبريري تائين محدود آهي، باقي سڀ ڪجهه توهان جي صوابديد تي آهي. توهان هڪ بوٽ ٺاهي سگهو ٿا جيڪو توهان جي لاءِ يوٽيوب تي وڊيوز ڳوليندو، توهان هڪ بوٽ ٺاهي سگهو ٿا جيڪو هر روز توهان کي موڪليندو جيڪو توهان پاڻ ڏانهن موڪليو، مثال طور، هڪ سال ۾، هڪ قسم جو ٽائيم ڪيپسول. يا توهان سکي سگهو ٿا CRM سسٽم ۾ ڪيئن ضم ٿيڻ ۽ ننڍن ڪاروبار لاءِ بوٽ ٺاهڻ، هر شي توهان جي تخيل تائين محدود آهي. اڳتي وڃو. جن بٽس استعمال ڪيا آھن اھي ڄاڻن ٿا ته انھن سان رابطو ڪرڻ آسان آھي انھن کي استعمال ڪندي ڪمانڊ استعمال ڪندي جيڪي نشاني سان شروع ٿين ٿا «/»، مثال طور /start. پر اتي هڪ وڌيڪ آسان طريقو آهي - بٽڻ. بٽڻن جا ٻه قسم آهن: اهي جيڪي ان پٽ فيلڊ جي هيٺان ظاهر ٿيندا آهن، ReplyKeyboardMarkup۽ اهي بٽڻ جيڪي سڌو سنئون پيغام جي هيٺان ظاهر ٿيندا آهن انهن سان ڳنڍيل آهن InlineKeyboardMarkup. دستاويز ۾ توهان مختصر طور تي انهن جي وضاحت سان پاڻ کي واقف ڪري سگهو ٿا. ReplyKeyboard Markup. بنيادي طور تي هي بٽڻ جي صفن جو هڪ صف آهي، 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 strings
        List<KeyboardRow> keyboard = new ArrayList<>();

        // First line of the keyboard
        KeyboardRow keyboardFirstRow = new KeyboardRow();
        // Add buttons to the first line of the keyboard
        keyboardFirstRow.add(new KeyboardButton(“Привет”));

        // Second line of the keyboard
        KeyboardRow keyboardSecondRow = new KeyboardRow();
        // Add buttons to the second line of the keyboard
        keyboardSecondRow.add(new KeyboardButton(“Помощь”);

        // Add all keyboard strings to the list
        keyboard.add(keyboardFirstRow);
        keyboard.add(keyboardSecondRow);
        // and set this list to our keyboard
        replyKeyboardMarkup.setKeyboard(keyboard);
    }
هڪ طريقي ۾ sendMsg()، اسان هن طريقي کي سڏين ٿا ان کي پيغام موڪلڻ سان، اهڙيء طرح ان پيغام لاء ڪيبورڊ سيٽنگ. جڏهن اسان هي ميسيج استعمال ڪندڙ کي موڪليندا آهيون ته هو پيغام جو متن ڏسندو جيڪو اسان سيٽ ڪيو آهي، انهي سان گڏ 2 بٽڻ جيڪي چوندا آهن هيلو ۽ مدد، هڪ ٻئي جي اڳيان. انهن بٽڻن تي ڪلڪ ڪرڻ سان، بوٽ ڏانهن هڪ پيغام موڪليو ويندو، جنهن جو متن اهو آهي جيڪو بٽڻ تي لکيل آهي. اهو آهي، جيڪڏهن ڪلائنٽ "مدد" تي ڪلڪ ڪري ٿو، بوٽ کي "مدد" متن سان هڪ پيغام ملندو. هن لاء، اهو آهي ته ڪلائنٽ پاڻ کي "مدد" متن لکيو ۽ ان کي موڪليو. خير، پوء توهان اهڙي پيغامن تي عمل ڪيو. InlineKeyboardMarkup هي پڻ صفن جو هڪ صف آهي، اهو اڳئين مارڪ اپ سان ملندڙ جلندڙ آهي، پر هتي آپريٽنگ منطق ٿورو مختلف آهي. اهڙي ڪيبورڊ هڪ مخصوص پيغام سان ڳنڍيل آهي ۽ صرف ان لاء موجود آهي. هتي ان لائن ڪيبورڊ کي انسٽال ڪرڻ جو طريقو آهي
private void setInline() {
        List<List<InlineKeyboardButton>> buttons = new ArrayList<>();
        List<InlineKeyboardButton> buttons1 = new ArrayList<>();
        buttons1.add(new InlineKeyboardButton().setText(“Кнопка“).setCallbackData(17));
        buttons.add(buttons1);

        InlineKeyboardMarkup markupKeyboard = new InlineKeyboardMarkup();
        markupKeyboard.setKeyboard(buttons);
    }
ٺاھيو Listان ۾ List، ھڪڙي ان لائن بٽڻ شامل ڪريو پھرين لائن ۾. اهڙي بٽڻ ۾ URL، هڪ چينل جي لنڪ، يا CallbackQuery، جنهن بابت آئون ٿوري دير بعد لکندس. هتي اسان پنهنجي بٽڻ لاءِ ٽيڪسٽ سيٽ ڪيو جيڪو صارف ڏسندو ۽ پوءِ ڊيٽا سيٽ ڪيو جيڪو بوٽ ڏانهن موڪليو ويندو. اسان جي مثال ۾، صارف "هيلو" ڏسي ٿو، ۽ جڏهن ڪلڪ ڪيو، بوٽ موڪليو ويندو نمبر 17، هي اسان جو آهي CallbackQuery. جي باري ۾ چند لفظ CallbackQuery. ڪنهن شئي مان اهڙي ڊيٽا حاصل ڪرڻ لاءِ، Updateتوهان کي عمل ڪرڻ جي ضرورت آهي update.getCallbackQuery()، اهو طريقو واپس اچي ٿو CallbackQuery، جنهن مان توهان اڳ ۾ ئي حاصل ڪري سگهو ٿا bot ڏانهن منتقل ڪيل ڊيٽا. هن ڊيٽا کي حاصل ڪرڻ جي ڪوشش ڪرڻ جي ڪا ضرورت ناهي طريقي سان 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 اکرن کان وڌيڪ نه هجڻ گهرجي! جڏهن اهڙو جواب موڪليندو، ڪلائنٽ کي هڪ پاپ اپ ونڊو ملي ويندي جنهن ۾ پيغام لکيل هوندو. اهڙي ونڊو ظاهر ٿيڻ کان ڪجهه سيڪنڊن بعد غائب ٿي سگهي ٿي، يا اها لڪي ٿي سگهي ٿي جيستائين يوزر OK کي دٻائي. انهن طريقن کي تبديل ڪرڻ لاء، اسان کي سڏين ٿا answer.setShowAlert(true). جڏهن trueونڊو لڪي رهي آهي جيستائين توهان OK کي دٻايو، جڏهن falseاهو 5 سيڪنڊن کان پوء غائب ٿي وڃي. اصول ۾، اهي سڀئي بنيادي خاصيتون آهن ٽيليگرام بوٽ لائبريري. جيڪڏھن توھان چاھيو، توھان اھڙيون شيون سکي سگھو ٿا جيئن ملٽي ميڊيا موڪلڻ، جيولوڪيشن وغيره وغيره. اچو ته اڳتي وڌون اسان جي بوٽ کي ميزباني تي. منهنجي پروجيڪٽ لاءِ، مون هيروڪو چونڊيو آهي، ڇاڪاڻ ته منهنجي خيال ۾ اها ڪافي آسان هوسٽنگ آهي جنهن جي پنهنجي CLI آهي. اهو مفت آهي، پر هن شرح تي توهان جو بوٽ 30 منٽن کان پوءِ هائبرنيشن ۾ ويندو جيڪڏهن ڪا درخواست نه هجي. جڏهن کيس ڪا درخواست موڪلي وئي ته هو اٿي کڙو ٿيو. اهو تمام جلدي ٿئي ٿو، توهان اڃا به نوٽيس نه ڪندا (جيستائين، يقينا، ڊيٽابيس سان ڪنيڪشن ٻيهر قائم نه ڪيو وڃي). مفت منصوبي تي حد آهي 5MB ڊيٽابيس، 100MB ڊسڪ اسپيس، 2TB ٽرئفڪ هر مهيني، 1 ڊينو. ڊينو توهان جي هلندڙ ايپليڪيشن آهي. مان فوري طور تي چوندس ته اهو مقرري وارو مرحلو هو جيڪو منهنجي لاءِ مشڪلاتن جو سبب بڻيو، ڇو ته مون اڳ ڪڏهن به پنهنجون درخواستون نه ڏنيون هيون. جڏهن ترتيب ڏيڻ، هيروڪو کي هڪ فائل جي ضرورت آهي Procfile (بغير واڌ جي). اسان ان کي پروجيڪٽ جي روٽ ۾ ٺاھيون ٿا، اتي worker: sh target/bin/workerBot workerBot لکون ٿا - اھو نالو جيڪو اسان بيان ڪريون ٿا pom.xml The sh اسڪرپٽ ۾ جيڪو Maven پلگ ان 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 project”
اڳيون توهان کي لاگ ان ٿيڻ جي ضرورت آهي هيروڪو، لکڻ جي ڪمان لائن ۾
heroku login
رجسٽريشن دوران بيان ڪيل ڊيٽا داخل ڪريو. پوء توهان کي ڳولڻ جي ضرورت آهي توهان جي مخزن جو URL Heroku تي، اهو ڪيو ويو آهي سيٽنگون. پوءِ لکنداسين
git remote add heroku [url]
هيروڪو ريموٽ مخزن توهان جي مخزن ۾ شامل ڪيو ويندو. اڳتي هلي لکنداسين
git push heroku master
اسان انتظار ڪري رهيا آهيون... جيڪڏهن ايپليڪيشن جي ڊيپلائيمينٽ ڪامياب ٿي وڃي ته اسان حڪم جاري ڪريون ٿا
heroku ps:scale worker=1
۽ اهو ئي آهي، توهان جي ايپليڪيشن هلي رهي آهي. جيڪڏهن ائين نه ٿئي، ته لاگز کي غور سان ڏسو؛ گهڻو ڪري ته توهان جي ايپليڪيشن ۾ ڪا نقص آهي، جنهن سبب اهو حادثو ٿيو. اهڙو ڊگهو مضمون پڙهڻ لاءِ توهان جي مهرباني، مون کي اميد آهي ته ڪو ماڻهو ان کي ڪارائتو ڳوليندو ۽ انهن هنڌن تي گهڻو وقت بچائيندو جتي مون ترقي دوران ٿڪايو هو.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION