CodeGym/Java Blogu/Rastgele/Java'da bir Telegram Botu Oluşturma: fikir aşamasından da...
John Squirrels
Seviye
San Francisco

Java'da bir Telegram Botu Oluşturma: fikir aşamasından dağıtıma

grupta yayınlandı
Peki botlar nedir? Bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz . Başlamak için, Telegram botlarını (bundan böyle "API" olarak anılacaktır) geliştirmek için kullanılan kitaplığın resmi belgelerini incelemeniz gerekir. Burada bulunabilir .
Java'da bir Telegram Botu Oluşturma: fikir aşamasından dağıtıma - 1
Oradaki her şey çok erişilebilir ve net. Görünüşe göre sadece kod yazıp sevinebiliriz! Ama o kadar basit değil. Arama yapmak için çok zaman harcadıktan sonra, bot geliştirme hakkında bilgi parçacıkları buldum, örneğin klavye nasıl yapılır, bir klavye nasıl kullanılır?CallbackQueryvb. Ancak, Java bot geliştirme için eksiksiz ve kapsamlı bir kılavuz bulamadım. Bu, beni bu makaleyi yazmaya sevk etti. Kendi kolayca kurulabilen botunuzu oluşturabileceğiniz birçok web sitesi var. Ancak gerçek şu ki, oluşturulan botların çoğu referans bilgileri ve benzerlerini sağlar. Botumuz tam teşekküllü bir web uygulamasıdır. Bir veritabanını bağlayabilir, çeşitli API istekleri yürütebilir, web sitelerini ayrıştırabilir, karmaşık hesaplamalar gerçekleştirebilir ve daha fazlasını yapabilirsiniz. Olasılıklar yalnızca sizin hayal gücünüzle sınırlıdır. Umarım yukarıdakiler, ne hakkında yazacağımı netleştirmeye yardımcı olmuştur. Telegram'a bot kaydetmek çok kolaydır. Bu süreç, yukarıda bağlantısı verilen belgelerde ayrıntılı olarak açıklanmaktadır. Uygulamamız için, botu kaydederken sadece botun adını ve aldığınız jetonu bilmeniz yeterlidir. Temel olarak, bot, yalnızca konsol tabanlı bir web uygulamasıdır. Ön uç yok, sadece saf komut işleme var. ustalaşmak istiyorsanHazırda bekletme veya JSON'u nasıl ayrıştıracağınızı öğrenin , o zaman bu proje tam size göre. Bir bağımlılık ekleyerek başlayalım pom.xml(Maven kullandığınızı varsayacağım). Bunu şu şekilde yapabilirsiniz:
<dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>3.5</version>
</dependency>
Ardından , sınıfı miras alan ve yöntemlerini geçersiz kılan bir Botsınıf oluşturun: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";
    }
}
Ve şimdi yöntemin içeriği main:
public static void main(String[] args) {
        ApiContextInitializer.init();
        TelegramBotApi telegramBotApi = new TelegramBotApi();
        try {
            telegramBotApi.registerBot(Bot.getBot());
        } catch (TelegramApiRequestException e) {
            e.printStackTrace();
        }
}
getBotUsername()ve metodları doldurduktan sonra getBotToken()botu çalıştırın. Şimdilik, bir tür " ayna " gibi, kendisine gönderdiğimiz mesajları bize yönlendiriyor . Şu şekilde çalışır: uygulamayı başlattığınızda, her n saniyede bir Telegram sunucusuna şu URL'den istekler göndermeye başlar: https://api.telegram.org/BotToken/getMe , burada BotToken botunuzun simgesidir . Yanıt olarak, tüm mesajları içeren JSON'u alır. OnUpdateReceived(Update update)Bu mesajların her biri kitaplık tarafından işlenir ve yönteme bir mesaj olarak iletilir.Updatenesne. Ve biz bununla çalışıyoruz. Telegram botlarının güzelliği burada yatıyor: herhangi bir bilgisayarda çalışabilirler, test etmek için yalnızca uygulamayı başlatmanız gerekir ve her değişiklikten sonra onu ana bilgisayara dağıtmanıza gerek yoktur. Bu çok uygun. Elbette, bir botu web kancalarını kullanarak çalışacak şekilde yapılandırabilirsiniz. Bunun için yönergeleri internette bulabilirsiniz. Basit olması için LongPolling'i kullanacağız. İletilerin nasıl işlendiği ve yanıt olarak ne gönderdiğiniz yalnızca dilin ve kitaplığın yetenekleriyle sınırlıdır. Diğer her şey size kalmış. YouTube videolarını sizin için arayacak bir bot yapabilirsiniz. Bir yıl öncesinden bir zaman kapsülü gibi, her gün kendinize gönderdiğiniz şeyi size gönderecek bir bot yapabilirsiniz. Ya da CRM sistemleriyle entegre olmayı ve küçük işletmeler için robotlar yapmayı öğrenebilirsiniz—yalnızca hayal gücünüzle sınırlısınız. Hareketli. /Bot kullanmış olanlar , örneğin " " karakteriyle başlayan komutları kullanarak onlarla etkileşime geçmenin uygun olduğunu bilirler /start. Ancak daha uygun bir yol var: düğmeler. İki tür düğme vardır: bir giriş alanının ( ) altında görünenler ReplyKeyboardMarkupve bağlandıkları mesajın hemen altındaki düğmeler (InlineKeyboardMarkup). Belgelerdeki açıklamalarından onlar hakkında temel bir fikir edinebilirsiniz.

YanıtlaKlavye İşareti

Gerçekte, bu bir dizi düğme dizisidir: List<KeyboardRow <KeyboardButton>>. İşte bir klavye oluşturan örnek kod:
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()Bu methodu method içinde bir mesaj ilettikten sonra çağırıyoruz . Bu mesaj için bir klavyeyi bu şekilde ayarladık. Kullanıcıya bu mesajı gönderdiğimizde mesajımızın metnini ve alt alta "Merhaba" ve "Yardım" yazan 2 buton görecek. Bu butonlardan birine tıklandığında bota buton metnini içeren bir mesaj gönderilir. Bu nedenle, müşteri "Yardım" ı tıklarsa , bot "Yardım" içeren bir mesaj alır . Bot için, müşterinin kendisi "Yardım" yazmış ve metni bot'a göndermiş gibi görünecektir . Ve sonra mesajları işlersiniz.

InlineKeyboardİşaretleme

Bu aynı zamanda bir dizi dizisidir. Önceki İşaretlemeye benzer, ancak mantık burada biraz farklı çalışır. Bu klavye türü, belirli bir mesaja eklenir ve yalnızca onun için mevcuttur. Satır içi klavye ayarlamak için bir yöntem aşağıda verilmiştir:
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);
    }
Listiçinde bir oluşturun Listve satır içi düğmesini ilk satıra ekleyin. Bu düğme bir URL, bir kanal bağlantısı veya CallbackQuerybiraz sonra yazacağım bir e-posta içerebilir. Burada kullanıcının göreceği butonumuzun yazısını ve ardından bota gönderilecek datayı ayarlıyoruz. Örneğimizde kullanıcı "Hi" görüyor ve butona basıldığında 17 rakamı bota gönderilecek. Bu bizim CallbackQuery. ile ilgili birkaç söz CallbackQuery. Bu verileri nesneden elde etmek için Updateyürütmeniz gerekir update.getCallbackQuery(). Bu yöntem CallbackQuery, bot'a iletilen verilere erişebileceğiniz bir , döndürür. Bu verileri yöntem aracılığıyla almaya çalışmayın update.getMessage().getText(); bir 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());
        }
    }
Bir mesaj varsa, işlenmek üzere yeni bir konuya göndeririz; a varsa CallbackQuery, işlenmesi için uygun konuya göndeririz. adresine bir yanıt gönderebilirsiniz CallbackQuery. Telegram'daki her nesnenin kendi kimliği vardır. Belirli bir yanıt göndermek için CallbackQuery, karşılık gelen nesneden aldığımız kimliğini bilmeniz yeterlidir. Bir yanıt göndermek için bu yöntemi çağırıyoruz:
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();
        }
    }
ÖNEMLİ:Bir yanıttaki metin CallbackQuery200 karakterden uzun olmamalıdır! Böyle bir yanıt gönderdikten sonra, müşteri mesajı içeren bir açılır pencere görecektir. Bu pencere göründükten birkaç saniye sonra kaybolabilir veya kullanıcı Tamam'a basana kadar devam edebilir. Modları değiştirmek için yöntemi çağırıyoruz answer.setShowAlert(true). trueYönteme geçerseniz , OK tuşuna basılana kadar pencere devam eder. Yanlış geçerseniz, 5 saniye sonra kaybolur. Bunların hepsi Telegram Bot kütüphanesinin temel özellikleridir. İsterseniz multimedya gönderme, coğrafi konum belirleme gibi şeyleri öğrenebilirsiniz. Botumuzu bir barındırma platformuna dağıtmaya geçelim. Projem için Heroku'yu seçtim. Kendi CLI'sine sahip oldukça uygun bir barındırma platformu olduğunu düşünüyorum. Ücretsizdir, ancak bu planda botunuz hiçbir istek almadığı 30 dakikanın ardından hazırda bekletilir. Bir istek alındığında uyanacaktır. Bu o kadar hızlı gerçekleşir ki, farkına bile varmazsınız (elbette veritabanı bağlantısı yeniden başlamadığı sürece). Ücretsiz plan, 5 MB veritabanı, 100 MB disk alanı, ayda 2 TB veri ve 1 dyno ile sınırlıdır. Bir dyno çalışan uygulamanızdır. Uygulamalarımı daha önce hiç dağıtmadığım için, bana zorluk çıkaran şeyin dağıtım olduğunu hemen söyleyeceğim. Dağıtım sırasında Heroku, Procfile (uzantı olmadan) adlı bir dosya gerektirir. Bunu proje kökünde oluşturuyoruz. İçine, işçiBot'unworker: sh target/bin/workerBot içinde belirtilen ad olduğu yazıyoruz . bir şpom.xmlMaven Application Assembler Plugin (appassembler-maven-plugin) tarafından oluşturulan komut dosyası başlatılacaktır. Komut dosyası, derlenmiş bir jar dosyasının nasıl başlatılacağını açıklar. Başlatılacak sınıfın adı <mainClass>ve arasında </mainClass>, betiğin adı ise <name>ve </name>arasında belirtilir 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>
Bu işleme başlamadan önce Heroku'ya kaydolmalı ve hem Git'i hem de Heroku CLI'yi kurmalısınız . Uygulamanızın bir veritabanına ihtiyacı varsa, yeni bir uygulama oluştururken gerekli veritabanını eklemeyi unutmayın. Ayrıca, veritabanınız için ana bilgisayar, kullanıcı adı, şifre ve bağlantı noktasını belirlemeniz ve ardından bunları uygulamanızda belirtmeniz gerekir. Ardından, konuşlandırmadan önce projenizi Maven kullanarak oluşturun .
mvn clean install
İlk önce proje dizinimize gidiyoruz ve depoyu komutla başlatıyoruz git init. Ardından projemizi bu depoya ekliyoruz.
git add .
Sonra değişiklikleri taahhüt ediyoruz
git commit -m "First commit in the project"
Ardından, heroku'da oturum açmanız gerekir. Aşağıdakileri komut satırına yazın
heroku login
Kayıt sırasında oluşturduğunuz kimlik bilgilerini girin. Bundan sonra, deponuzun URL'sini heroku'da belirleyin. Bunu ayarlardan yapıyorsun. Sonra yazarız
git remote add heroku [url]
Deponuz için uzak bir heroku deposu eklenir. Sonra yazıyoruz
git push heroku master
Sonra bekleyeceğiz… uygulama başarılı bir şekilde dağıtılırsa, aşağıdaki komutu yürütün
heroku ps:scale worker=1
İşte bu kadar, uygulamanız çalışıyor ve çalışıyor. Değilse, günlüklere dikkatlice bakın. Büyük olasılıkla, uygulamanızdaki bir hata başarısız olmasına neden olmuştur. Bu kadar uzun bir yazıyı okuduğunuz için teşekkür ederim. Umarım birileri bunu yararlı bulur ve geliştirme sırasında bana sorun çıkaran alanlarda size çok zaman kazandırır.
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok