- Published on
สร้างแอป Android รับข้อมูลจากการแจ้งเตือน
ขอบคุณรูปภาพจาก https://www.pushengage.com
Japter (Android Application)
เมื่อผมใช้การบันทึกรายจ่ายผ่่าน LINE ไปสักพัก เริ่มขี้เกียจต้องมาคอยพิมพ์อยู่ทุกครั้ง และผมเองแทบไม่ได้ใช้เงินสดเลย ส่วนมากจะโอนจ่ายสะมากกว่า เลยมีความสนใจสร้างแอพตามที่คุณ dtinth ได้บอกไว้ เมื่อลองเข้าไปดู Source code และเอา Project มารันทดสอบดู ก็ยังงงๆ จับต้นชนปลายไม่ถูกอยู่ดี ทำให้ผมตัดสินใจเขียนขึ้นมาใหม่ตาม Concept ที่คุณ dtinth ได้ทำไว้ และตัดส่วนที่เราไม่ต้องการออกไป จนได้ออกเป็นแอพชื่อ Japter ซึ่งมาจาก ชื่อผมเองตัว J และคำว่า Adapter เอามารวมกันนั่นเอง
การทำงานคือ Japter จะคอยดึงข้อมูลการใช้จ่ายจากการแจ้งเตือน และส่งข้อมูลทั้งหมดไปยัง Jasistant มีรายละเอียดอังนี้
สามารถกำหนดได้ว่าไม่ต้องแจ้งเตือนเรื่องอะไรบ้าง โดยการใส่ชื่อ Package ไปเลย
สามารถดูรายละเอียดการแจ้งเตือนล่าสุดได้
สามารถดูสถานะต่างๆได้ เช่น สำเร็จแล้วกี่รายการหรืออยู่ในคิวอีกกี่รายการ เป็นต้น
สามารถยกเลิกทุกรายการที่อยู่ในคิวได้
ระบบจะส่งรายการที่ล้มเหลวแบบอัตโนมัติไปใหม่เรื่อยๆ จนกว่าจะสำเร็จหรือจนกว่าเราจะยกเลิก
เมื่อมีการแจ้งเตือนจากโทรศัพท์ Japter จะดักจับการแจ้งเตือนตามที่เรากำหนดไว้ ส่งไป Jasistant เพื่อบันทึกรายการ และส่งข้อความกลับมาใน Janalyze ซึ่งเราสามารถกดเข้าไปแก้ไขเพื่อเพิ่มรายละเอียดว่ารายการนี้ ใช้จ่ายอะไรไปก็ย่อมได้
Tech Stacks
- Kotlin - เป็นภาษาหลักในการเขียน Android
- lazysodium-android - ใช้ในการเข้ารหัสสำหรับส่งข้อมูลไปยัง Jasistant
- Material - ใช้เป็น CSS สำหรับ UI
Debug
- เปิดเมนู Developer options ใน Settings เพื่อทำการ Debug , Install Application ผ่าน USB หรือ Wifi ซึ่งโทรศัพท์แต่ล่ะรุ่นจะใช้วิธีแตกต่างกัน อย่างเช่น Turn on Develoepr Options ส่วนตัวผมเองใช้ Xiaomi จะต้องไปที่ Settings > About phone > MIUI Version (Click 7 times) แล้วเมนูจะเพิ่มเข้ามาที่ Settings > Additional settings
- ผมจะ Debug ผ่าน Wirless เปิดโทรศัพท์ไปที่ Settings > Additional Setting > Developer options > Wireless debugging > Pair device with QR code
- กลับมาที่ Android Studio ตรง Runnings devices เลือก Pair Devices Using Wi-Fi (ต้องใช้ Wi-Fi อันเดียวกัน) เลือก Pair using QR code แล้ว Scan จากโทรศัพท์ได้เลย ถ้าเชื่อมต่อกันสำเร็จ จะแสดงข้อความว่าสำเร็จ และมีชื่อรุ่นโทรศัพท์ของเราใน Android Studio กด Debug ได้เลย
- ถ้าโทรศัพท์เรายังไม่มี Application ก็จะมี Popup สอบถามว่าเราจะ Install หรือไม่ ให้เลือก Install
- ต้องไปตั้งค่าเพื่อให้ Japter เข้าถึงการแจ้งเตือนได้ และกำหนดให้ทำงานตลอดเวลา ไปที่ Settings > Apps > Manage apps > Japter
App info | Other permissions |
---|---|
- เมื่อเราลง Japter เรียบร้อยแล้ว ต้อง Setup publicKey ก่อน เพื่อใช้ในการเข้ารหัสเมื่อส่งข้อมูลไปยัง Jasistant ผมทำตาม Document ที่คุณ dtinth เขียนไว้ ต้อง Setup ด้วยกัน 2 ที่
Jasistant
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 ในโทรศัพท์ของเราได้เลย