เมื่อวันที่ 10 เมษายน 2563 ได้มีการเปิดตัวแอพ หมอชนะ เพื่อเก็บประวัติการเดินทางของประชาชน และประเมินว่าบริเวณนั้นมีผู้ป่วย COVID-19 หรือไม่ ผมจึงทำการตรวจสอบว่ามีการส่งข้อมูลอะไรบ้างไปยัง Server
วิธีการตรวจสอบเบื้องต้นคือการทำ Man In The Middle (MITM)
โดยมีการเรียก API ต่างๆดังนี้
1. /registerDevice
โดยมีการส่งข้อมูลเป็น JSON ดังนี้
Request:
{"deviceId":"XXXXXXXXXX"}
โดยค่าใน deviceId น่าจะเป็นค่า hash จากอะไรบางอย่าง
Response:
{"userId":"XXXXXXXXXX","anonymousId":"XXXXXXXXXX"}
2. /userdata
มีการเรียกใช้เมื่อทำแบบทดสอบ
Request:
{"data":{"questionaire":{"one_uri_symp":["none"],"travel_risk_country":false,"covid19_contact":["none"],"int_contact":false}}}
3. /qr
เรียกเพื่อโหลด QRCode ของเรา โดยมีการส่ง anonymousId แนบไปกับ header ด้วย
4. /location
อันนี้จะส่งข้อมูลพิกัดที่เราอยู่ไปยัง Server
Request:
{"locations":[{"is_moving":false,"uuid":"XXXX","timestamp":"2020-04-11T10:50:50.482Z","odometer":0,"coords":{"latitude":13,"longitude":100,"accuracy":25.9,"speed":-1,"heading":-1,"altitude":-23.5},"activity":{"type":"still","confidence":100},"battery":{"is_charging":true,"level":0.38},"extras":{"triggerType":"appState"}}]}
5. /scan
หากพบ device อื่นๆผ่าน Bluetooth หรือการ scan QRCode ก็จะส่ง API อันนี้
{"meetId":"XXXX","timestamp":"2020-04-11T11:06:53.777Z","meetWithIds":["XXXX"],"location":{"latitude":13,"longitude":100,"accuracy":24.2},"type":"bluetooth"}
6. https://raw.githubusercontent.com/codeforpublic/morchana-core/master/available
เป็น API Kill-Switch เอาไว้เมื่อเลิกเก็บข้อมูลผู้ใช้แล้ว ก็จะใช้งานแอพไมไ่ด้ ชอบตรงที่เก็บไว้บน Github
สรุป
- ไม่พบว่ามีการส่งรูปที่เราถ่ายขึ้นไปยังบน Server
- ไม่พบว่ามีการส่งข้อมูลอื่นๆนอกเหนือจากที่ประกาศไว้
- งั้นเรามาใช้แอพ หมอชนะ กันเถอะ
Appstore: https://apps.apple.com/th/app/allthaialert/id1505185420
Play Store: https://play.google.com/store/apps/details?id=com.thaialert.app
เราสามารถเปลี่ยนมือถือ Android ของเราให้เป็น Webcam ง่ายๆได้ด้วยโปรแกรมที่ชื่อว่า DroidCam โดยในตัวอย่างการติดตั้งผมจะทำบนเครื่อง PC ที่ติดตั้งระบบปฏิบัติการ Ubuntu 18.04 สำหรับบน Windows ก็น่าจะติดตั้งคล้ายๆกัน
สิ่งที่ต้องการ
- โทรศัพท์มือ Android
- เครื่องคอมพิวเตอร์
- ระบบ Network
1. ติดตั้ง App บนมือถือ
สามารถ Download ผ่าน Playstore ได้ที่
https://play.google.com/store/apps/details?id=com.dev47apps.droidcam&hl=th
2. ติดตั้งโปรแกรมที่เครื่องคอม
สามารถ Download โปรแกรมได้ที่
https://www.dev47apps.com/
มีทั้ง Windows และ Linux
เปิด terminal รันคำสั่งดังนี้
sudo apt install linux-headers-`uname -r`
cd tmp
wget https://www.dev47apps.com/files/linux/droidcam_latest.zip
unzip droidcam_latest.zip -d droidcam && cd droidcam
sudo ./install
ดูว่าติดตั้งสำเร็จไหมด้วยคำสั่ง
lsmod | grep v4l2loopback_dc
3. เชื่อมต่อ Droidcam PC กับ มือถือ
PC กับ มือถือ ต้องอยู่ใน Wifi network เดียวกัน
เปิดโปรแกรมบน terminal ด้วยคำสั่ง
droidcam
- เปิดโปรแกรม Droidcam บน Android เพื่อดู IP Address
- นำ Wifi IP: มาใส่ในโปรแกรม Droidcam บนเครื่องคอม แล้วกด Connect
เสร็จสิ้นเรียบร้อย
ทดสอบ
import time
for i in range(10):
print('Hello World')
time.sleep(1)
วันนี้จะเป็นบันทึกการทดลองเล่น Circle CI โดยจะให้เจ้า Circle CI นั้นเชื่อมต่อกับ Gtihub ในการรัน Test ซึ่ง Circle CI ก็จะมี Plan ต่างๆดังนี้ https://circleci.com/pricing/ ในที่นี้เราก็จะใช้ Free Plan
สิ่งที่ต้องการ
- Github Public Repo ที่มี Test อยู่แล้ว (ถ้าไม่มีก็เริ่มเขียน Test ซะตั้งแต่วันนี้)
- Circle CI (แค่ Login ด้วย Github User)
ทำการ Setup Project กับ Circle CI
- ทำการเพิ่ม Project ในเวป Circle CI จากเมนู Add Project ทางด้านซ้าย
- เลือก Operating System และ Platform ในที่นี้จะใช้เป็น Linux และ Platform version 2.0 (version 2.0 เราสามารถใช้ Docker image ในการรันได้)
- เลือก ภาษา ที่ใช้ ในที่นี้ผมลองใช้ Python ในการรัน
- เมื่อเลื่อนลงมาด้านล่างจะมีคำแนะนำให้สร้าง Folder .circleci และ ไฟล์ config.yml โดยจะมี Config เบื้องต้นให้เรานำไปใส่ในไฟล์ config.yml ได้เลย
- โดยผมมีการปรับแก้เล็กน้อยตรงคำสั่งในการรัน Test โดยผมแก้เป็น
python -m unittest discover ./tests/
ตัวอย่างไฟล์ .circleci/config.yaml
- ทำการ commit และ Push
- กดปุ่ม Start Building ใน Circle CI
- ระบบ Circle CI ก็จะทำการ Setup Envoriment และตั้งค่าต่างๆตาม config.yaml ของเรา เมื่อมาดู Result ในการ run test ก็จะเห็นว่าสำเร็จเรียบร้อยดี
- เมื่อเรามีการแก้ไข code ของเราและ Push code เข้าไปใน github ระบบก็จะทำ Build และ Test ให้อัตโนมัติ พร้อมมี Email แจ้งเตือนอย่างสวยงาม
เป็นอันเสร็จสิ้นการทดลองเล่น Circle CI ในเบื้องต้น
เราสามารถนำ Badge การ Build & Test มาแปะในหน้าเวปของเราได้โดยเข้าไปที่ Setting ของ Project ใน Circle CI และเลือก Status Badges
สรุป
Ref:
วันนี้จะมาแนะนำการส่ง Notification ผ่าน Line Notify ด้วยภาษา PHP กันครับ
โดย Line Notify นั้นมีความสามารถดังนี้
- ส่ง Notification มายังตัวเราเอง
- ส่ง Notification ไปยัง Line Group ที่เราอยู่ (เราต้องเพิ่ม Line Notify เข้ามาใน Line Group นั้นด้วย)
- ส่ง ข้อความ Text, รูปภาพ และ Sticker ได้
Add Line Notify เป็นเพื่อนเราก่อน
ก่อนอื่นเราต้องแอด Line Notify มาเป็นเพื่อนเราก่อน โดยค้นหาคำว่า Line Notify แล้วแอดเป็นเพื่อนดังภาพ
สร้าง Token สำหรับการ Notify
- เลื่อนลงมาด้านล่างคลิกที่ Generate Token
 |
| คลิก Generate token |
- ให้เราตั้งชื่อ Notify (ชื่อนี้จะไปแสดงตอนส่งข้อความ)
 |
| เลือกตัวเราเองหรือ Line Group ที่ต้องการ |
1-on-1 chat with LINE Notify คือจะส่งข้อความมาหาตัวเราเอง
นอกนั้นจะเป็น List ของ Line Group ที่เราอยู่ หากต้องการให้ส่งเข้า Line Group เราต้อง Invite Line Notify เข้าไปใน Line Group นั้นด้วย
- คลิก Generate token เราก็จะได้ Token เอาไว้ในการส่ง Notify ให้เราเซฟไว้ให้ดี เพราะเราจะเห็น Token อันนี้เพียงครั้งเดียว
 |
| Token จะแสดงใน Popup นี้เพียงครั้งเดียวเท่านั้น |
ส่ง Notification ด้วย PHP
- PHP 5.5+
เริ่มกันเลย
- โหลด Library ผ่าน composer
composer require kittinan/php-line-notify
- ทดสอบส่ง Text Message ตาม Code ด้านล่าง
- ข้อความก็จะถูกส่งไปยังตัวเราหรือ Line Group ที่เรา Generate Token มา
- ทดลองส่งรูปภาพ ตาม Code ด้านล่าง
- รูปภาพก็จะถูกส่งไปยังตัวเราหรือ Line Group ที่เรา Generate Token มา
จบแล้วค้าบบ
ปล. ไว้มีเวลาจะอัพเดท Library ให้สามารถส่ง Sticker ได้นะครับ
ปล. API Line Notify มี Rate Limit อยู่นะครับ โดย Rate Limit จะอยู่ที่ 1,000 ต่อชั่วโมง
ช่วงนี้แอพ QuizClash กำลังเป็นที่นิยมในหมู่เพื่อนฝูงจึงได้มีโอกาสโหลดมาเล่นบ้าง ด้วยความบังเอิญขณะนั่งทำ MITM โทรศัพท์ตัวเองอยู่เพื่อที่จะดูว่าแอพ Facebook มันยังใช้ Certificate Pinning อยู่รึเปล่า ปรากฎว่าแอพ Facebook ยังใช้ Certificate Pinning อยู่ แต่มีบางโดเมนที่ไม่ได้ใช้ (Facebook เริ่มใช้ Certificate Pinning ประมาณเดือนตุลาคมปี 2015) ซึ่งขณะที่นั่งทำ MITM อยู่ก็ได้กดเข้าไปเล่นเกมส์ QuizClash และก็ได้พบอะไรบางอย่างเกิดขึ้น . . .
ย้อนกลับไปเมื่อตอนโหลดแอพ QuizClash มาเล่นในทีแรกก็เกิดข้อสงสัยคือทำไมแอพมันโคตรใหญ่จังเลยวะ
Android ~58 MB
IOS ~99 MB
ในทีแรกก็คิดว่ามันคงยัดพวกคำถามกับพวกรูปภาพลงไปในแอพเลย ปรากฎว่าไม่ใช่ มันโหลดคำถามและรูปภาพจาก Network ดังภาพ
จากภาพก็จะเห็นว่ามีการใช้ Facebook SDK สำหรับการ Login (เพราะผม Login ด้วย Facebook ในการเล่น)
ตัวเกมส์ก็จะทำการ Login ด้วย Token ของตัวเองด้วยดังภาพ
ที่น่าสนใจคือมีการใช้ HMAC ด้วย น่าจะใช้สำหรับเชคความถูกต้อง Request พูดถึง HMAC แล้วก็คิดถึง Ragnarok
และที่น่าสนใจที่สุดคือ Request นี้
มันคือ Request ในการโหลดคำถามและคำตอบของเกมส์ที่เราเล่นกับเพื่อนคนใดคนหนึ่ง ซึ่ง Response เป็น JSON มีขนาดประมาณ 75KB ตัวอย่าง JSON ก็ดังภาพด้านล่าง
ซึ่งคำถาม - คำตอบจะไม่มีการเปลี่ยนแปลง ถ้าได้ JSON ไฟล์นี้มาก็จะสามารถตอบคำถามได้ทุกข้อล่ะ 555+
ส่วนแอพที่มีขนาดใหญ่นั้นเมื่อได้ลองแกะดูเบื้องต้นน่าจะมาจาก Resource ไฟล์ภาพนั่นเอง ซึ่งตัวแอพ support หลาย locale เลยต้องมีภาพเยอะตามแต่ละ locale ไปด้วย
จบแล้วครับ
ปล. เพื่อการศึกษาเท่านั้น