เขียน Python CLI คุย REST API จัดการข้อมูลง่ายๆ

สวัสดีครับ วันนี้ผมจะมาเล่าเรื่องการทำ CLI ด้วย Python ให้เพื่อนๆฟังนะครับ คือบางทีเราอยากได้ข้อมูลจาก API มาดูแบบง่ายๆ ไม่ต้องเปิด Browser หรือ Postman ใช่ไหมครับ แบบนี้เราทำ CLI เล็กๆไว้ดึงข้อมูลแล้วก็เอามาปรับแต่งแสดงผลให้มันดูง่ายๆได้นะครับ เหมาะกับมือใหม่เลย

1. เริ่มจากดึงข้อมูล REST API กันก่อน

แน่นอนว่า Python มันมี library ดีๆ อย่าง requests อยู่แล้วครับ คือใช้ง่ายมากๆเลย ผมจะลองยกตัวอย่าง ดึงข้อมูลจาก Public API ง่ายๆ อย่าง JSONPlaceholder นะครับ

import requests

# ลองดึงโพสต์แรกมาดูครับ
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
post_data = response.json()

print("ข้อมูลโพสต์แรก:")
print(post_data)

จากนั้น ลองคิดว่าเราอยากได้แค่ title กับ body มาแสดงนะครับ เราก็ทำแบบนี้ได้เลย

print(f"Title: {post_data['title'].upper()}") # ลองให้เป็นตัวใหญ่หมด
print(f"Body: {post_data['body'].split('\
')[0]}...") # เอาแค่บรรทัดแรก

2. ทำเป็น CLI ด้วย argparse

คือเราไม่อยากแก้โค้ดทุกครั้งที่อยากเปลี่ยน ID ของโพสต์ใช่ไหมครับ เราก็เอา argparse มาช่วยได้เลยครับ ให้เราสามารถรับค่าจาก command line ได้ง่ายๆ นะครับ

import argparse

parser = argparse.ArgumentParser(description='ดึงข้อมูลโพสต์จาก JSONPlaceholder API.')
parser.add_argument('post_id', type=int, help='ID ของโพสต์ที่ต้องการดึง')

args = parser.parse_args()

# ตรงนี้ก็จะเอา post_id ไปใช้ได้เลย
print(f"กำลังดึงโพสต์ ID: {args.post_id}")

3. รวมร่าง API กับ CLI และ String Manipulation

คราวนี้เราจะเอามารวมกันนะครับ แบบว่า ดึงมาแล้วก็เอา title มาแปลงเป็นตัวใหญ่หมด แล้วก็ body เอาแค่บรรทัดแรกมาแสดง แบบนี้นะครับ

# post_reader.py
import requests
import argparse

def get_post_data(post_id):
    url = f'https://jsonplaceholder.typicode.com/posts/{post_id}'
    try:
        response = requests.get(url, timeout=5) # ใส่ timeout ไว้ด้วยก็ดีนะครับ
        response.raise_for_status() # ถ้ามี error จาก HTTP ก็แจ้งด้วย
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"มีปัญหาตอนดึงข้อมูล: {e}")
        return None

def main():
    parser = argparse.ArgumentParser(description='ดึงข้อมูลโพสต์จาก JSONPlaceholder API แล้วแสดงผลแบบง่ายๆ')
    parser.add_argument('post_id', type=int, help='ID ของโพสต์ที่ต้องการดึง')

    args = parser.parse_args()

    post = get_post_data(args.post_id)

    if post:
        print(f"Title: {post['title'].upper()}") # แปลงเป็นตัวพิมพ์ใหญ่หมด

        # ตัด body ให้เหลือแค่ประโยคแรก หรือประมาณ 100 ตัวอักษร แล้วค่อยเติม ... นะครับ
        body_content = post['body'].replace('\
', ' ')
        if len(body_content) > 100:
            display_body = body_content[:100] + '...'
        else:
            display_body = body_content

        print(f"Body: {display_body}")
    else:
        print("ไม่พบข้อมูล หรือมีข้อผิดพลาดเกิดขึ้น")

if __name__ == '__main__':
    main()

วิธีใช้งาน:

python post_reader.py 1
python post_reader.py 5

จะเห็นว่าเราได้ CLI ง่ายๆ ที่ใช้ดึงข้อมูลจาก REST API มาแล้วก็จัดฟอร์แมตข้อมูลด้วย string manipulation ครับ คือมันง่ายมากๆ เลยใช่ไหมครับ เพื่อนๆ ก็ลองเอาไปปรับใช้กับ API อื่นๆ ได้เลยนะครับ

หวังว่าบทความนี้จะเป็นประโยชน์กับมือใหม่ทุกคนนะครับ

ขอบคุณครับ

Read more

ดราม่า "เบิร์ด วันว่างๆ" กับยาแนว: บทเรียนสำคัญของอินฟลูเอนเซอร์และความปลอดภัยบนโซเชียล

ดราม่า "เบิร์ด วันว่างๆ" กับยาแนว: บทเรียนสำคัญของอินฟลูเอนเซอร์และความปลอดภัยบนโซเชียล

เจาะลึกดราม่า "เบิร์ด วันว่างๆ" ใช้ยาแนวเล่นสงกรานต์ คำชี้แจง และผลกระทบต่อสังคม บทเรียนสำคัญสำหรับความรับผิดชอบของอินฟลูเอนเซอร์

By ทีมงาน devdog
Xiaomi 17T หลุดสเปคเด็ดบน Geekbench! ยืนยัน Dimensity 8500 พร้อมแบต 7,000mAh จ่อเปิดตัว

Xiaomi 17T หลุดสเปคเด็ดบน Geekbench! ยืนยัน Dimensity 8500 พร้อมแบต 7,000mAh จ่อเปิดตัว

Xiaomi 17T เตรียมเปิดตัว! พบข้อมูลบน Geekbench ยืนยันใช้ชิป Dimensity 8500 พร้อมแบตเตอรี่จุใจ 7,000mAh คาดบุกตลาดรองเรือธงเร็วๆ นี้

By ทีมงาน devdog
กยศ. เปิดทางรอด! ปรับโครงสร้างหนี้ออนไลน์ หยุดถูกฟ้อง ก่อน 5 ก.ค. 69

กยศ. เปิดทางรอด! ปรับโครงสร้างหนี้ออนไลน์ หยุดถูกฟ้อง ก่อน 5 ก.ค. 69

ผู้กู้ กยศ. กว่า 1 แสนราย เสี่ยงถูกฟ้อง! รีบปรับโครงสร้างหนี้ออนไลน์ผ่านเป๋าตัง/ThaID ก่อน 5 ก.ค. 69 รับสิทธิประโยชน์ ลดดอกเบี้ย หลีกเลี่ยงคดีความ

By ทีมงาน devdog
Baseus MC2: หูฟังคลิปหนีบหูสุดล้ำ แบตอึด 60 ชม. เสียง LDAC กันน้ำ IP67 เพื่ออิสระทางเสียงของคุณ

Baseus MC2: หูฟังคลิปหนีบหูสุดล้ำ แบตอึด 60 ชม. เสียง LDAC กันน้ำ IP67 เพื่ออิสระทางเสียงของคุณ

พบ Baseus MC2 หูฟังคลิปหนีบหูดีไซน์ล้ำ สวมใส่สบายตลอดวัน ด้วยแบตเตอรี่ 60 ชม., กันน้ำ IP67, เสียง LDAC ระดับ Hi-Res และราคาเข้าถึงง่าย

By ทีมงาน devdog