JavaRush /جاوا بلاگ /Random-UR /جاوا میں ٹیلیگرام بوٹ بنانا: خیال سے تعیناتی تک
John Watson
سطح

جاوا میں ٹیلیگرام بوٹ بنانا: خیال سے تعیناتی تک

گروپ میں شائع ہوا۔
ویسے بھی بوٹس کیا ہیں؟ آپ اس کے بارے میں یہاں تفصیل سے پڑھ سکتے ہیں ۔ سب سے پہلے، آپ کو ٹیلیگرام پر بوٹس تیار کرنے کے لیے لائبریری کے لیے آفیشل دستاویزات کو پڑھنے کی ضرورت ہے (اس کے بعد اسے API کہا جائے گا)۔ وہ یہاں جھوٹ بولتی ہے ۔ جاوا میں ٹیلیگرام بوٹ بنانا: خیال سے تعیناتی تک - 1وہاں ہر چیز قابل رسائی اور قابل فہم ہے۔ ایسا لگتا ہے کہ لکھو اور خوش ہو جاؤ! لیکن یہ اتنا آسان نہیں ہے۔ سرچ انجنوں میں کافی وقت گزارنے کے بعد، مجھے بوٹ ڈویلپمنٹ کے بارے میں علم کے ٹکڑوں کا پتہ چلا، مثال کے طور پر، کی بورڈ کیسے بنایا جائے، کال بیک کیوری پر کارروائی کریں، اور اس طرح کے دیگر۔ مجھے جاوا میں بوٹس تیار کرنے کے لیے کبھی مکمل اور جامع گائیڈ نہیں ملا۔ اس نے مجھے یہ مضمون لکھنے پر اکسایا۔ انٹرنیٹ پر بہت سی ایسی سائٹیں ہیں جہاں آپ ریڈی میڈ تعیناتی کے ساتھ اپنا بوٹ بنا سکتے ہیں۔ لیکن بات یہ ہے۔ کہ زیادہ تر حصے کے لیے، بوٹس بنائے گئے ہیں جو پس منظر کی معلومات فراہم کر سکتے ہیں وغیرہ۔ ہمارا بوٹ ایک مکمل ویب ایپلیکیشن ہے جس سے آپ ڈیٹابیس کو باندھ سکتے ہیں، مختلف 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()ہم بوٹ کو لانچ کرتے ہیں۔ ابھی کے لیے، وہ ہمیں صرف کوئی بھی پیغام بھیجتا ہے جو ہم اسے بھیجتے ہیں، ایک قسم کا "آئینہ"۔ یہ سب کچھ اس طرح کام کرتا ہے: جب آپ ایپلیکیشن لانچ کرتے ہیں، تو یہ مندرجہ ذیل یو آر ایل پر ہر n سیکنڈ میں ایک بار ٹیلیگرام سرور کو ایک GET درخواست بھیجنا شروع کر دیتا ہے: https://api.telegram.org/BotToken/getMe، جہاں BotToken ہے آپ کے بوٹ کا ٹوکن، تمام پیغامات پر مشتمل JSON جواب موصول کرنا۔ اس طرح کے ہر پیغام پر لائبریری کی طرف سے کارروائی کی جاتی ہے اور OnUpdateReceived(Update update)ایک آبجیکٹ کے طور پر طریقہ کار پر آتا ہے Update۔ اسی کے ساتھ ہم کام کرتے ہیں۔ یہ ٹیلیگرام بوٹس کی خوبصورتی ہے، وہ کسی بھی کمپیوٹر پر کام کر سکتے ہیں، ٹیسٹنگ کے لیے آپ کو صرف ایپلیکیشن لانچ کرنی ہوگی، آپ کو ہر تبدیلی کے بعد اسے ہوسٹنگ میں تعینات کرنے کی ضرورت نہیں ہے۔ یہ بہت آرام دہ ہے۔ بلاشبہ، بوٹ کو ویب ہک کا استعمال کرتے ہوئے کام کرنے کے لیے کنفیگر کیا جا سکتا ہے؛ مینوئل انٹرنیٹ پر پایا جا سکتا ہے؛ سادگی کے لیے، ہم لانگ پولنگ کا استعمال کرتے ہوئے کام کریں گے۔ پیغامات کو کیسے پروسیس کرنا ہے اور جواب میں کیا بھیجنا ہے صرف زبانی ٹولز اور لائبریری تک محدود ہے، باقی سب کچھ آپ کی صوابدید پر ہے۔ آپ ایک بوٹ بنا سکتے ہیں جو آپ کے لیے یوٹیوب پر ویڈیوز تلاش کرے گا، آپ ایک بوٹ بنا سکتے ہیں جو ہر روز آپ کو وہی بھیجے گا جو آپ خود بھیجتے ہیں، مثال کے طور پر، ایک سال میں، ایک قسم کا ٹائم کیپسول۔ یا آپ سیکھ سکتے ہیں کہ 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 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، پہلی لائن میں ایک ان لائن بٹن شامل کریں۔ اس طرح کے بٹن میں یو آر ایل، کسی چینل کا لنک، یا 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ونڈو لٹکتی رہتی ہے جب تک کہ آپ ٹھیک نہیں دباتے، جب falseیہ 5 سیکنڈ کے بعد غائب ہو جاتی ہے۔ اصولی طور پر، یہ ٹیلیگرام بوٹ لائبریری کی تمام بنیادی خصوصیات ہیں۔ اگر آپ چاہیں تو دستاویزات سے ملٹی میڈیا، جغرافیائی محل وقوع وغیرہ بھیجنے جیسی چیزیں سیکھ سکتے ہیں۔ آئیے اپنے بوٹ کو ہوسٹنگ پر تعینات کرنے کی طرف بڑھتے ہیں۔ اپنے پروجیکٹ کے لیے، میں نے Heroku کا انتخاب کیا، کیونکہ میری رائے میں یہ کافی آسان ہوسٹنگ ہے جس کا اپنا CLI ہے۔ یہ مفت ہے، لیکن اگر کوئی درخواستیں نہ ہوں تو اس شرح پر آپ کا بوٹ 30 منٹ کے بعد ہائبرنیشن میں چلا جائے گا۔ جب اسے کوئی درخواست بھیجی جاتی ہے تو وہ اٹھ جاتا ہے۔ یہ بہت تیزی سے ہوتا ہے، آپ کو نوٹس بھی نہیں ہوگا (جب تک کہ، ڈیٹا بیس سے کنکشن دوبارہ قائم نہ ہو جائے)۔ مفت پلان کی حد 5MB ڈیٹا بیس، 100MB ڈسک اسپیس، 2TB ٹریفک فی مہینہ، 1 ڈائنو ہے۔ ڈینو آپ کی چل رہی ایپلی کیشن ہے۔ میں فوراً ہی کہوں گا کہ یہ تعیناتی کا مرحلہ تھا جس کی وجہ سے میرے لیے مشکلات پیدا ہوئیں، کیونکہ میں نے پہلے کبھی اپنی درخواستیں تعینات نہیں کی تھیں۔ تعینات کرتے وقت، ہیروکو کو Procfile (بغیر توسیع کے) نام کی ایک فائل درکار ہوتی ہے۔ ہم اسے پروجیکٹ کی جڑ میں بناتے ہیں، وہاں worker: sh target/bin/workerBot workerBot لکھتے ہیں - وہ نام جو ہم نے pom.xml Maven پلگ ان appassembler-maven-plugin کا ​​استعمال کرتے ہوئے تیار کردہ sh اسکرپٹ میں بیان کیا ہے لانچ کیا جائے گا۔ اسکرپٹ مرتب شدہ جار کو چلانے کی وضاحت کرتا ہے۔ شروع کی جانے والی کلاس کا نام <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 تلاش کرنے کی ضرورت ہے، یہ ترتیبات میں کیا جاتا ہے۔ پھر ہم لکھتے ہیں۔
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