Python: Dự án Python cho người mới bắt đầu: Thông báo giá Bitcoin

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Mục lục bài viết:

Chào mừng bạn đến với bài viết đầu tiên trong loạt bài viết về các dự án Python cho người mới bắt đầu!

Trong hướng dẫn này, chúng ta sẽ xây dựng dịch vụ thông báo giá Bitcoin.

Trong dự án này, bạn sẽ tìm hiểu về các yêu cầu HTTP và cách gửi chúng bằng gói (được đặt tên thích hợp) requests.

Bạn sẽ tìm hiểu về webhook và cách bạn có thể sử dụng chúng để kết nối ứng dụng Python của mình với các dịch vụ bên ngoài, chẳng hạn như thông báo điện thoại hoặc tin nhắn Telegram.

Với mã tương đối ít (khoảng 50 dòng), bạn sẽ nhận được một dịch vụ thông báo giá Bitcoin chính thức, có thể dễ dàng mở rộng sang các loại tiền điện tử và dịch vụ khác.

App thông báo giá Bitcoin với Python

Như chúng ta đã biết, giá Bitcoin là một thứ hay thay đổi. Bạn không bao giờ thực sự biết nó sẽ ở đâu vào cuối ngày. Vì vậy, thay vì liên tục kiểm tra các trang web khác nhau để tìm các bản cập nhật mới nhất, hãy tạo một ứng dụng Python để thực hiện công việc cho bạn.

Đối với điều này, chúng tôi sẽ sử dụng trang web tự động hóa phổ biến IFTTT. IFTTT (“nếu cái này, thì cái kia”) là một dịch vụ web thu hẹp khoảng cách giữa các ứng dụng và thiết bị khác nhau.

Chúng tôi sẽ tạo hai ứng dụng IFTTT:

  • Một để thông báo khẩn cấp khi giá Bitcoin giảm xuống dưới một ngưỡng nhất định; và
  • một để cập nhật Telegram thường xuyên về giá Bitcoin.

Cả hai sẽ được kích hoạt bởi ứng dụng Python của chúng tôi, ứng dụng này sẽ sử dụng dữ liệu từ API Coinmarketcap.

Một ứng dụng IFTTT bao gồm hai phần: một trình kích hoạt và một hành động.

Trong trường hợp của ta, trình kích hoạt sẽ là một dịch vụ webhook do IFTTT cung cấp. Bạn có thể coi webhook là “lệnh gọi lại HTTP do người dùng định nghĩa” và bạn có thể đọc thêm về chúng tại đây.

Ứng dụng Python của ta sẽ thực hiện một yêu cầu HTTP đến URL webhook sẽ kích hoạt một hành động. Bây giờ, đây là phần thú vị, hành động có thể là hầu hết mọi thứ bạn muốn. IFTTT cung cấp vô số hành động như gửi email, cập nhật Bảng tính Google và thậm chí gọi điện thoại của bạn.

Thiết lập dự án

Hãy bắt đầu bằng cách thiết lập một môi trường ảo. Chạy lệnh sau để có được một môi trường ảo Python 3 mới:

$ mkvirtualenv -p $(which python3) bitcoin_notifications

Trước khi tiếp tục, bạn phải kích hoạt môi trường ảo và cài đặt các phụ thuộc cần thiết:

$ workon bitcoin_notifications  # To activate the virtual environment
$ pip install requests==2.18.4  # We only need the requests package

Bạn có thể hủy kích hoạt môi trường ảo bằng cách chạy deactivatelệnh shell.

Truy xuất giá Bitcoin

Chúng ta có thể bắt đầu bằng cách nhận giá mới nhất từ ​​API Coinmarketcap trong bảng điều khiển Python:

Đầu tiên, chúng ta phải import các module requests và định nghĩa biến bitcoin_api_url có chứa URL API Coinmarketcap cho Bitcoin.

Tiếp theo, chúng ta gửi một yêu cầu HTTP GET đến URL bằng cách sử dụng hàm requests.get() và lưu phản hồi. Vì API trả về một phản hồi JSON, nên ta có thể chuyển đổi nó thành một đối tượng Python bằng cách gọi hàm json() trên phản hồi. Như vậy là API đã trả về một danh sách có một phần tử chứa dữ liệu giá Bitcoin:

>>>

>>> import requests
>>> bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/'
>>> response = requests.get(bitcoin_api_url)
>>> response_json = response.json()
>>> type(response_json) # The API returns a list
<class 'list'>
>>> # Dữ liệu Bitcoin là phần tử đầu tiên của list
>>> response_json[0]
{'id': 'bitcoin', 'name': 'Bitcoin', 'symbol': 'BTC', 'rank': '1', 
 'price_usd': '10226.7', 'price_btc': '1.0', '24h_volume_usd': '7585280000.0',
 'market_cap_usd': '172661078165', 'available_supply': '16883362.0', 
 'total_supply': '16883362.0', 'max_supply': '21000000.0', 
 'percent_change_1h': '0.67', 'percent_change_24h': '0.78', 
 'percent_change_7d': '-4.79', 'last_updated': '1519465767'}

Thuộc tính mà chúng ta quan tâm nhất là 'price_usd'- giá Bitcoin tính bằng đô la Mỹ.

Gửi Thông báo kiểm tra IFTTT

Để sử dụng IFTTT, trước tiên bạn cần thiết lập một tài khoản mới và cài đặt ứng dụng dành cho thiết bị di động (nếu bạn muốn nhận thông báo trên điện thoại từ ứng dụng Python của mình). Sau khi bạn thiết lập xong, chúng ta sẽ tạo một ứng dụng IFTTT mới cho mục đích thử nghiệm.

Để tạo một applet thử nghiệm mới, hãy làm theo các bước sau:

  1. Click vào nút "this"
  2. Tìm kiếm dịch vụ "webhooks" và chọn trình kích hoạt "Receive a web request"
  3. Đặt tên cho sự kiện test_event
  4. Bây giờ chọn nút "that"
  5. Tìm kiếm dịch vụ "notifications" và chọn "Send a notification from the IFTTT"
  6. Thay đổi thông báo thành I just triggered my first IFTTT action! và nhấp vào “Create action”
  7. Nhấp vào nút “Finish” để hoàn tất.

Để xem tài liệu về cách sử dụng IFTTT webhook, hãy truy cập vào đây và nhấp vào nút “Documentation” ở góc trên cùng bên phải. Trang tài liệu chứa URL webhook và có dạng như sau:

https://maker.ifttt.com/trigger/{event}/with/key/{your-IFTTT-key}

Tiếp theo, bạn sẽ cần thay thế phần {event} bằng bất kỳ tên nào bạn đã đặt cho sự kiện của chúng ta ở bước 3, khi bạn tạo applet. Phần {your-IFTTT-key} đã được điền bằng khóa IFTTT của bạn.

Bây giờ sao chép URL webhook và bắt đầu một bảng điều khiển Python khác. Một lần nữa chúng ta import mô-đun requests và tạo các biến URL webhook. Bây giờ chúng ta chỉ cần gửi một yêu cầu HTTP POST đến IFTTT webhook URL bằng cách sử dụng hàm requests.post():

>>>

>>> import requests
>>> # Make sure that your key is in the URL
>>> ifttt_webhook_url = 'https://maker.ifttt.com/trigger/test_event/with/key/{your-IFTTT-key}'
>>> requests.post(ifttt_webhook_url)
<Response [200]>

Sau khi chạy dòng cuối cùng, bạn sẽ thấy một thông báo trên điện thoại của bạn dạng như sau:

Python + IFTTT: Thông báo thử nghiệm

Tạo IFTTT Applet

Bây giờ chúng ta đã sẵn sàng cho phần chính. Trước khi bắt đầu với mã, chúng ta cần tạo hai ứng dụng IFTTT mới: một dành cho thông báo giá Bitcoin khẩn cấp và một để cập nhật thường xuyên.

Ứng dụng thông báo giá bitcoin khẩn cấp:

  1. Chọn dịch vụ “webhooks” và chọn trình kích hoạt "Receive a web request"
  2. Đặt tên cho sự kiện bitcoin_price_emergency
  3. Đối với các hành động chọn dịch vụ “Notifications” và chọn hành động “Send a rich notification from the IFTTT app”
  4. Đặt cho nó một tiêu đề, như "Tình trạng khẩn cấp về giá Bitcoin!"
  5. Đặt tin nhắn thành Bitcoin price is at ${{Value1}}. Buy or sell now! (chúng ta sẽ quay lại {{Value1}} ở phần sau)
  6. Theo tùy chọn, bạn có thể thêm URL liên kết vào trang Coinmarketcap Bitcoin: https://coinmarketcap.com/currencies/bitcoin/
  7. Tạo hành động và hoàn tất thiết lập applet

Applet cập nhật giá thường xuyên:

  1. Một lần nữa chọn dịch vụ “webhooks” và chọn trình kích hoạt “Receive a web request”
  2. Đặt tên cho sự kiện bitcoin_price_update
  3. Đối với hành động, hãy chọn dịch vụ “Telegram” và chọn hành động “Send message”
  4. Đặt nội dung tin nhắn thành: Latest bitcoin prices:<br>{{Value1}}
  5. Tạo hành động và kết thúc với applet

Lưu ý: Khi tạo applet này, bạn sẽ phải cấp quyền cho bot IFTTT Telegram.

Ghép lại với nhau

Bây giờ chúng ta đã có IFTTT, hãy bắt đầu viết mã! Bạn sẽ bắt đầu bằng cách tạo khung ứng dụng dòng lệnh Python tiêu chuẩn được hiển thị bên dưới. Copy mã sau và lưu nó trong một tệp có tên  bitcoin_notifications.py:

import requests
import time
from datetime import datetime

def main():
    pass

if __name__ == '__main__':
    main()

Tiếp theo, chúng ta phải dịch hai phiên bảng điều khiển Python trước đó thành hai hàm sẽ trả về giá Bitcoin mới nhất và đăng lên webhook IFTTT tương ứng. Thêm các chức năng sau bên trên chức năng chính:

BITCOIN_API_URL = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/'
IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{}/with/key/{your-IFTTT-key}'

def get_latest_bitcoin_price():
    response = requests.get(BITCOIN_API_URL)
    response_json = response.json()
    # Chuyển giá thành kiểu số thực
    return float(response_json[0]['price_usd'])


def post_ifttt_webhook(event, value):
    # Dữ liệu sẽ được gửi tới dịch vụ IFTTT
    data = {'value1': value}
    # chèn sự kiện mong muốn
    ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event)
    # gửi một yêu cầu HTTP POST tới URL webhook
    requests.post(ifttt_event_url, json=data)

get_latest_bitcoin_price cũng tương tự như vậy, ngoại trừ phần mà chúng ta phải chuyển đổi giá từ một chuỗi thành một số dấu phẩy động. post_ifttt_webhook có hai tham số: event và value.

event sẽ phản hồi với tên sự kiện bất kỳ mà ta đã cung cấp để ta kích hoạt khi thiết lập applet IFTTT. Ngoài ra, các webhook IFTTT cho phép chúng ta gửi dữ liệu bổ sung cùng với yêu cầu dưới dạng dữ liệu có định dạng JSON.

Đó là lý do tại sao chúng ta cần tham số value: Khi thiết lập các applet, chúng ta đã để lại một thẻ {{Value1}} trong các trường tin nhắn của mình. Thẻ này được thay thế bằng text 'value1' từ việc tải JSON. Hàm requests.post() cho phép chúng ta gửi dữ liệu JSON thêm đơn giản bằng cách thêm từ khóa json.

Bây giờ chúng ta có thể chuyển sang phần cốt lõi của ứng dụng trong hàm main. Nó sẽ bao gồm một vòng lặp while True vì chúng ta muốn ứng dụng của mình chạy mãi mãi. Trong vòng lặp, ta sẽ gọi API Coinmarketcap để nhận giá Bitcoin mới nhất và ghi lại ngày và giờ hiện tại.

Dựa trên mức giá hiện tại, ta sẽ quyết định xem ta có muốn gửi thông báo khẩn cấp hay không. Đối với các bản cập nhật Telegram thường xuyên, ta cũng sẽ thêm giá và ngày hiện tại vào một list là bitcoin_history. Khi danh sách đạt đến một số mục nhất định (ví dụ như 5 chẳng hạn), thì ta sẽ định dạng các mục, gửi bản cập nhật tới Telegram và đặt lại lịch sử cho các bản cập nhật trong tương lai.

Như vậy là bạn có thể thấy, có rất nhiều thứ đang diễn ra trong ứng dụng này. Nếu bạn gặp sự cố khi làm theo, bạn hãy nghỉ ngơi một chút và đọc lại phần trên một cách chậm rãi. Công việc này không dễ dàng, vì vậy hãy dành thời gian của bạn và đừng lo lắng về việc mọi thứ cần hoàn hảo trong lần đầu tiên.

Một điều quan trọng là tránh gửi những yêu cầu này quá thường xuyên, vì hai lý do:

  • API Coinmarketcap tuyên bố rằng họ chỉ cập nhật dữ liệu 5 phút một lần, vì vậy không có ích gì khi tải lại thông tin giá mới nhất thường xuyên hơn được
  • Nếu ứng dụng của bạn gửi quá nhiều yêu cầu đến API Coinmarketcap, IP của bạn có thể bị cấm hoặc tạm thời bị tạm ngưng.

Đó là lý do tại sao chúng ta cần “đi ngủ” (ngừng thực hiện vòng lặp) trong ít nhất 5 phút trước khi chúng ta nhận được dữ liệu mới. Đoạn mã dưới đây triển khai tất cả các tính năng bắt buộc mà ta đã nêu ở trên:

BITCOIN_PRICE_THRESHOLD = 10000  # Set this to whatever you like

def main():
    bitcoin_history = []
    while True:
        price = get_latest_bitcoin_price()
        date = datetime.now()
        bitcoin_history.append({'date': date, 'price': price})

        # Send an emergency notification
        if price < BITCOIN_PRICE_THRESHOLD:
            post_ifttt_webhook('bitcoin_price_emergency', price)

        # Send a Telegram notification
        # Once we have 5 items in our bitcoin_history send an update
        if len(bitcoin_history) == 5:
            post_ifttt_webhook('bitcoin_price_update', 
                               format_bitcoin_history(bitcoin_history))
            # Reset the history
            bitcoin_history = []

        # Sleep for 5 minutes 
        # (For testing purposes you can set it to a lower number)
        time.sleep(5 * 60)

Ta sắp hoàn thành rồi! Điều duy nhất còn thiếu ở đây là hàm format_bitcoin_history. Ta sẽ lấy bitcoin_history như một đối số và định dạng nó sử dụng một số thẻ HTML cơ bản cho phép của Telegram, như <br><b><i>, v.v. Sao chép hàm này bên trên hàm main:

def format_bitcoin_history(bitcoin_history):
    rows = []
    for bitcoin_price in bitcoin_history:
        # Formats the date into a string: '24.02.2018 15:09'
        date = bitcoin_price['date'].strftime('%d.%m.%Y %H:%M')
        price = bitcoin_price['price']
        # <b> (bold) tag creates bolded text
        # 24.02.2018 15:09: $<b>10123.4</b>
        row = '{}: $<b>{}</b>'.format(date, price)
        rows.append(row)

    # Use a <br> (break) tag to create a new line
    # Join the rows delimited by <br> tag: row1<br>row2<br>row3
    return '<br>'.join(rows)

Kết quả sẽ có dạng như sau:

Python + IFTTT: Bitcoin Telegram

Để chạy ứng dụng thông báo giá của bạn, hãy thực hiện như sau trong thiết bị đầu cuối dòng lệnh của bạn:

$ python bitcoin_notifications.py

Như vậy là với hơn 50 dòng mã Python, bạn đã tạo ra dịch vụ thông báo Bitcoin của riêng mình. Xin chúc mừng! Dưới đây, là toàn bộ mã để bạn có thể so sánh và xem liệu bạn có bỏ sót điều gì không:

import requests
import time
from datetime import datetime

BITCOIN_PRICE_THRESHOLD = 10000
BITCOIN_API_URL = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/'
IFTTT_WEBHOOKS_URL = 'https://maker.ifttt.com/trigger/{}/with/key/{your-IFTTT-key}'

def get_latest_bitcoin_price():
    response = requests.get(BITCOIN_API_URL)
    response_json = response.json()
    return float(response_json[0]['price_usd'])  # Convert the price to a floating point number

def post_ifttt_webhook(event, value):
    data = {'value1': value}  # The payload that will be sent to IFTTT service
    ifttt_event_url = IFTTT_WEBHOOKS_URL.format(event)  # Inserts our desired event
    requests.post(ifttt_event_url, json=data)  # Sends a HTTP POST request to the webhook URL

def format_bitcoin_history(bitcoin_history):
    rows = []
    for bitcoin_price in bitcoin_history:
        date = bitcoin_price['date'].strftime('%d.%m.%Y %H:%M')  # Formats the date into a string: '24.02.2018 15:09'
        price = bitcoin_price['price']
        # <b> (bold) tag creates bolded text
        row = '{}: $<b>{}</b>'.format(date, price)  # 24.02.2018 15:09: $<b>10123.4</b>
        rows.append(row)

    # Use a <br> (break) tag to create a new line
    return '<br>'.join(rows)  # Join the rows delimited by <br> tag: row1<br>row2<br>row3

def main():
    bitcoin_history = []
    while True:
        price = get_latest_bitcoin_price()
        date = datetime.now()
        bitcoin_history.append({'date': date, 'price': price})

        # Send an emergency notification
        if price < BITCOIN_PRICE_THRESHOLD:
            post_ifttt_webhook('bitcoin_price_emergency', price)

        # Send a Telegram notification
        if len(bitcoin_history) == 5:  # Once we have 5 items in our bitcoin_history send an update
            post_ifttt_webhook('bitcoin_price_update', format_bitcoin_history(bitcoin_history))
            # Reset the history
            bitcoin_history = []

        time.sleep(5 * 60)  # Sleep for 5 minutes (for testing purposes you can set it to a lower number)

if __name__ == '__main__':
    main()

Tóm tắt và các bước tiếp theo

Trong bài viết này, chúng ta đã tạo dịch vụ thông báo Bitcoin của riêng mình. Bạn đã học cách gửi các yêu cầu HTTP GET và POST bằng cách sử dụng module requests. Bạn đã thấy việc kết nối ứng dụng Python của mình với các dịch vụ bên ngoài bằng IFTTT và webhooks dễ dàng như thế nào.

Bây giờ, bạn nên làm gì tiếp theo? Dưới đây là một số gợi ý có thể giúp bạn bắt đầu:

  • Bạn thích bảng tính? Sử dụng hành động IFTTT sẽ thêm giá Bitcoin vào Bảng tính Google
  • Cải thiện điều kiện if price < BITCOIN_PRICE_THRESHOLD để nhận thông báo chỉ một lần mỗi ngày (nếu không sẽ khá khó chịu nếu Bitcoin liên tục ở mức thấp)
  • Bạn muốn Ethereum/Litecoin/Dogecoin tốt hơn? Thay đổi get_latest_bitcoin_price thành get_latest_cryptocurrency_price sẽ lấy tiền điện tử làm tham số và trả lại giá của nó
  • Bạn muốn giá bằng một loại tiền tệ khác? Kiểm tra API Coinmarketcap để biết tham số convert.

Ngoài ra, đây sẽ là một chuỗi liên tục với nhiều dự án Python hơn mà bạn có thể xây dựng để phát triển kỹ năng của mình.

» Tiếp: Sử dụng PyInstaller để dễ dàng phân phối các ứng dụng Python
« Trước: Python eval(): Đánh giá biểu thức động
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!