Selasa, 20 Februari 2024

Scrape Data dari Website KPU dengan Free Pascal dan Lazarus

Hallo guys,

Jadi ceritanya kemarin saya iseng membuat aplikasi web scraping menggunakan Free Pascal dan IDE Lazarus. Karena kebetulan lagi momen Pemilu 2024, Idenya adalah mengambil data dari website Komisi Pemilihan Umum (KPU) di alamat https://pemilu2024.kpu.go.id/ dengan metode grab alias scraping menggunakan teknik browser automation. Adapun hasil akhirnya adalah memperoleh data hasil perhitungan Pilpres dari tingkat Provinsi - Kabupaten/Kota - Kecamatan - Kelurahan/Desa - TPS. Sekalian kita akan mengambil atau mendownload foto/gambar C1 Plano/Hasil yang ada di TPS tersebut.

Pada contoh ini saya akan mengambil data dari Provinsi NUSA TENGGARA BARAT yang mana alamat URL nya adalah https://pemilu2024.kpu.go.id/pilpres/hitung-suara/52. Dari halaman tersebut kita akan mengambil data Kabupaten/Kota (contoh : KOTA MATARAM), yang selanjutnya akan kita gunakan untuk mendapatkan data Kecamatan (contoh : SELAPARANG) , kemudian kita gunakan untuk mendapatkan data Kelurahan/Desa (contoh : REMBIGA) dan terakhir mendapatkan data TPS (contoh : TPS 002).

Oke, Lets Do It!

Pertama-tama siapkan perkakas yang digunakan. Dalam hal ini adalah WebDriver4L dan Google Chrome Driver (sesuaikan dengan versi yang terpasang di komputer anda)

Kedua, Buat projek menggunakan Lazarus IDE. Saya menggunakan Lazarus versi 2.2.2 dan Free Pascal 3.2.2. Letakan semua file yang ada di WebDriver4L ke dalam folder projek. Berikutnya tambahkan Webdriver4L di uses dan deklarasikan variabel global sbb:

  Robot : TWebDriver;
  kabupaten_kota, kecamatan, kelurahan_desa, tps : TWebElements;
  urlkab, urlkec, urldesa, urltps : String;
  i : integer;

  const
    main_url = 'https://pemilu2024.kpu.go.id';  

Selanjutnya tambahakan Google Chrome Driver yang telah didownload sebelumnya ke dalam folder projek kemudian desain formnya seperti gambar di bawah ini

Tauhidslab

Ketiga, mengambil data Kabupaten dan Kota dari URL Provinsi NUSA TENGGARA BARAT menggunakan script di bawah ini, letakan di dalam tombol Ambil Data Kab/Kota. Sekedar informasi, untuk mendapatkan XPath, klik kanan di browser - Inspect - Klik Kanan di Element - Copy - Copy full XPath.

  {$IFDEF WINDOWS}
  Robot := TChromeDriver.Create(nil);
  Robot.StartDriver(ExtractFileDir(Paramstr(0)) + '\chromedriver.exe');
  {$ELSE}
  //Robot := TChromeDriver.Create(nil);
  Robot := TFireFoxDriver.Create(nil);
  //Robot.StartDriver(ExtractFileDir(Paramstr(0)) + '/chromedriver');
  Robot.StartDriver(ExtractFileDir(Paramstr(0)) + '/geckodriver');
  {$ENDIF}
  Robot.NewSession;
  Robot.Implicitly_Wait(1000);
  Robot.Set_Window_Size(640, 640);
  Robot.GetURL(main_url+'/pilpres/hitung-suara/52');
  Sleep(2000);
  kabupaten_kota := Robot.FindElementsByXPath('//*[@id="main"]/div[3]/div[2]/div[2]/div[2]/div/div/table/tbody/tr/td[1]/a');
  Memo1.Clear;
  Memo1.Append('=== Data Kabupaten/Kota ===');
  for i := 0 to kabupaten_kota.Count - 1 do
  begin
       Memo1.Append(kabupaten_kota.Items[i].Text);
       if (kabupaten_kota.Items[i].Text='KOTA MATARAM') then urlkab:=kabupaten_kota.Items[i].AttributeValue('href');
  end;   

Keempat, mengambil data Kecamatan dari KOTA MATARAM menggunakan script di bawah ini, letakan di dalam tombol Ambil Data Kecamatan

  Robot.GetURL(main_url+urlkab);
  Sleep(2000);
  kecamatan := Robot.FindElementsByXPath('//*[@id="main"]/div[3]/div[2]/div[2]/div[2]/div/div/table/tbody/tr/td[1]/a');
  Memo1.Append('=== Data Kecamatan ===');
  for i := 0 to kecamatan.Count - 1 do
  begin
       Memo1.Append(kecamatan.Items[i].Text);
       if (kecamatan.Items[i].Text='SELAPARANG') then urlkec:=kecamatan.Items[i].AttributeValue('href');
  end;  

Kelima, mengambil data Kelurahan dari Kecamatan SELAPARANG menggunakan script di bawah ini, letakan di dalam tombol Ambil Data Kelurahan/Desa

  Robot.GetURL(main_url+urlkec);
  Sleep(2000);
  kelurahan_desa := Robot.FindElementsByXPath('//*[@id="main"]/div[3]/div[2]/div[2]/div[2]/div/div/table/tbody/tr/td[1]/a');
  Memo1.Append('=== Data Kelurahan/Desa ===');
  for i := 0 to kelurahan_desa.Count - 1 do
  begin
       Memo1.Append(kelurahan_desa.Items[i].Text);
       if (kelurahan_desa.Items[i].Text='REMBIGA') then urldesa:=kelurahan_desa.Items[i].AttributeValue('href');
  end;  

Keenam, mengambil data TPS dari Kelurahan REMBIGA menggunakan script di bawah ini, letakan di dalam tombol Ambil Data TPS

  Robot.GetURL(main_url+urldesa);
  Sleep(2000);
  tps := Robot.FindElementsByXPath('//*[@id="main"]/div[3]/div[2]/div[2]/div[2]/div/div/table/tbody/tr/td[1]/a');
  Memo1.Append('=== Data TPS ===');
  for i := 0 to tps.Count - 1 do
  begin
       Memo1.Append(tps.Items[i].Text);
       if (tps.Items[i].Text='TPS 002') then urltps:=tps.Items[i].AttributeValue('href');
  end;   

Ketujuh, mengambil informasi hasil perhitungan dari data TPS 002 menggunakan script di bawah ini, letakan di dalam tombol Ambil Hasil Perhitungan

var
  anies, prabowo, ganjar : TWebElement;
begin
  Robot.GetURL(main_url+urltps);
  Sleep(2000);
  anies := Robot.FindElementByXPath('/html/body/div/div[1]/div/div[3]/div[2]/div[2]/div/div/div[1]/table[2]/tbody/tr[1]/td[3]');
  prabowo := Robot.FindElementByXPath('/html/body/div/div[1]/div/div[3]/div[2]/div[2]/div/div/div[1]/table[2]/tbody/tr[2]/td[3]');
  ganjar := Robot.FindElementByXPath('/html/body/div/div[1]/div/div[3]/div[2]/div[2]/div/div/div[1]/table[2]/tbody/tr[3]/td[3]');
  Memo1.Append('=== Hasil Perhitungan ===');
  Memo1.Append('Anies-Muhaimain : '+anies.Text);
  Memo1.Append('Prabowo-Gibran : '+prabowo.Text);
  Memo1.Append('Ganjar-Mahfud : '+ganjar.Text);
end;

Kedelapan, mendownload Form C1 Hasil alias Plano. Proses download ini dilakukan dengan dua tahap. Pertama melakukan click pada button Lihat Form Pindai C Hasil menggunakan script di bawah ini, letakan di dalam tombol Buka C1 Hasil/Plano

  Robot.ExecuteScript('var xpath = "/html/body/div/div[1]/div/div[3]/div[2]/div[2]/div/div/button";'+
                        'function getElementByXpath(path) {'+
                        'return document.evaluate('+
                        '  path,'+
                        '  document,'+
                        '  null,'+
                        '  XPathResult.FIRST_ORDERED_NODE_TYPE,'+
                        '  null'+
                        ').singleNodeValue;'+
                        '}'+
                        'var element = getElementByXpath(xpath);'+
                        'if (!element) {'+
                        'throw new Error("Error: cannot find an element with XPath(" + xpath + ")");'+
                        '}'+
                        'element.click();');   

Kedua, buat folder di dalam folder projek dengan nama Download_C1 untuk menampung hasil download. Adapun proses dowload menggunakan library tambahan yaitu synapse. Silahkan download kemudian tambahkan ke dalam projek (package - open package file (.lpk) - use - add to project). Selanjutnya, karena dalam proses ini kita akan mendownload file dari situs https, jadi kita memerlukan library openssl untuk windows silahkan download di sini. Ekstrak kemudian masukan semua filenya ke dalam folder projek. Lalu tambahkan unit httpsend dan ssl_openssl di dalam uses projek. Terakhir, untuk proses download saya menggunakan script di bawah ini, letakan di dalam tombol Download C1. Source code lengkap ada di github

var
  c1_hasil : TWebElements;
  httpClient: THTTPSend;
begin
  c1_hasil := Robot.FindElementsByXPath('/html/body/div/div[1]/div/div[3]/div[2]/div[2]/div/div/div[4]/div[2]/div/div/a');
  Memo1.Append('=== Download C1 Hasil ===');
  for i := 0 to c1_hasil.Count - 1 do
  begin
       httpClient:= THTTPSend.Create;
       if httpClient.HTTPMethod('GET', c1_hasil.Items[i].AttributeValue('href')) then
            begin
            httpClient.Document.SaveToFile('Download_C1/c1_'+IntToStr(i)+'_xx.jpg');
            Memo1.Append('C1 Hasil Berhasil didownload...');
            end;
       httpClient.Free;
  end;
end;  

oke, that's it.. semoga bermanfaat 

Selasa, 30 Januari 2024

Memprogram Bot Telegram dengan Lazarus Free Pascal

Hallo Pemirsa,

Saya akan berbagi sedikit pengetahuan tentang cara memprogram Bot Telegram menggunakan Bahasa Pemrograman Free Pascal dan Lazarus IDE. Cara ini menggunakan unit dan library murni bawaan Free Pascal dan Lazarus sehingga tidak perlu repot memasang komponen pihak ketiga atau perkakas tambahan yang lumayan merepotkan. 

Tauhidslab

Memprogram Telegram Bot atau Telebot sejatinya dapat dilakukan dengan bahasa pemrograman apa saja karena pertukaran data dilakukan melalui HTTP Request menggunakan data format Javascript Object Notation alias JSON. Alhasil, kita hanya memerlukan komponen HTTP Client untuk mengambil dan mengirimkan data ke server Telegram. Sebelum lebih jauh membahas cara memprogram Telebot dengan Bahasa Pemrograman Objek Pascal dan Lazarus, mari kita mulai dengan membuat sebuah Bot Telegram.  

1. Membuat Bot Telegram

Pastikan anda sudah memasang aplikasi Telegram di Smartphone. Buka aplikasi tersebut kemudian dalam kolom pencarian ketik kata kunci BotFather. Pada daftar tampilan yang muncul pilih yang bercentang biru seperti gambar di bawah ini.

Tauhidslab

Berikutnya ketik perintah /newbot kemudian balas dengan mengirimkan nama dan username bot. Pada contoh ini namanya adalah Free Pascal Bot dan usernamenya adalah freepascalbot. Perhatikan bahwa untuk pemilihan username pastikan mengandung kata bot di dalamnya dan disambung tanpa menggunakan spasi. Jika tidak ada kesalahan, bot telah berhasil dibuat dan BotFather akan membalas dengan Token yang digunakan untuk berkomunikasi dengan bot melalui layanan Application Programming Interface (API). Simpan token tersebut karena akan digunakan nantinya. Perhatikan gambar di bawah ini.

Tauhidslab

Terakhir, untuk memastikan apakah bot sudah tersedia, lakukan pengujian dengan cara mencari bot tersebut menggunakan kata kunci username bot di kolom pencarian aplikasi Telegram. Pastikan menggunakan kata kunci username bukan nama untuk mencegah ketidaksesuaian dalam hasil pencarian mengingat saat ini bot dengan nama yang mirip sangat banyak. Seperti gambar di bawah ini.

Tauhidslab

2. Memprogram Bot Telegram Menggunakan Lazarus Free Pascal

Saya akan memastikan bahwa memprogram Telegram Bot menggunakan Free Pascal sangatlah mudah karena karena semua unit dan komponen yang diperlukan telah tersedia. Seara umum, ada 2 library yang diperlukan, pertama untuk kebutuhan berkomunikasi melalui HTTP Request dan kedua untuk kebutuhan mengelola data dengan format JSON. 

Pada intinya, kemampuan untuk mengelola data format JSON adalah kunci utama dalam memprogram Telegram Bot. Saya telah membuat sebuah projek sederhana yang dapat anda unduh melalui link github ini. Projek sederhana tersebut memiliki kemampuan sbb:

a. Mengambil informasi bot dan menampilkannya dalam pesan dialog
b. Mengambil pesan masuk (inbox) kemudian menampilkannya ke dalam komponen ListBox
c. Mengirimkan pesan berdasarkan chat_id yang diperoleh dari pesan masuk (inbox). 

Sebagai gambaran, berikut saya contohkan bagaimana mengambil Informasi Bot (getMe) melalui Free Pascal dan Lazarus IDE. Pertama-tama pada uses projek anda tambahkan beberapa unit berikut:

fpjson, jsonparser, fphttpclient, opensslsockets, StdCtrls;

Selanjutnya deklarasikan beberapa variabel global sebagai berikut:

  rawData : ansistring;
  JsonPar : TJSONParser;
  jsonDoc : TJSONObject;
  TELEGRAM_BOT_URL : string;  

Adapun contoh kode yang saya gunakan untuk menampilkan Informasi Bot (getMe) adalah sbb:

procedure TForm1.Button3Click(Sender: TObject);
var
  id, first_name, username : string;
begin

   TELEGRAM_BOT_URL := 'https://api.telegram.org/'+Token+'/getMe';

   // Melakukan HTTP Request dengan TFPHTTPClient
   try
      rawData := TFPHTTPClient.SimpleGet(TELEGRAM_BOT_URL);
    except
      on E: Exception do
      begin
        ShowMessage('Gagal membaca sumber data: ' + E.Message);
        Exit;
      end;
    end;

   // Memformat/Parse Output yang diperoleh dari HTTP Request menjadi JsonDoc
    try
      JsonPar := TJSONParser.Create(rawData);
      JsonDoc := TJSONObject(JsonPar.Parse);
    except
      on E: Exception do
      begin
        ShowMessage('Informasi tidak valid: ' + E.Message);
        Exit;
      end;
    end;

    // Membreakdown Hasil Parse (JsonDoc) kemudian menyimpannya ke dalam variabel
     if  jsonDoc.findpath('ok').AsBoolean then
       begin

         // Jika Result tidak kosong
         if (jsonDoc.findpath('result').Count <> 0) then
         begin

           if (jsonDoc.findpath('result').FindPath('id') <> nil) then
              id := jsonDoc.findpath('result').FindPath('id').AsString;
           if (jsonDoc.findpath('result').FindPath('first_name') <> nil) then
              first_name := jsonDoc.findpath('result').FindPath('first_name').AsString;
           if (jsonDoc.findpath('result').FindPath('username') <> nil) then
              username := jsonDoc.findpath('result').FindPath('username').AsString;

           // Menampilkan informasi bot dalam dialog informasi
           ShowMessage('Bot ID : '+id+sLineBreak+'Bot Name : '+first_name+sLineBreak+'Username : '+username);
         end;

       end;
end; 

Untuk lebih jelasnya silahkan download source code projek melalui link github di atas. Silahkan kembangkan sesuai dengan kebutuhan anda. Akhir kata, tetap semangat!! 

Sabtu, 27 Januari 2024

Cara Merilis Aplikasi Android di Lazarus Android Module Wizard (LAMW)

Hallo guys, 

Postingan kali ini akan membahas bagaiaman merelease aplikasi android yang dikembangan menggunakan Bahasa Lazarus + Free Pascal + Lazarus Android Module Wizard (LAMW). Sebelumnya pastikan anda sudah bisa mengcompile projek android anda. Baca postingan saya sebelumnya di sini.   

Tahap release application merupakan bagian utama setelah aplikasi dinyatakan layak untuk dikonsumsi oleh publik. Tentunya setelah melewati tahap ujicoba dan trial error. Beruntungnya, LAMW telah menyediakan fitur untuk rilis aplikasi baik menjadi signed Apk (.apk) atau signed Bundle (.aab). Fitur ini sangat membantu terutama untuk mereka yang bertujuan mempublish aplikasinya di Google Play Store. 

Pertama-tama, untuk menyamakan persepsi, kita akan menggunakan contoh projek di dalam folder demos nama projekya adalah AppCompatBottomNavigationDemo1. Jika anda menggunakan projek lain, silahkan sesuaikan. 

Pada tutorial ini akan dicontohkan bagaimana merilis aplikasi menjadi signed .apk secara universal. Artinya dalam file .apk tersebut terdapat library armeabi-v7a (32 bits) dan arm64-v8a (64 bits) sehingga tidak perlu membuat file .apk secara terpisah untuk masing-masing platform yang berbeda. 

Sebelumnya, lakukan kompilasi projek pada masing-masing Chipset/Architecture. Masuk ke menu Project - Project Options... Pilih [LAMW] Android Project Options - Build - Chipset ARMV7a+Soft dan Aarch64. Hasilnya akan diperoleh 2 buah library (32 bits dan 64 bits) dalam folder libs. Selain itu, proses kompilasi akan menghasilnya beberapa file di dalam folder D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release

1. Mengatur Konfigurasi File Pendukung

Membuat file Signed Apk atau File Bundle (.aab) melalui LAMW, memerlukan beberapa file pendukung yang perlu disesuaikan dengan konfiguras Path perkakas yang digunakan. 
 
Mengedit file release-keystore.bat. File tersebut berada di dalam folder projek. Jika belum ada, silahkan tambahkan secara mandiri. sesuaikan dengan path perkakas pendukung yang anda gunakan. 

set JAVA_HOME=C:\Program Files\Zulu\zulu-17
set PATH=%JAVA_HOME%\bin;%PATH%
set JAVA_TOOL_OPTIONS=-Duser.language=en
keytool -genkey -v -keystore appcompatbottomnavigationdemo1-release.keystore -alias appcompatbottomnavigationdemo1.keyalias -keyalg RSA -keysize 2048 -validity 10000 < keytool_input.txt
:Error
echo off
cls
echo.
echo Signature file created previously, remember that if you delete this file and it was uploaded to Google Play, you will not be able to upload another app without this signature.
echo.
pause
 
Berikutnya edit file gradle-local-build.bat yang ada di dalam folder projek. Jika belum ada, silahkan tambahkan secara mandiri sbb:

set Path=%PATH%;D:\OprekLAMW\Sdk\platform-tools
set GRADLE_HOME=D:\OprekLAMW\gradle-7.6.3\
set PATH=%PATH%;%GRADLE_HOME%\bin
gradle clean build --info

Berikutnya edit file gradle-local-apksigner.bat yang ada di dalam folder projek. Jika belum ada, silahkan tambahkan secara mandiri sbb:

set Path=%PATH%;D:\OprekLAMW\Sdk\platform-tools;D:\OprekLAMW\Sdk\build-tools\34.0.0
set GRADLE_HOME=D:\OprekLAMW\gradle-7.6.3
set PATH=%PATH%;%GRADLE_HOME%\bin
zipalign -v -p 4 D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-armeabi-v7a-release-unsigned.apk D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-armeabi-v7a-release-unsigned-aligned.apk
apksigner sign --ks D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\appcompatbottomnavigationdemo1-release.keystore --ks-pass pass:123456 --key-pass pass:123456 --out D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-release.apk D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-arm64-v8a-release-unsigned-aligned.apk

Berikutnya edit file gradle-local-universal-apksigner.bat yang ada di dalam folder projek sbb:

set Path=%PATH%;D:\OprekLAMW\Sdk\platform-tools;D:\OprekLAMW\Sdk\build-tools\34.0.0
set GRADLE_HOME=D:\OprekLAMW\gradle-7.6.3
set PATH=%PATH%;%GRADLE_HOME%\bin
zipalign -v -p 4 D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-universal-release-unsigned.apk D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-universal-release-unsigned-aligned.apk
apksigner sign --ks D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\appcompatbottomnavigationdemo1-release.keystore --ks-pass pass:123456 --key-pass pass:123456 --out D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-release.apk D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-universal-release-unsigned-aligned.apk

Berikutnya edit file gradle-local-build-bundle.bat yang ada di dalam folder projek. Jika belum ada, silahkan tambahkan secara mandiri sbb:

set Path=%PATH%;D:\OprekLAMW\Sdk\platform-tools
set GRADLE_HOME=D:\OprekLAMW\gradle-7.6.3\
set PATH=%PATH%;%GRADLE_HOME%\bin
gradle clean bundle --info

Berikutnya edit file gradle-jarsigner-verify.bat yang ada di dalam folder projek. Jika belum ada, silahkan tambahkan secara mandiri sbb:

set JAVA_HOME=C:\Program Files\Zulu\zulu-17
path %JAVA_HOME%\bin;%path%
jarsigner -verify -verbose -certs D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release\AppCompatBottomNavigationDemo1-release.apk

2. Membuat File Signed Apk

Pada menu Tools - [LAMW] Lazarus Module Wizard - Build Release Signed Apk.... Akan muncul tampilan Input Keytool untuk kebutuhan membuat keystore baru jika key belum ada (belum pernah dibuat sebelumnya). Pada contoh ini saya menggunakan data default, silahkan sesuaikan dengan data anda termasuk pada file pendukung diatas seperti nama dan password keystore. Pilih Ok dan tunggu prosesnya sampai selesai. 

Tauhidslab

Jika tidak ada kesalahan, akan muncul file baru di dalam folder D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\apk\release dengan nama AppCompatBottomNavigationDemo1-release.apk. Sampai pada tahap ini anda sudah berhasil membuat sebuah file Signed Apk yang dapat didistribusikan baik pada perangkat android 32 atau 64 bit. 

3. Membuat File Bundle .aab Untuk Google Play Store

Pada saat postingan ini ditulis, Google Play Store mengharuskan Developer untuk mempublis aplikasi android yang telah dipaketkan dengan ekstensi .aab. Beruntungnya, LAMW juga telah menyediakan fitur untuk mempaketkan aplikasi menjadi file .aab dengan cara yang relatif sangat mudah. 

Pada menu Tools - [LAMW] Lazarus Module Wizard - Build Release Signed Bundle.... Proses bundle akan memerlukan waktu beberapa menit. Berikut adalah proses bundle projek android menjadi file .aab menggunakan Lazarus Android Module Wizard (LAMW)

Tauhidslab

Tunggu sampai prosesnya selesai. Jika tidak ada kesalahan, proses diatas akan menghasilkan sebuah file di dalam folder D:\OprekLAMW\lazandroidmodulewizard-master\demos\GUI\AppCompatBottomNavigationDemo1\build\outputs\bundle\release dengan nama AppCompatBottomNavigationDemo1-release.aab. Dan selamat anda dapat mempublish projek anda ke Google Play Store. :)


Jumat, 26 Januari 2024

Mengembangkan Aplikasi Android dengan Lazarus Android Module Wizard (LAMW)

Hallo sobat,

Sebelumnya saya sudah pernah membahas cara membuat aplikasi android dengan Free Pascal menggunakan Laz4Android yang dapat anda baca di sini. Pada postingan ini saya akan berbagi trik dan tutorial menjadikan Lazarus IDE agar dapat digunakan untuk mengembangkan aplikasi android. Cara ini agak sedikit berbeda dengan Laz4Android karena compiler dan tools pendukung akan dipasang secara mandiri. Tidak seperti Laz4Android yang sudah menyediakan compiler dan tools pendukung secara otomatis. Selain itu, perkakas pendukung yang digunakan akan lebih terupdate bila dibandingkan dengan postingan sebelumnya. Langkah-langkah ini akan cukup panjang, jadi siapkan kopi dan camilan anda. haha  

Pertama-tama, untuk menyamakan persepsi, silahkan pasang Lazarus versi 2.2.4 menggunakan Free Pascal 3.2.2 di komputer anda. Kemudian download Lazarus Android Module Wizard (LAMW). Berikutnya download Java 17 melalui laman Zulu. Kemudian download build tools Gradle 7.6.3. Selanjutnya download build tools Apache Ant apache-ant-1.10.14. Berikutnya download Android Native Development Kit android-ndk-r21e

Saya sangat menyarankan agar anda mengelompokan perkakas pendukung tersebut di dalam sebuah folder agar lebih rapih, misal di folder (D:\OprekLAMW)

Berikutnya, kita memerlukan Android Software Development Kit (SDK). Sayangnya, saat postingan ini ditulis, Android SDK hanya dapat diperoleh dengan menginstall Aplikasi Android Studio. Jadi untuk kebutuhan tersebut, kita terpaksa harus menginstall Aplikasi Android Studio untuk mendapatkan Android SDK. Pada tutorial ini saya menggunakan android-studio-2023.1.1.27-windows. Lakukan pengaturan melalui SDK Manager. Sebaiknya mengganti Android SDK Location ke folder yang telah disepakati sebelumnya D:\OprekLAMW\Sdk. Kemudian pasang SDK Platforms dan SDK Tools yang akan digunakan nantinya. Jika diperlukan install semuanya kecuali System Image. :D

Berikutnya adalah install Java 17 (zulu17.44.15-ca-jdk17.0.8-win_x64) kemudian tambahkan variabel baru dalam System Variables Windows (Variable Name=JAVA_HOME, Variable Value=C:\Program Files\Zulu\zulu-17). Selanjutnya dalam Path Variable tambahkan %JAVA_HOME%\bin dan folder Gradle D:\OprekLAMW\gradle-7.6.3\bin

Selanjutnya adalah install Package Lazarus Android Module Wizard (LAMW) di Lazarus IDE anda. adapun urutan pemasangannya adalah tfpandroidbridge_pack.lpk (di dalam folder "..../android_bridges") kemudian lazandroidwizardpack.lpk (di dalam folder "..../android_wizard") dan terakhir amw_ide_tools.lpk (di dalam folder "..../ide_tools"). Pastikan tidak ada masalah dalam proses pemasangan package LAMW. 

Berikutnya adalah menambahkan Build Tools Android (armV7a dan aarch64) ke dalam Lazarus IDE. Download terlebih dahulu Source Code FPC. Ekstrak dan letakan di dalam folder yang telah disepakati sebelumnya (D:\OprekLAMW\source-main). Berikut adalah perkakas yang telah berhasil dikumpulkan dalam folder tersebut. 

Tauhidslab

Selanjutnya di aplikasi Lazarus IDE akses menu Tools - [LAMW] Lazarus Module Wizard - Build FPC Cross Android. Konfigurasikan Pathnya sbb:

Tauhidslab

Proses Build cukup lama tunggu sampai selesai! Setelah itu masuk ke Tab Install kemudian klik tombol Install. Jika tidak ada kesalahan maka Android Build Tools armV7a telah berhasil terpasang di Lazarus IDE. Ulangi langkah tersebut untuk Architecture aarch64

Langkah Berikutnya adalah melakukan sedikit pengaturan Path perkakas pendukung melalui menu Tools - [LAMW] Lazarus Module Wizard - Path Settings [Jdk, Sdk, Ndk...]. Konfigurasikan Path-nya sebagai berikut:

Tauhidslab

Langkah terakhir, edit file fpc.cfg di dalam folder (D:\lazarus\fpc\3.2.2\bin\x86_64-win64). Ubah script pada baris ke 158-160 menjadi sbb:

# searchpath for units and other system dependent things
-FuD:\lazarus\fpc\3.2.2/units/$fpctarget
-FuD:\lazarus\fpc\3.2.2/units/$fpctarget/*
-FuD:\lazarus\fpc\3.2.2/units/$fpctarget/rtl

Setelah selesai, Lazarus IDE sudah siap digunakan untuk mengembangkan aplikasi Android. Pada contoh ini pengujian akan dilakukan dengan mengcompile projek AppCompatNavigationDrawerDemo1 di dalam folder demos, buka folder jni - controls.lpi

Setelah projek terbuka (Jika ada dialog konfirmasi, pilih yes/ok/confirm/create), akses menu Project - Project Options... Pilih [LAMW] Android Project Options - Build - Chipset ARMV7a+Soft atau Aarch64 (Chipset/Architecture yang telah dipasang pada tahap sebelumnya). Pada Tab Android Manifest dan Application silahkan sesuaikan sesuai kebutuhan anda.  

Untuk melakukan kompilasi, akses menu Run - [LAMW] Build Android Apk and Run Ctrl+F1. 
 
Pada saat kompilasi, saya menemukan beberapa Error sbb:

1. Pada file Laz_XMLStreaming.pas baris ke 79 saya ubah menjadi sbb: 

procedure WriteString(const Value: String); //override;

2. Pada file UITypes.pas baris 93 saya ubah menjadi sbb:
  
ModalResultStr: array[mrNone..mrClose] of shortstring = (
    'mrNone',
    'mrOk',
    'mrCancel',
    'mrAbort',
    'mrRetry',
    'mrIgnore',
    'mrYes',
    'mrNo',
    'mrAll',
    'mrNoToAll',
    'mrYesToAll',
    'mrClose'); 

3. Pada file LResources.pp baris 294 saya ubah menjadi sbb:

procedure WriteString(const Value: String); //override;

4. Pada file Dialogs.pp baris 805 saya ubah menjadi sbb:

DialogResult : Array[mrNone..mrClose] of Longint = (
    -1, idButtonOK, idButtonCancel, idButtonAbort, idButtonRetry,
    idButtonIgnore, idButtonYes,idButtonNo, idButtonAll, idButtonNoToAll,
    idButtonYesToAll,idButtonClose);  

Setelah menyelesaikan 4 error diatas, proses kompilasi berjalan normal (pastikan komputer terhubung ke internet). Untuk diketahui saya tidak menggunakan Emulator tapi langsung menyambungkan komputer ke perangkat Android melalui USB dan mode Debug. Berikut hasil kompilasi pada jendela Message di Lazarus IDE.  

Tauhidslab

Kemudian di sisi perangkat android perlu dilakukan konfirmasi (setuju) pada proses pemasangan. Berikut adalah hasil kompilasi yang diperoleh 

Tauhidslab

Sekian tutorial dan tips kali ini, silahkan kembangkan kemampuan anda dengan mencoba mengkompilasi projek yang ada di folder demos kemudian buatlah sebuah projek secara mandiri agar kemampuan menjadi lebih terasah. Akhir kata selamat berkreasi menggunakan Free Pascal, Lazarus IDE dan Lazarus Android Module Wizard (LAMW). #cheers :)


Kamis, 25 Januari 2024

Memprogram Whatsapp Web dengan Free Pascal Lazarus

Hallo teman-teman, 

Pada postingan ini saya ingin berbagi sedikit pengetahuan tentang cara memprogram Whatsapp Web menggunakan bahasa pemrograman Free Pascal dan Lazarus IDE. Umumnya, memprogram Whatsapp dikenal juga dengan dengan istilah Aplikasi Whatsapp (WA) Automation atau Whatsapp Bot. Tidak masalah istilah mana yang akan anda gunakan. Intinya, aplikasi dapat mengambil dan mengirimkan pesan secara otomatis dari antarmuka aplikasi. 

Pertama-tama, untuk menyamakan persepsi, pada contoh ini saya menggunakan Free Pascal versi 3.2.2 dan Lazarus 2.2.4. Selanjutnya, kita memerlukan 2 buah package tambahan yaitu package CEF4Delphi yang bertugas sebagai Web Browser untuk membuka WhatsApp Web dan package wbot-modified sebagai antarmuka aplikasi dengan Browser. Sebelum memasang kedua package tersebut pastikan anda sudah memasang package dcpcrypt_laz yang dapat ditemukan melalui menu Package - Install/Uninstall Package di aplikasi Lazarus IDE. Berikutnya pasang package CEF4Delphi kemudian dilanjutkan dengan wbot-modified.

Sampai di sini sebenarnya anda sudah dapat membuat projek baru untuk memprogram Whatsapp Web. sebagai perkenalan, anda dapat mencompile contoh projek yang saya buat di folder demo dalam package wbot-modified. Berikut adalah tampilannya.  

Tauhidslab

Harap perhatikan bahwa agar aplikasi dapat berjalan dengan baik, download terlebih dahulu file CEF Binary. Link download dapat dilihat pada laman CEF4Delphi. Silahkan sesuaikan file binary yang akan anda download dengan spesifikasi perangkat dan OS yang anda gunakan, misal Windows 64 bits. Ekstrak file hasil download kemudian pisahkan beberapa file berikut dan letakan di dalam folder projek. 

Tauhidslab

Sebagai informasi tambahan, jika anda membuat projek baru, jangan lupa menambahkan unit-unit milik package wbot-modified di dalam unit projek anda. Selain itu, anda perlu menambahkan beberapa baris kode di dalam file *.lpr projek anda agar dapat menjalankan package CEF. Untuk lebih jelasnya silahkan lihat di file wbotdemo.lpr dan umain.pas di dalam projek demo folder wbot-modified.

Selamat dan Semangat Ngoprek :D