ปลด Rich Menu ของ Followers ทั้งหมดด้วย Python

Thachaparn Bunditlurdruk
incubate.co.th
Published in
3 min readAug 11, 2020

--

บทความนี้เราจะมาลองเขียน HTTP request ใน Python เพื่อปลด Rich Menu ทุกรูปแบบของเพื่อนทั้งหมดใน OA ของเรากันค่า

เริ่มแรก ขออนุญาตเท้าความกันก่อนว่า Rich Menu มี 3 ระดับ

  1. Per-user rich menu ที่ผูกกับผู้ใช้เฉพาะบัญชี แต่ละคนอาจไม่เหมือนกัน
  2. Default rich menu ที่ทุกคนมีเหมือนกัน และตั้งค่าโดยใช้ Messaging API
  3. Default rich menu ที่ทุกคนมีเหมือนกัน และตั้งค่าโดยใช้ LINE Official Account Manager

ในบทความนี้เราจะสอนวิธีปลด Default rich Menu ก่อน แล้วตามมาด้วยการปลด Per-user rich menu กัน

3..2..1.. พร้อมแล้ว เริ่ม !

I. ปลด Default Rich Menu

วิธีนี้จะเป็นวิธีปลด Rich Menu พื้นฐานไม่ว่าจะตั้งค่ามาด้วยช่องทางใด และ token ที่เราต้องใช้ก็มีแค่ Channel Access Token เท่านั้น

ใครจำไม่ได้ว่าไปดึงมาจากไหน สามารถอ่านได้ที่บทความ “Channel Access Token ของ Line เอามาจากที่ไหนได้บ้างเนี่ย

ก่อนอื่นมาดูรายละเอียดสำหรับการใช้ API กันก่อน

# HTTP Request
DELETE https://api.line.me/v2/bot/user/all/richmenu
# Headers
Authorization: Bearer {Channel Access Token}

ทีนี้เราก็นำรายละเอียดด้านบนมาเขียนด้วย Python โดยใช้ requests library กัน

ถ้าสำเร็จ เราจะได้ผลลัพธ์แบบนี้

status_code: <Response [202]>
response object: {}

จบแล้ววิธีการปลด default rich menu ด้วย Python ที่นิดเดียวพอ ๆ กับใช้โปรแกรม Postman เลย แต่… ถึงแม้เราจะลบ default rich menu ออกแล้ว แต่สำหรับเพื่อนคนไหนที่ใช้ Rich Menu แบบผูกเฉพาะผู้ใช้ ในหน้าแชทของเขาก็จะยังมี Rich Menu อยู่ ถ้าเราอยากจะเอาออกให้หมดก็มาดูวิธีถัดไปกันเลย

II. ปลด Per-user Rich Menu

วิธีนี้นอกจาก Channel Access Token แล้ว เรายังต้องใช้ User ID ด้วย ดังนั้น ขั้นตอนหลัก ๆ มีอยู่แค่ 2 ขั้นตอนเท่านั้น

  1. ดึง User ID ทั้งหมด
  2. ปลด Rich Menu ID ที่ผูกอยู่กับผู้ใช้แต่ละคน

1. ดึง User ID ทั้งหมด

ก่อนอื่นเราต้องแยกก่อนว่า User ID ของเพื่อนที่ติดตาม OA ของเรามีหน้าตาเป็นตัวหนังสือผสมเลขยาวๆ ขึ้นต้นด้วยตัว Uไม่ใช่ LINE ID ที่เอาไว้ใช้เวลาเพิ่มเพื่อนนะ

✔️ U56s4484s648fsd6486fsdf66486fge458

✖️ incubate123456

ถ้าเข้าใจตรงกันแล้ว เราก็มาดูวิธีการดึง User ID ด้วย LINE API กัน

สำหรับใครที่ไม่ใช่โล่น้ำเงิน (Verified account) หรือโล่เขียว (Premium Account) สามารถไปตามดักจับ User ID ได้ตอนผู้ใช้เปิด LIFF แต่ในบทความนี้เราจะมาใช้ LINE API ของโล่น้ำเงินดึงแทน บางคนอาจจะเคยอ่านบทความ “อยากได้ UserIds ของเพื่อนใน Line OA ทำยังไงดีนะ” กันไปแล้ว ซึ่งในบทความนั้นจะเป็นการสร้างปุ่มดึง ID จากการใช้ Google App Script ใน Google Spreadsheet โดยใช้ API endpoint เดียวกับบทความนี้เลย ถ้าใครสนใจก็ไปแวะเวียนกันได้ค่ะ

หลังจากพักชมโฆษณา กลับมาที่บทความนี้ที่เราจะใช้ Python ในการดึงแทน เพราะเราจะต้องนำ User ID ที่ดึงมาไปใช้เป็นพารามิเตอร์ในขั้นตอนต่อไป

รายละเอียดสำหรับการใช้ API

# HTTP Request
GET https://api.line.me/v2/bot/followers/ids
# Headers
Authorization: Bearer {Channel Access Token}
Content-Type: application/json
# Parameters
start: value ของ 'next' key ที่ได้จาก Response Object (Optional)

Response Object

{'userIds': ['U299XXXXXXXXXXXXXXXXXXXXXXXXXXX50',
'U2aXXXXXXXXXXXXXXXXXXXXXXXXXXX5d',
...
'Ud2XXXXXXXXXXXXXXXXXXXXXXXXXXX36',
'UdcXXXXXXXXXXXXXXXXXXXXXXXXXXXe7'],
'next': '9CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYk'}

อธิบายโค๊ด

  1. ยิง request ไปเอา UserIds ก้อนแรก โดยใช้ requests.get()
    (ถ้า OA มีเพื่อนเกิน 300 คน ก็จะได้ ‘Next’ key มาใน Response Object ด้วย)
  2. พาร์ส Response Object ที่อยู่ในรูป JSON
  3. เก็บ User ID เข้าลิสท์ที่เตรียมไว้
  4. ถ้ามีคีย์ ‘next’ ใน Response Object ก็ให้ทำข้อ 1–3 ไปเรื่อย ๆ แต่การยิง request ใน while loop จะต่างจากข้อ 1 ตรงที่เราต้องเอา value ของคีย์ ‘next’ ไปอัพเดทลงใน value ของคีย์ ‘start’ ใน request parameter เพื่อไปดึง User ID กลุ่มถัดไป

2. ปลด Rich Menu ID ที่ผูกอยู่กับผู้ใช้แต่ละคน

หลังจากที่เราได้ User ID มาแล้ว เราก็จะนำ User ID เหล่านี้มาเป็นพารามิเตอร์ เพื่อบอกว่าเราจะปลด Rich Menu ของผู้ใช้คนไหนบ้าง โดยไม่สนว่าผู้ใช้คนนั้นจะใช้ Rich Menu ID ตัวไหน

รายละเอียดสำหรับการใช้ API

# HTTP Request
POST https://api.line.me/v2/bot/followers/ids
# Headers
Authorization: Bearer {Channel Access Token}
Content-Type: application/json
# Body
userIds: ลิสท์ของ User ID (สูงสุดไม่เกิน 500 User IDs)

พารามิเตอร์ของฟังก์ชั่น

  • channel access token เจ้าเดิม
  • user ID จากขั้นตอนก่อนหน้า

ผลลัพธ์

status_code: <Response [202]>
response object: {}

อธิบายโค๊ด

  1. แบ่ง User ID ที่เราได้มาในขั้นตอนที่แล้วออกเป็นก้อนละ 500 User IDs
  2. ยิง POST request จากฟังก์ชั่น unlinkRichMenuMulti()
    ***สิ่งที่ต้องระวังคือ Body request ที่เราใส่ User ID ต้องอยู่ในรูป JSON ดังนั้นเราจึงต้องใช้ฟังก์ชั่น json.dump() ในการแปลง dictionary ก่อน***
  3. ตรวจสอบว่าปลด Rich Menu สำเร็จหรือไม่ โดย status code ต้องเท่ากับ 202
    (หรือตรวจซ้ำโดยการยิง API ไปขอ Rich Menu ID ของ User ID หนึ่ง ถ้าได้ Response 404 แปลว่า User ID นั้นไม่มี Rich Menu ID อยู่ แสดงว่าเราปลด Rich Menu สำเร็จแล้ว)

ถ้าปลดทั้งสองวิธีแล้ว ตอนนี้ Rich Menu ก็ไม่หลงเหลือในหน้าห้องแชทของเพื่อนทุกคนแล้ว //ปรบมือออ 👏 👏 👏

⚠️⚠️⚠️ส่งท้าย ขอแอบกระซิบคำเตือนว่า LINE เขาก็มีลิมิตไม่ให้เราส่ง request 3 ตัวนี้เกิน 100,000 ครั้งต่อนาทีนะ ใครเพื่อนเยอะ ก็อย่าลืมตั้ง rate limit ก่อนยิงนะคะ

Reference:

--

--

Thachaparn Bunditlurdruk
incubate.co.th

An Arts graduate who’s trying to challenge herself with programming