งานที่ 8

 

NodeMCU ESP8266 ESP32 IoT 30 วัน 30 โปรเจค วันที่ 2 ทำเครื่องนับยอด Like Facebook Fanpage

3 ปีที่ผ่านมา
 
โดย เจ้าของร้าน

NodeMCU ESP8266 IoT 30 วัน 30 โปรเจค
บทความในชุดนี้เป็นบทความต่อเนื่องที่จะให้ผู้อ่านได้ทดลองเรียนรู้ IoT ไปพร้อมๆกันการทำ Project วันล่ะโปรเจคไปเรื่อยๆ โดยเรียนรู้จากการได้ทดลองทำจริง (learning on the job) เขียนโปรแกรม ต่อวงจร ง่ายๆไม่ยุ่งยาก สามารถนำไปประยุกต์ใช้งานต่อได้ โดยเนื้อหาจะมีเรื่อยๆจนครบ 30 บทความ เหมาะสำหรับคนที่อยากเรียนรู้ IoT ด้วยตนเอง สามารถติดตามรายละเอียดได้จากหน้าร้านและทาง Fanpage Facebook fb.com/mosfexนะครับ



วันนี้เราจะมาทำ เครื่องแสดงไลค์ Fanpage Facebook กัน โดยหลักการไอ้เครื่องนี้ง่ายมาก มันจะเชื่อมต่อ WiFi จากนั้นก็เข้าไปที่ Fanpage ที่เราตั้งค่าไว้แล้วไปดึึงเอาตัวเลขของ ยอดไลค์ปัจจุบันและเลขที่คนพูดถึง (Talk about) มาแสดงให้เราดู เชื่อมต่อไปทุกๆ 1 วินาที ดังนั้นมันจึงแสดงผลแบบ Real Time เลยแหละ พอมีคนกดก็เปลี่ยนตัวเลขที่แสดงทันที และที่สำคัญคือไม่ต้องใช้ api ไม่ต้องสมัครสมาชิกอะไรเลย ง่ายไหมหล่ะ มาลองดูกันเลย

1.อันดับแรกก็ต้องเตรียมอุปกรณ์กันก่อนเลย 
1. NodeMCU       https://www.mosfex.com/product/38/
2. LCD 16x2 I2C   https://www.mosfex.com/product/18/
3. สายแพ เมีย-เมีย https://www.mosfex.com/product/60/


2. จากนั้นก็เริ่มต่อสายตาม Diagram นี้เลย ระวังอย่าต่อผิด หรือต่อไฟกลับขั้วนะ



3. จากนั้นเราจะมาลง Library จอแสดงผลกัน 






แล้วก็ไป Download โค้ดมา
โดยเข้าไปที่ https://github.com/mosfex/FacebookFanpageLikeCounter/blob/master/FacebookLikeCounter.ino
ก็อปมาเลยตั้งแต่บรรทัดแรกไปจนถึงสุดท้าย (86)
พอก็อปปี้โค้ดที่ต้องใช้มาหมดแล้วก็มาลองดูโค้ดกันเลย 

ช่วงโค้ดตรงนี้สำหรับ include library ที่เราจะใช้มา

#include
#include
#include
#include
#include

---------------------------------------------------------

LiquidCrystal_I2C lcd(0x3F,16,2);
ตรงในส่วนนี้คือ เราจะใช้เชื่อมต่อจอไปที่ 0x3F และเป็นจอ 16x2 บางครั้ง จอบางรุ่นจะมี Address เป็น 0x2F 

--------------------------------------

const char* ssid = "mosfex.com";                //ตั้งค่า WiFi ตรงนี้นะ
const char* password = "123456789";         //ตั้งค่า password WiFi
String page_url = "mosfex";                       //ตั้งค่า panpage @account ตรงนี้นะ เช่น fb.com/mosfex 
const char* host = "mbasic.facebook.com";  //ตรงนี้เป็นส่วนของ host ที่เชื่อมต่อ 
const char* fingerprint = "93:6F:91:2B:AF:AD:21:6F:A5:15:25:6E:57:2C:DC:35:A1:45:1A:A5";

--------------------------------------
จากนั้นมาดู function 
String ProcessLikes() ส่วนนี้เป็น function ที่ดึงค่า like มาแสดงหล่ะ
--------------------------------------

  WiFiClientSecure client;  <<<< ตรงนี้เป็นตัวเชื่อมต่อ https กับ server เป้าหมาย
---------
  if (!client.connect(host, 443)) { Serial.println("connection failed"); return ""; }
เนี่ยเชื่อมต่อไปยัง https port 443 ปลายทางอยู่ที่ mbasic.facebook.com
---------
  client.verify(fingerprint, host); // ทำการ verify host ว่า finger print ตรงกันหรือไม่
  String url = "/"+page_url+"/community?locale=en_US";  // ตรงนี้คือปลายทางที่เราจะไปดูดข้อมูลมา
หากเราไปเปิดดู https://mbasic.facebook.com/mosfex/community?local=en_US
เราจะเห็นว่าตัวเลข like ซ่อนอยู่
-----------------
ส่วนตรงนี้คือส่วนที่จะทำให้ NodeMCU ไปดึึงข้อมูลมานั่นเอง

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +               
               "User-Agent: ESP8266\r\n" +
               "Connection: close\r\n\r\n");
-----------------
ส่วนนี้เป็นต้นไปคือ ส่วนของ การสกัดเอาตัวเลข Like และ Talk about มา โดยมันจะอยู่ในส่วนของ Tag description ของ html facebook เมื่อได้แล้วจะเก็บเอาไว้ในตัวแปร like และก็ talk 

  while (client.connected()) {
    String line = client.readStringUntil('>');
    if(line.startsWith("
      int st = line.indexOf(".")+2;
      int sp = line.indexOf("likes",st)-1;
      int st2 = sp + 14;
      int sp2 = line.indexOf("talking",st2)-1;
      String like = line.substring(st,sp);
      String talk = line.substring(st2,sp2);

-----------------
จากนั้นก็แสดงผล 

      lcd.setCursor(4,1);
      lcd.print(like);               แสดงยอด Like ทางหน้าจอ
      lcd.write((uint8_t)6);     แสดง icon รูป Like (อาจจะไม่เหมือนหน่อย ทำเองเนอะ)
      lcd.write((uint8_t)7);     แสดง icon รูป Like 
      lcd.print(" "+talk);         แสดงยอด Talk about ออกหน้าจอ
      lcd.write(0b00100011);  แสดง # 
------------------

ส่วนตรงนี้คืออัขระพิเศษ ที่ใช้แสดงเป็นรูป logo facebook แล้วก็ icon Like 

byte logo[8][8] = {
  {0x07,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F},
  {0x1F,0x1F,0x1E,0x1C .....

-------------------
ก็ประมาณนี้แหละ ที่สำคัญนะ 
กลับมาทำกันต่อ

4.





5. จากนั้นก็ไปต่อยาวๆเลย


6. เลือกพอร์ต

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ESP8266 ควบคุมเว็ป(NodeMCU ESP8266 เชื่อมต่อ DHT11 เซ็นเซอร์วัดอุณหภูมิและความชื้น แสดงค่าผ่าน wifi web server)