Picture of the author
Published on

สร้างแอป Android รับข้อมูลจากการแจ้งเตือน

Cover

ขอบคุณรูปภาพจาก https://www.pushengage.com

Japter (Android Application)

เมื่อผมใช้การบันทึกรายจ่ายผ่่าน LINE ไปสักพัก เริ่มขี้เกียจต้องมาคอยพิมพ์อยู่ทุกครั้ง และผมเองแทบไม่ได้ใช้เงินสดเลย ส่วนมากจะโอนจ่ายสะมากกว่า เลยมีความสนใจสร้างแอพตามที่คุณ dtinth ได้บอกไว้ เมื่อลองเข้าไปดู​ Source code และเอา Project มารันทดสอบดู ก็ยังงงๆ จับต้นชนปลายไม่ถูกอยู่ดี ทำให้ผมตัดสินใจเขียนขึ้นมาใหม่ตาม Concept ที่คุณ dtinth ได้ทำไว้ และตัดส่วนที่เราไม่ต้องการออกไป จนได้ออกเป็นแอพชื่อ Japter ซึ่งมาจาก ชื่อผมเองตัว J และคำว่า Adapter เอามารวมกันนั่นเอง

Japter

การทำงานคือ Japter จะคอยดึงข้อมูลการใช้จ่ายจากการแจ้งเตือน และส่งข้อมูลทั้งหมดไปยัง Jasistant มีรายละเอียดอังนี้

  • สามารถกำหนดได้ว่าไม่ต้องแจ้งเตือนเรื่องอะไรบ้าง โดยการใส่ชื่อ Package ไปเลย

    Japter
  • สามารถดูรายละเอียดการแจ้งเตือนล่าสุดได้

    Japter
  • สามารถดูสถานะต่างๆได้ เช่น สำเร็จแล้วกี่รายการหรืออยู่ในคิวอีกกี่รายการ เป็นต้น

    Japter
  • สามารถยกเลิกทุกรายการที่อยู่ในคิวได้

    Japter
  • ระบบจะส่งรายการที่ล้มเหลวแบบอัตโนมัติไปใหม่เรื่อยๆ จนกว่าจะสำเร็จหรือจนกว่าเราจะยกเลิก

  • เมื่อมีการแจ้งเตือนจากโทรศัพท์ Japter จะดักจับการแจ้งเตือนตามที่เรากำหนดไว้ ส่งไป Jasistant เพื่อบันทึกรายการ และส่งข้อความกลับมาใน Janalyze ซึ่งเราสามารถกดเข้าไปแก้ไขเพื่อเพิ่มรายละเอียดว่ารายการนี้ ใช้จ่ายอะไรไปก็ย่อมได้

    Japter Line

. . .

Tech Stacks

  • Kotlin - เป็นภาษาหลักในการเขียน Android
  • lazysodium-android - ใช้ในการเข้ารหัสสำหรับส่งข้อมูลไปยัง Jasistant
  • Material - ใช้เป็น CSS สำหรับ UI

. . .

Debug

  1. เปิดเมนู Developer options ใน Settings เพื่อทำการ Debug , Install Application ผ่าน USB หรือ Wifi ซึ่งโทรศัพท์แต่ล่ะรุ่นจะใช้วิธีแตกต่างกัน อย่างเช่น Turn on Develoepr Options ส่วนตัวผมเองใช้ Xiaomi จะต้องไปที่ Settings > About phone > MIUI Version (Click 7 times) แล้วเมนูจะเพิ่มเข้ามาที่ Settings > Additional settings
  2. ผมจะ Debug ผ่าน Wirless เปิดโทรศัพท์ไปที่ Settings > Additional Setting > Developer options > Wireless debugging > Pair device with QR code
  3. กลับมาที่ Android Studio ตรง Runnings devices เลือก Pair Devices Using Wi-Fi (ต้องใช้ Wi-Fi อันเดียวกัน) เลือก Pair using QR code แล้ว Scan จากโทรศัพท์ได้เลย ถ้าเชื่อมต่อกันสำเร็จ จะแสดงข้อความว่าสำเร็จ และมีชื่อรุ่นโทรศัพท์ของเราใน Android Studio กด Debug ได้เลย
  4. ถ้าโทรศัพท์เรายังไม่มี Application ก็จะมี Popup สอบถามว่าเราจะ Install หรือไม่ ให้เลือก Install
  5. ต้องไปตั้งค่าเพื่อให้ Japter เข้าถึงการแจ้งเตือนได้ และกำหนดให้ทำงานตลอดเวลา ไปที่ Settings > Apps > Manage apps > Japter
App infoOther permissions
infopermissions
  1. เมื่อเราลง Japter เรียบร้อยแล้ว ต้อง Setup publicKey ก่อน เพื่อใช้ในการเข้ารหัสเมื่อส่งข้อมูลไปยัง Jasistant ผมทำตาม Document ที่คุณ dtinth เขียนไว้ ต้อง Setup ด้วยกัน 2 ที่

Jasistant

/controllers/notification.controller.js
  const sealedbox = require('tweetnacl-sealedbox-js');
  const expenseTracking = require("../modules/expense-tracking.module")

  exports.notification = async (req, res) => {

    const result = sealedbox.open(
      Buffer.from(req.body, 'hex'),
      Buffer.from(process.env.NOTI_PUBLIC_KEY, 'base64'),
      Buffer.from(process.env.NOTI_SECRET_KEY, 'base64')
    );

    const notification = JSON.parse(Buffer.from(result).toString('utf8'));

    const packageName = notification?.packageName
    const title = notification?.title
    const text = notification?.text
    const time = notification?.time


    let amount = 0;
    let match;

    // Regex get Currency from String
    if(match = text.match(/([^\d]|^)((?!0\.00)\d{1,3}(,\d{3})*(\.\d\d))([^\d]|$)/g)){
      amount = Number(match[2].replace(/[^0-9.-]+/g,""))
    }
    
    if(amount > 0){
      if(packageName == "com.kasikorn.retail.mbanking.wap"){
        if(title == 'รายการโอน/ถอน' || title == 'รายการใช้บัตร'){
          await expenseTracking(new Date(time),title,amount, "transfer")
          return res.status(200).send({message : 'Expense recording success.'})
        }
      }
    }
  };

พอได้ key มาแล้ว ผมเอามาไว้ในตัวแปร .env และมีการ Filter บันทึกรายจ่ายเฉพาะการแจ้งเตือน ที่มาจากแอปธนาคารที่เป็นการโอนเงินหรือการใช้บัตรเครดิตเท่านั้น

Japter

  • Public Key - ใช้ค่าเดียวกันกับ process.env.NOTI_PUBLIC_KEY
  • HTTPS Enpoint - ก็ตรงตัวเลยผมจะใส่เป็น https://jasistant.vercel.app/notification

. . .

Install

Android Studio > Build > Build Bundle(s)/APK(s) > Build APK(s) โปรแกรมใช้เวลา Build สักครู่ เราก็จะได้ไฟล์ .apk ออกมา ถ้าไม่มี error หรืออะไรผิดพลาด นำไฟล์นั้นมา Insatll ในโทรศัพท์ของเราได้เลย


Japter Source Code