CodeGym /Java Blog /এলোমেলো /জাভাতে একটি টেলিগ্রাম বট তৈরি করা: ধারণা থেকে স্থাপনা পর্...
John Squirrels
লেভেল 41
San Francisco

জাভাতে একটি টেলিগ্রাম বট তৈরি করা: ধারণা থেকে স্থাপনা পর্যন্ত

এলোমেলো দলে প্রকাশিত
তাই বট কি? আপনি এখানে এই সম্পর্কে আরো পড়তে পারেন . শুরু করার জন্য, আপনাকে টেলিগ্রাম বট তৈরি করতে ব্যবহৃত লাইব্রেরির অফিসিয়াল ডকুমেন্টেশন পর্যালোচনা করতে হবে (এরপরে "API")। এটা এখানে পাওয়া যাবে .
জাভাতে একটি টেলিগ্রাম বট তৈরি করা: ধারণা থেকে স্থাপনা পর্যন্ত - 1
সেখানে সবকিছু খুব সহজলভ্য এবং পরিষ্কার। মনে হচ্ছে আমরা শুধু কোড লিখতে পারি এবং আনন্দ করতে পারি! কিন্তু এটা এত সহজ নয়। অনেক সময় অনুসন্ধান করার পরে, আমি বট বিকাশের জ্ঞানের টিডবিট পেয়েছি, উদাহরণস্বরূপ, কীভাবে একটি কীবোর্ড তৈরি করতে হয়, একটি পরিচালনা করতে হয়CallbackQuery, এবং তাই ঘোষণা. কিন্তু, আমি জাভা বট বিকাশের জন্য একটি সম্পূর্ণ, সম্পূর্ণ গাইড খুঁজে পাইনি। যে আমাকে এই নিবন্ধটি লিখতে অনুপ্রাণিত. অনেক ওয়েবসাইট আছে যেখানে আপনি আপনার নিজের সহজে স্থাপনযোগ্য বট তৈরি করতে পারেন। কিন্তু বাস্তবতা হল, তৈরি করা বেশিরভাগ বটই রেফারেন্স তথ্য এবং এর মতো প্রদান করে। আমাদের বট একটি পূর্ণাঙ্গ ওয়েব অ্যাপ্লিকেশন। আপনি একটি ডাটাবেস আবদ্ধ করতে পারেন, বিভিন্ন API অনুরোধ চালাতে পারেন, ওয়েবসাইট পার্স করতে পারেন, জটিল গণনা করতে পারেন এবং আরও অনেক কিছু করতে পারেন। সম্ভাবনার শুধুমাত্র আপনার কল্পনা দ্বারা সীমাবদ্ধ। আমি আশা করি যে উপরে আমি কি লিখতে যাচ্ছি তা স্পষ্ট করতে সাহায্য করেছে। টেলিগ্রামে বট নিবন্ধন করা খুবই সহজ। এই প্রক্রিয়াটি উপরে বর্ণিত ডকুমেন্টেশনে বিশদভাবে বর্ণনা করা হয়েছে। আমাদের আবেদনের জন্য, আপনাকে শুধুমাত্র বটটির নাম এবং বট নিবন্ধন করার সময় আপনি যে টোকেন পাবেন তা জানতে হবে। মূলত, একটি বট শুধুমাত্র একটি কনসোল-ভিত্তিক ওয়েব অ্যাপ্লিকেশন। কোন সামনে শেষ নেই, শুধু বিশুদ্ধ কমান্ড প্রক্রিয়াকরণ. আপনি যদি মাস্টার করতে চানহাইবারনেট করুন বা 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(), বটটি শুরু করুন। আপাতত, এটি শুধুমাত্র আমাদের কাছে যে কোনো বার্তা পাঠায়, যেমন একটি " আয়না "। এটি এইভাবে কাজ করে: আপনি যখন অ্যাপ্লিকেশনটি শুরু করেন, এটি প্রতি এন সেকেন্ডে একবার, নিম্নলিখিত URL এ টেলিগ্রাম সার্ভারে অনুরোধ পাঠাতে শুরু করে: https://api.telegram.org/BotToken/getMe , যেখানে BotToken হল আপনার বটের টোকেন . প্রতিক্রিয়া হিসাবে, এটি সমস্ত বার্তা ধারণকারী JSON গ্রহণ করে। এই বার্তাগুলির প্রতিটি লাইব্রেরি দ্বারা প্রক্রিয়া করা হয় এবং OnUpdateReceived(Update update)একটি হিসাবে পদ্ধতিতে প্রেরণ করা হয়Updateবস্তু এবং যে আমরা কি সঙ্গে কাজ. টেলিগ্রাম বটগুলির সৌন্দর্য এখানেই নিহিত: তারা যে কোনও কম্পিউটারে চালাতে পারে, এটি পরীক্ষা করার জন্য কেবল অ্যাপ্লিকেশনটি শুরু করা প্রয়োজন, এবং প্রতিটি পরিবর্তনের পরে আপনাকে এটিকে হোস্টে স্থাপন করার দরকার নেই। এই খুব সুবিধাজনক. অবশ্যই, আপনি ওয়েবহুক ব্যবহার করে কাজ করার জন্য একটি বট কনফিগার করতে পারেন। আপনি ইন্টারনেটে এর জন্য দিকনির্দেশ পেতে পারেন। সরলতার জন্য, আমরা লংপোলিং ব্যবহার করব. বার্তাগুলি কীভাবে প্রক্রিয়া করা হয় এবং আপনি প্রতিক্রিয়াতে কী পাঠান তা কেবল ভাষা এবং লাইব্রেরির ক্ষমতা দ্বারা সীমাবদ্ধ। বাকি সব আপনার উপর নির্ভর করে. আপনি একটি বট তৈরি করতে পারেন যা আপনার জন্য YouTube ভিডিও অনুসন্ধান করবে। আপনি একটি বট তৈরি করতে পারেন যা আপনাকে প্রতিদিন যা পাঠাবে তা পাঠাবে, যেমন এক বছর আগের টাইম ক্যাপসুলের মতো। অথবা আপনি 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 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()। এই পদ্ধতিটি একটি রিটার্ন করে 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 ডাইনো দ্বারা সীমাবদ্ধ৷ একটি dyno আপনার চলমান অ্যাপ্লিকেশন. আমি এখনই বলব যে এটি স্থাপনার কারণে আমার অসুবিধা হয়েছিল, যেহেতু আমি আগে কখনো আমার অ্যাপ্লিকেশনগুলি স্থাপন করিনি। স্থাপনার সময়, Heroku Procfile নামে একটি ফাইল প্রয়োজন (একটি এক্সটেনশন ছাড়াই)। আমরা এটি প্রোজেক্ট রুটে তৈরি করি। ভিতরে, আমরা লিখি worker: sh target/bin/workerBot, যেখানে 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>
এই প্রক্রিয়া শুরু করার আগে, আপনাকে Heroku- এ নিবন্ধন করতে হবে এবং Git এবং Heroku CLI উভয়ই ইনস্টল করতে হবে । যদি আপনার অ্যাপ্লিকেশনের একটি ডাটাবেসের প্রয়োজন হয়, তাহলে আপনি একটি নতুন অ্যাপ্লিকেশন তৈরি করার সময় প্রয়োজনীয় ডাটাবেস যোগ করতে ভুলবেন না। আরও, আপনাকে আপনার ডাটাবেসের জন্য হোস্ট, ব্যবহারকারীর নাম, পাসওয়ার্ড এবং পোর্ট নির্ধারণ করতে হবে এবং তারপরে আপনার অ্যাপ্লিকেশনে সেগুলি নির্দেশ করতে হবে। পরবর্তী, স্থাপন করার আগে, Maven ব্যবহার করে আপনার প্রকল্প তৈরি করুন ।

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
এবং এটা, আপনার আবেদন আপ এবং চলমান. যদি তা না হয়, লগগুলি সাবধানে দেখুন। সম্ভবত, আপনার অ্যাপ্লিকেশনে একটি ত্রুটি এটি ব্যর্থ হয়েছে। এত দীর্ঘ নিবন্ধ পড়ার জন্য আপনাকে ধন্যবাদ. আমি আশা করি যে কেউ এটিকে দরকারী বলে মনে করবে এবং এটি আপনাকে সেই অঞ্চলে অনেক সময় বাঁচাবে যা আমাকে উন্নয়নের সময় সমস্যা দিয়েছে।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION