Tạo hiệu ứng instagram card bằng thư viện pillow trên python (P2)


Chào tất cả các độc giả của nguyentrieuphong.com, đang cao hứng nên tôi làm cho xong seri này luôn vì sợ để lâu sẽ lười viết. Hôm nay chúng ta tiếp tục với việc làm thế nào để lấy thông tin từ tài khoản instagram (public) để đổ xuống chương trình python đã viết ở phần một. Nếu mọi người vẫn chưa kịp đọc phần một thì tôi có để link bài viết ở phía dưới.
Sau khi kiểm tra lại chương trình ở phần một thì tôi phát hiện ra khá nhiều chỗ còn thô sơ, ví dụ như việc tự động căn lề giữa cho các con số, các điều kiện để xử lí ảnh đầu vào. Hiện tại thì chương trình chạy tốt trên tất cả ảnh đầu vào có kích thước từ 1080x1080 pixel trở lên. Ảnh kích thước nhỏ hơn thì sao? Thì không đẹp, kích thước tối thiểu là do tôi quy định vì thế nếu đầu vào là ảnh nhỏ hơn kích thước trên sẽ khiến chương trình tính toán sai vị trí đặt hiệu ứng.

Tiếp theo, tôi muốn giới thiệu cho các bạn cách để khai thác dữ liệu JSON trên instagram, JSON là một kiểu dữ liệu rất thú vị và dễ sử dụng. Thông thường khi xem một bức ảnh và sao chép địa chỉ, chúng ta sẽ có url dạng:

"https://www.instagram.com/p/B-L9b6oJIpf/?utm_source=ig_web_copy_link"

 Để truy cập vào dữ liệu JSON, chúng ta cần biến đổi url phía trên thành dạng:

"https://www.instagram.com/p/B-L9b6oJIpf/?__a=1"

Khi đó, url mới sẽ đưa đến địa chỉ chứa dữ liệu JSON như sau.


Woa, chúng ta đã có gần như tất cả thông tin của tài khoản instagram tại đây, việc còn lại là truy vấn dữ liệu cần thiết và GET về chương trình. Để làm được điều đó chúng ta cần thêm thư viện requests json, tiến hành cài đặt gói thư viện thông qua pip.

>> pip install simplejson
>> pip install requests

Sau đó import các thư viện vào chương trình.

from requests import get
import requests
import json

Tiến hành viết đoạn mã python để chuyển đổi url ảnh thành url instagram JSON.

#JSON_processimage_instagram = "https://www.instagram.com/p/B-L9b6oJIpf/?utm_source=ig_web_copy_link"
JSON_image_url = image_instagram.replace('utm_source=ig_web_copy_link', '__a=1', 1)

Sau khi thực hiện hai dòng lệnh trên, chúng ta có biến JSON_image_url có dạng string chứa đường dẫn đến dữ liệu JSON. Dễ dàng kiểm tra bằng lệnh:

print(JSON_image_url)



Tiếp theo, chúng ta GET toàn bộ dữ liệu JSON đó về và xử lí chúng để tiện cho việc truy vấn dữ liệu. Thư viện requests sẽ đảm nhiệm công việc GET dữ liệu JSON, thư viện json sẽ xử lí chúng.

req_image = requests.get(JSON_image_url)
convert_1 = req_image.text
load_image = json.loads(convert_1)

Cơ bản thì chúng ta đã có toàn bộ dữ liệu, bây giờ chỉ cần truy vấn đến thứ mình cần. Việc truy vấn như thế nào phụ thuộc vào cây JSON, mọi người hay gọi là dict. JSON giống như một đường dẫn thư mục, để truy vấn đến dữ liệu con chúng ta cần chỉ ra đường dẫn từ thư mục mẹ.



Ở đây, chúng ta cần url hình ảnh, tên tài khoản, số bài đăng, số người theo dõi, số người đang theo dõi. Dữ liệu JSON chúng ta vừa có cho xem chúng ta khai thác url hình ảnh, tên tài khoản và số bài đăng. Các dữ liệu còn lại chúng ta phải lấy thông qua cách khác, mình sẽ trình bày sau.

main_link = load_image['graphql']['shortcode_media']['display_url']
avatar_link = load_image['graphql']['shortcode_media']['owner']['profile_pic_url']
user_name = load_image['graphql']['shortcode_media']['owner']['username']
posts = load_image['graphql']['shortcode_media']['owner']['edge_owner_to_timeline_media']
['count']

Tôi đã có main_link là url đến hình ảnh chất lượng cao, avatar_link là url đến avatar, user_name là tên tài khoản và posts là số bài đăng. Với user_name là dữ liệu dạng string, trùng với kiểu dữ liệu chúng ta sử dụng trước đó nên chỉ cần thay thế biến là xong. posts mang kiểu int nên trước khi thay thế tôi sẽ ép chúng về dạng string bằng cách đặt biến posts vào hàm str(), str(posts).

Kết quả của lần này, thông tin đã được điền tự động


Chúng ta sẽ tải xuống hình ảnh main_linkavatar_link thông qua đoạn mã sau:

#Download image moduledef download(url, file_name):
    with open(file_name, "wb") as file:
        response = get(url)
        file.write(response.content)
download(main_link,"main_image.jpg")
download(avatar_link,"./materials/avatar.jpg")

Hãy kiểm tra thư mục chính của project và thư mục materials, chúng ta sẽ thấy các file main_image.jpgavatar.jpg là những vật liệu chúng ta cần cho việc tạo hiệu ứng. Thay vì phải tải về thủ công thì chúng ta đã có thể lấy những gì mình cần thông qua requests, ở bài viết sau chúng ta sẽ tiếp tục với requests và json và tìm hiểu phương thức để lấy các dữ liệu còn lại vì JSON chúng ta đang có không tồn tại các giá trị followers và followings. Chúc các bạn ngủ ngon.