CodeGym /جاوا بلاگ /Random-UR /جاوا میں ٹیلیگرام بوٹ بنانا: تصور سے لے کر تعیناتی تک
John Squirrels
سطح
San Francisco

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

گروپ میں شائع ہوا۔
تو بوٹس کیا ہیں؟ آپ یہاں اس کے بارے میں مزید پڑھ سکتے ہیں ۔ شروع کرنے کے لیے، آپ کو ٹیلیگرام بوٹس (اس کے بعد "API") تیار کرنے کے لیے استعمال ہونے والی لائبریری کے لیے سرکاری دستاویزات کا جائزہ لینے کی ضرورت ہے۔ یہ یہاں پایا جا سکتا ہے .
جاوا میں ٹیلیگرام بوٹ بنانا: تصور سے لے کر تعیناتی تک - 1
وہاں ہر چیز بہت قابل رسائی اور واضح ہے۔ ایسا لگتا ہے کہ ہم صرف کوڈ لکھ سکتے ہیں اور خوشی منا سکتے ہیں! لیکن یہ اتنا آسان نہیں ہے۔ تلاش کرنے میں کافی وقت گزارنے کے بعد، مجھے بوٹ کی نشوونما کے بارے میں علم کی معلومات ملی ہیں، مثال کے طور پر، کی بورڈ کیسے بنایا جائے، ایک کو ہینڈل کیا جائے، وغیرہ CallbackQuery۔ لیکن، مجھے جاوا بوٹ کی ترقی کے لیے ایک مکمل، مکمل گائیڈ نہیں ملا۔ اس نے مجھے یہ مضمون لکھنے پر اکسایا۔ بہت ساری ویب سائٹس ہیں جہاں آپ آسانی سے قابل تعینات بوٹ بنا سکتے ہیں۔ لیکن حقیقت یہ ہے کہ بنائے گئے زیادہ تر بوٹس حوالہ کی معلومات اور اس طرح کی معلومات فراہم کرتے ہیں۔ ہمارا بوٹ ایک مکمل ویب ایپلیکیشن ہے۔ آپ ایک ڈیٹا بیس کو باندھ سکتے ہیں، مختلف API درخواستوں کو انجام دے سکتے ہیں، ویب سائٹس کو پارس کر سکتے ہیں، پیچیدہ حسابات انجام دے سکتے ہیں، اور بہت کچھ۔ امکانات صرف آپ کی تخیل تک محدود ہیں۔ مجھے امید ہے کہ مذکورہ بالا نے یہ واضح کرنے میں مدد کی ہے کہ میں کیا لکھنے جا رہا ہوں۔ ٹیلیگرام پر بوٹ رجسٹر کرنا بہت آسان ہے۔ اس عمل کو اوپر سے منسلک دستاویزات میں تفصیل سے بیان کیا گیا ہے۔ ہماری درخواست کے لیے، آپ کو صرف بوٹ کا نام اور بوٹ کو رجسٹر کرتے وقت موصول ہونے والا ٹوکن جاننے کی ضرورت ہے۔ بنیادی طور پر، بوٹ صرف ایک کنسول پر مبنی ویب ایپلیکیشن ہے۔ کوئی فرنٹ اینڈ نہیں ہے، صرف خالص کمانڈ پروسیسنگ۔ اگر آپ Hibernate میں مہارت حاصل کرنا چاہتے ہیں یا 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 سیکنڈ میں ایک بار، درج ذیل یو آر ایل پر درخواستیں بھیجنا شروع کر دیتا ہے: https://api.telegram.org/BotToken/getMe ، جہاں BotToken آپ کے بوٹ کا ٹوکن ہے۔ . جواب میں، یہ تمام پیغامات پر مشتمل JSON وصول کرتا ہے۔ ان میں سے ہر ایک پیغام پر لائبریری کے ذریعے کارروائی کی جاتی ہے اور اسے OnUpdateReceived(Update update)بطور Updateآبجیکٹ طریقہ کار میں منتقل کیا جاتا ہے۔ اور اسی کے ساتھ ہم کام کرتے ہیں۔ اسی میں ٹیلیگرام بوٹس کی خوبصورتی مضمر ہے: وہ کسی بھی کمپیوٹر پر چل سکتے ہیں، اس کی جانچ کے لیے صرف ایپلیکیشن شروع کرنے کی ضرورت ہوتی ہے، اور آپ کو ہر تبدیلی کے بعد اسے میزبان پر تعینات کرنے کی ضرورت نہیں ہے۔ یہ بہت آسان ہے۔ یقینا، آپ ویب ہکس کا استعمال کرتے ہوئے کام کرنے کے لیے بوٹ کو تشکیل دے سکتے ہیں۔ آپ انٹرنیٹ پر اس کے لیے ہدایات تلاش کر سکتے ہیں۔ سادگی کے لیے، ہم استعمال کریں گے LongPolling ۔ پیغامات پر کارروائی کیسے کی جاتی ہے اور آپ جواب میں کیا بھیجتے ہیں صرف زبان اور لائبریری کی صلاحیتوں سے محدود ہیں۔ باقی سب کچھ آپ پر منحصر ہے۔ آپ ایک بوٹ بنا سکتے ہیں جو آپ کے لیے یوٹیوب ویڈیوز تلاش کرے گا۔ آپ ایک بوٹ بنا سکتے ہیں جو آپ کو وہی بھیجے گا جو آپ اپنے آپ کو روزانہ بھیجتے ہیں، جیسے ایک سال پہلے کے ٹائم کیپسول۔ یا آپ 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 بٹن نظر آئیں گے جو کہ ایک دوسرے کے نیچے "Hi" اور "Help" کہتے ہیں۔ جب ان میں سے کسی ایک بٹن پر کلک کیا جاتا ہے تو بوٹ کو بٹن کے متن پر مشتمل ایک پیغام بھیجا جاتا ہے۔ لہذا، اگر کلائنٹ "Help" پر کلک کرتا ہے ، تو بوٹ کو "مدد" کے ساتھ ایک پیغام موصول ہوگا۔ بوٹ کو، ایسا لگتا ہے کہ کلائنٹ نے خود "مدد" لکھا ہے اور متن کو بوٹ کو بھیج دیا ہے۔ اور پھر آپ پیغامات پر کارروائی کرتے ہیں۔

ان لائن کی بورڈ مارک اپ

یہ بھی صفوں کی ایک صف ہے۔ یہ پچھلے مارک اپ سے ملتا جلتا ہے، لیکن یہاں منطق کچھ مختلف طریقے سے کام کرتی ہے۔ اس قسم کا کی بورڈ ایک مخصوص پیغام سے منسلک ہوتا ہے اور صرف اس کے لیے موجود ہوتا ہے۔ ان لائن کی بورڈ ترتیب دینے کا طریقہ یہ ہے:
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، اور پہلی قطار میں ان لائن بٹن شامل کریں۔ اس بٹن میں یو آر ایل، کسی چینل کا لنک، یا ایک CallbackQuery، جس کے بارے میں میں تھوڑی دیر بعد لکھوں گا۔ یہ وہ جگہ ہے جہاں ہم اپنے بٹن کا متن سیٹ کرتے ہیں، جو صارف کو نظر آئے گا، اور پھر ہم وہ ڈیٹا سیٹ کرتے ہیں جو بوٹ کو بھیجا جائے گا۔ ہماری مثال میں، صارف "Hi" دیکھتا ہے، اور جب بٹن دبایا جائے گا تو نمبر 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طریقہ کو پاس کرتے ہیں تو، ونڈو برقرار رہتی ہے جب تک کہ OK دبایا نہ جائے۔ اگر آپ غلط پاس کرتے ہیں، تو یہ 5 سیکنڈ کے بعد غائب ہو جاتا ہے۔ یہ تمام ٹیلیگرام بوٹ لائبریری کی بنیادی خصوصیات ہیں۔ اگر آپ چاہیں تو، آپ ملٹی میڈیا، جغرافیائی محل وقوع وغیرہ بھیجنے کے طریقے جیسی چیزیں سیکھ سکتے ہیں۔ آئیے اپنے بوٹ کو ہوسٹنگ پلیٹ فارم پر تعینات کرنے کی طرف بڑھتے ہیں۔ اپنے پروجیکٹ کے لیے، میں نے Heroku کا انتخاب کیا ۔ میرے خیال میں یہ اپنے CLI کے ساتھ ایک آسان ہوسٹنگ پلیٹ فارم ہے۔ یہ مفت ہے، لیکن اس پلان پر آپ کا بوٹ کوئی درخواست موصول نہ ہونے کے 30 منٹ بعد ہائبرنیٹ ہو جائے گا۔ درخواست موصول ہونے پر یہ جاگ جائے گا۔ یہ اتنی جلدی ہوتا ہے، آپ کو نوٹس بھی نہیں ہوگا (جب تک کہ، یقیناً، ڈیٹا بیس کنکشن دوبارہ شروع نہیں ہوتا ہے)۔ مفت پلان 5MB ڈیٹا بیس، 100MB ڈسک اسپیس، 2TB ڈیٹا فی مہینہ، اور 1 ڈائنو تک محدود ہے۔ ڈائنو آپ کی چل رہی ایپلیکیشن ہے۔ میں ابھی کہوں گا کہ یہ تعیناتی تھی جس کی وجہ سے مجھے مشکلات کا سامنا کرنا پڑا، کیونکہ میں نے پہلے کبھی اپنی درخواستیں تعینات نہیں کی تھیں۔ تعیناتی کے دوران، ہیروکو کو Procfile (بغیر توسیع کے) نام کی ایک فائل درکار ہوتی ہے۔ ہم اسے پروجیکٹ کی جڑ میں بناتے ہیں۔ اندر، ہم لکھتے ہیں worker: sh target/bin/workerBot، جہاں workerBot نام ہے جس میں بیان کیا گیا ہے pom.xml۔ ایک sh اسکرپٹ، جو Maven Application Assembler Plugin (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 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