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 bernama post yang melakukan HTTP POST, fungsi mana yang digunakan untuk melakukan request ke server menyesuaikan dengan melihat XMLHttpRequest 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 berupa json. Method ini mengubah byte yang diterima menjadi object dict yang disimpan pada variabel bernama data

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 ;)


Author | Yoga Yudistira

Currently a student in one of University in Yogyakarta