Membuat Sebuah API Library Sederhana Menggunakan Python
Pada tutorial kali ini kita akan membuat sebuah API Library dengan menggunakan Path web app sebagai contoh, API Library ini sendiri akan dibuat menggunakan Python. Path adalah sebuah aplikasi jejaring sosial yang memungkinkan penggunanya untuk berbagi gambar dan juga pesan, penggunaan Path berbeda dari jejaring sosial lainnya di mana hanya pengguna yang telah disetujui yang dapat mengakses halaman Path seseorang. Status privasi dari aplikasi ini menjadikan Path lebih eksklusif dari berbagai jejaring sosial yang ada.[1]
Terlebih dahulu silakan menuju https://path.com untuk melakukan login, dan kemudian kita akan melakukan logging pada XMLHttpRequests
untuk menemukan endpoint yang dibutuhkan ketika membangun sebuah API Library, karena saya menggunakan Google Chrome maka tekan tombol F12
pada keyboard untuk memunculkan Developer tools, kemudian pilih Network dan pada sub-tab pilih XHR.
Pada halaman login Path silakan login menggunakan user dan password anda, setelah login perhatikan pada bagian Developer tools akan muncul XMLHttpRequest
yang digunakan oleh Path ketika membuat sebuah request ke tautan tertentu, pilih salah satu dari XMLHttpRequest
yang ada, pada bagian Headers perhatikan General, Request URL merupakan tautan yang dituju ketika melakukan request, pada contoh kali ini endpoint yang dituju adalah https://path.com/a/login
, kemudian Request Method
merupakan metode yang digunakan ketika melakukan request, apakah GET, POST, PUT, atau DELETE
, Status Code
merupakan kode status yang menandakan status dari request yang dilakukan. Pindah ke bagian Request Payload
, pada bagian ini dapat terlihat request body yang dikirimkan ke server berupa JSON
body yang mempunyai format {emailId: "fadsfafsaf@mail.com", password: "dasdsajsoi"}
emailId merupakan key yang memiliki value berupa e-mail yang digunakan untuk login. Pada tab Response dapat terlihat response yang diberikan oleh server setelah kita melakukan request, request yang dihasilkan berupa JSON
yang memuat banyak informasi yang dapat dilihat pada tab response.
Saatnya melakukan interaksi pada Python dengan menggunakan modul requests
, requests
merupakan HTTP library yang dikembangkan oleh Kenneth Reitz’. Modul ini merupakan salah satu modul primer ketika hendak melakukan interaksi melalui protokol HTTP menggunakan Python. Pada contoh di bawah ini kita akan melakukan login website Path menggunakan modul requests
import requests
params = {"emailId":"emailkamu" "password":"passwrodkamu"}
r = requests.post("https://path.com/a/login, data=params}
if r.status_code == 200:
data = r.json()
print(data['user'])
else:
return "Ada yang salah"
Perhatikan:
- Dictionary params memuat key dan value yang diperlukan untuk melakukan login, key dan value didapatkan dengan melihat
XMLHttpRequest
pada Developer tools. - Modul
requests
mempunyai method bernamapost
yang melakukan HTTP POST, fungsi mana yang digunakan untuk melakukan request ke server menyesuaikan dengan melihatXMLHttpRequest
yang didapatkan dari Developer tools sebelumnya. - Kemudian dilakukan pengecekan, apakah request direspons dengan benar oleh server dengan status kode 200
- Variabel
r
yang merupakan object dari requests mempunyai method berupajson
. Method ini mengubah byte yang diterima menjadi object dict yang disimpan pada variabel bernamadata
Kembali ke website Path pada browser, setelah login kita dapat mencari endpoint lainnya dengan melakukan navigasi pada website, seperti misalnya melihat feed teman, membuat sebuah komentar pada moment kawan, atau menyukai sebuah moment, dan hal-hal lainnya.
Setelah menemukan endpoint yang lain kita kembali pada langkah awal untuk mendapatkan tautan yang digunakan untuk melakukan request, query yang digunakan, dan lain-lain. Tahap selanjutnya membuat sebuah Python Class sebagai wrapper untuk Path API dengan endpoint yang telah didapatkan.
class PathAPI:
API_URL = "https://path.com/a/"
def __init__(self, user_login, user_password):
self.user_login = user_login
self.user_password = user_password
self.session = requests.Session()
Pada kode di atas menggunakan Session()
untuk melakukan request, dikarenakan ketika menggunakan Session()
kita dapat mempertahakan beberapa parameter pada setiap requests yang dilakukan, jadi cookies yang kita gunakan pada setiap request tetaplah sama, hal lebih lanjut tentang ini dapat dibaca pada http://docs.python-requests.org/en/master/user/advanced/.
def get_home(self):
params = {"ww": "562", "wh": "530", "meId": self.meId}
response = self.session.get(self.API_URL + "feed/home", params=params)
if response.status_code == 200:
data = response.json()
return data
else:
return
Kemudian membuat sebuah method bernama get_home
yang mempunyai response berupa data dari feed home akun kita sendiri, key dan value dari params didapatkan dari Developer tools seperti sebelumnya.
class PathAPI:
API_URL = "https://path.com/a/"
def __init__(self, user_login, user_password):
self.user_login = user_login
self.user_password = user_password
self.session = requests.Session()
response = self.session.post(self.API_URL + "login",
data={"emailId": self.user_login,
"password": self.user_password})
if response.status_code == 200: # Login success
data = response.json()
self.meId = data['user']['id']
else:
return
def get_home(self):
params = {"ww": "562", "wh": "530", "meId": self.meId}
response = self.session.get(self.API_URL + "feed/home", params=params)
if response.status_code == 200:
data = response.json()
return data
else:
return
def get_friends(self):
params = {"locale": "en", "meId": self.meId}
response = self.session.get(self.API_URL + "friends", params=params)
if response.status_code == 200:
data = response.json()
return data
else:
return
def get_friend_by_id(self, friend_id):
params = {'ww': '566',
'wh': '530',
'user_id': friend_id,
'meId': self.meId}
response = self.session.get(self.API_URL + "feed", params=params)
if response.status_code == 200:
return response.json()
else:
return
def comment(self, moment_id, comment_body):
params = {'moment_id': moment_id,
'comment_body': comment_body,
'meId': self.meId}
response = self.session.post(self.API_URL + "moment/comment/add", data=params)
if response.status_code == 200:
return response.json()
else:
return
def comment_emotion(self, moment_id, emotion_type):
"""
There are 5 emotion types, sad, happy, laugh, love, and surprise
"""
params = {"moment_id": moment_id,
"emotion_type": emotion_type,
"meId": self.meId}
response = self.session.post(self.API_URL + "moment/emotion/add", data=params)
if response.status_code == 200:
return response.json()
else:
return
Setelah membuat beberapa method sesuai dengan endpoint yang didapatkan maka hasilnya akan seperti di atas, kemudian saatnya menggunakan kode yang telah dibuat sesuai dengan method yang ada.
api = PathAPI("email", "password")
home = api.get_home()
moments = home['momentSet']
moment_created = {k: v['created'] for k, v in moments.items()}
latest_moment = sorted(moment_created.keys())[-1]
Pada contoh di atas kita mencoba untuk membuat sebuah komentar pada moment terbaru yang terlihat di timeline kita, moment yang dapat dilihat hanyarlah 20 moment terakhir, kode di atas bertujuan untuk mengambil moment_id
yang terbaru berdasarkan timestamp dibuatnya moment tersebut.
post = api.comment(latest_moment,"Hi, there!")
Kemudian membuat komentar dengan method comment
, dengan argumen pertama merupakan _moment_id dan argumen kedua merupakan teks dari komentar.
Berikutnya kita akan mencoba mendapatkan feed dari teman yang ada pada friendlist
friendlist = api.get_friends()
friends = {}
for k,user in friendlist['users'].items():
# print(user['first_name'], user['last_name'])
friends[k] = user['first_name'] + user['last_name']
for friend_id, friend in friends.items():
if "gading" in friend:
user_id = friend_id
print(user_id)
gading = api.get_friend_by_id(user_id)
Terlebih dahulu kita akan membuat sebuah dictionary yang berformat {'user_id':'Full_name'}
, kemudian kita akan melakukan pengecekan apakah salah satu dari nama dari teman kita tersebut memuat string yang kita cari, jika ada ambil user_id
user tersebut kemudian gunakan method get_friend_by_id
untuk mendapatkan feed dari user tersebut.
Setelah mendapatkan feed dari user tersebut kita dapat melakukan parsing berupa tempat mana saja yang pernah dikunjungi, dengan siapa, dan berbuat apa. >_>
Silakan mencoba membuat API Library untuk web app yang lain seperti Instagram, Twitter dan lain-lain.
Sekian tulisan kali ini, jikalau menemukan kesalahan bodoh, konyol dalam penulisan kode atau kesalahan arti kata dalam penggunaan mohon dengan sangat untuk membenarkan. Semoga bermanfaat ;)