[เขียนโค้ด] เขียน API เซฟรูปแมวเหมียวด้วย Requests Library!
เราจะมาเข้าใจการใช้ Requests ด้วยวิธีง่ายๆ ด้วยการทำเรื่องง่ายๆ อย่างเช่นตัวอย่างที่จะอธิบายต่อไปนี้ คือการดึงรูปมาเซฟ นั่นเอง
เริ่มต้นเลย! เรามีเว็บไซต์ง่ายๆ http://placekitten.com/ ที่เพียงแค่ใส่ image size ใน URL ก็สามารถได้รูปแมวเหมียวขึ้นมา
เช่น http://placekitten.com/g/300/200

นั่นคือ กว้าง 300 px, สูง 200 px
สิ่งต่อไปคือ เราจะเซฟรูปยังไงนะ?
คีย์ลัดของเราคือ Requests Library
Requests คืออะไร?
Requests คือ HTTP Library ตัวหนึ่งที่เขียนด้วยภาษา Python (for human beings เป็นมิตรกับสุขภาพจิต) ให้เราส่ง HTTP/1.1 request ไปได้ (https://github.com/kennethreitz/requests)
ตัวอย่างการใช้ requests เช่น
>>> import requests
>>> r = requests.get(‘https://api.github.com/user’, auth=(‘user’, ‘pass’))
>>> r.status_code
200
>>> r.headers[‘content-type’]
‘application/json; charset=utf8’
>>> r.encoding
‘utf-8’
>>> r.text
u'{“type”:”User”…’
>>> r.json()
{u’private_gists’: 419, u’total_private_repos’: 77, …}
เริ่มต้นด้วยการ install package นี้เข้าเครื่อง
ด้วยคำสั่ง
$ pip install requests
หรือจะ clone มาโดยตรงจากผู้สร้างก็ได้
$ git clone git://github.com/kennethreitz/requests.git
จากนั้นเราก็เริ่มโค้ดกันได้เลย!
เริ่มต้น ทำกรอบง่ายๆด้วยการสร้าง class และแบ่งเป็นคอนเซปง่ายๆดังนี้
import requests
class Kitten():
// 1. ทำ url ให้สมบูรณ์ : การที่เราจะดึงข้อมูลจาก placekitten ได้ เราจะต้องรู้ที่อยู่ (url) ของไฟล์ที่เราต้องการจะเซฟก่อน โดยการป้อนwidth และ height เข้าไป
// 2. เขียน request เพื่อที่จะดึงข้อมูลนั้น
// 3. นำข้อมูลที่ดึงมา เขียนลงไฟล์ที่เราสร้างขึ้นมาในเครื่อง (เซฟรูป)
- เราต้องการจะทำให้ได้รูปตามที่ความยาวและความกว้างที่เรากำหนด custom เอง ดังนั้นจึงสร้างตัวแปรรับค่า
width = raw_input(“How wide do you want image to be?”)
height = raw_input(“How tall do you want image to be?”)
ค่า url ที่ได้จึงควรจะเป็น
url = “http://placekitten.com/g/” + width + “/” + height
เท่านั้นเราก็ได้ url แล้ว!
- สิ่งถัดไปคือ เมื่อเราได้ที่อยู่ของข้อมูลแล้ว เราก็เขียน API เรียก request เพื่อเอาค่านั้นมา โดยวิธี requests.get()
kitten = requests.get(url)
และค่าที่เราได้จะนำไปเก็บที่ตัวแปร kitten
3. นำข้อมูลที่ดึงมาเรียบร้อยแล้วลงไฟล์ที่เราสร้าง !
f = open(“kittens.png”, “w”) // open() เป็นฟังก์ชั่น built-in ของ python เพื่อบอกว่าต้องการจะเขียนไฟล์ png ขึ้นมาใหม่ ชื่อว่า kittens แต่แค่เปิดไว้เฉยๆ ยังไม่ได้ทำอะไร
f.write(kitten.content) // นำข้อมูลที่เราได้ดึงมาก่อนหน้า นำมาเขียนลง kittens.png ที่เปิดคาไว้ให้แล้ว
f.close // ปิดไฟล์
สังเกตว่าข้อมูลที่ดึงมานั้น( kitten) จะใช้เฉยๆไม่ได้ เพราะเราได้ kitten เป็น object ที่เป็น dictionary
ถ้าเราลอง kitten.__dict__ ดู จะเจอ
{‘cookies’: <RequestsCookieJar[Cookie(version=0, name=’__cfduid’, value=’df2b7c0cd57b968b95249e432bca8a3b91482412416′, port=None, port_specified=False, domain=’.placekitten.com’, domain_specified=True, domain_initial_dot=True, path=’/’, path_specified=True, secure=False, expires=1513948416, discard=False, comment=None, comment_url=None, rest={‘HttpOnly’: None}, rfc2109=False)]>, ‘_content’: ‘\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xfe\x00;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 65\n\xff\xdb\x00C\x00\x0b\x08\x08\n\x08\x0…. บลาๆเยอะมาก ‘ }
ใน content นั่นเองที่เก็บข้อมูลรูปภาพอยู่ นั่นคือต้องใช้ kitten.content เขียนลงไปในไฟล์ใหม่
จบคอนเซปหลักๆ เราก็ fill in โค้ดได้เลย
import requests
class Kitten():
def get_width_and_height(self, width, height): /// ฟังก์ชั่น เพื่อรับค่า input ของ weight และ height
self.width = width
self.height = height
return (self.width, self.height)
def get_image(self): /// ฟังก์ชั่น เพื่อสร้างรูปภาพขึ้นมา
url = “http://placekitten.com/g/” + self.width + “/” + self.height
kitten = requests.get(url)
f = open(“kittens.png”, “w”)
f.write(kitten.content)
f.close
return url
width = raw_input(“How wide do you want image to be”)
height = raw_input(“How tall do you want image to be”)
x = Kitten()
x.get_width_and_height(width, height) /// instantiate เพื่อนำค่า width และ height เข้าฟังก์ชั่นแรก
x.get_image()
จากนั้นเมื่อเรารันไฟล์ ก็จะมีคำสั่ง How wide/tall do you want image to be ? ให้เราป้อนขนาดรูปภาพที่ต้องการลงไป
คราวนี้ใน path เราก็มีรูปแมวเหมียวขึ้นมาแล้ว เย้

Leave a reply to [Python] Django Project: 02 Get image via API | mesodiar Cancel reply