NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
07/06/2023
Lượt xem

Cách tạo Slackbot bằng Python trên Ubuntu 20.04

07/06/2023
33 phút đọc
Lượt xem

Đánh giá

4.1/5 - (140 bình chọn)

Trong bài viết này, bạn sẽ xây dựng một Slackbot bằng ngôn ngữ lập trình Python. Slack cung cấp Python Slack API phong phú để tích hợp với Slack nhằm thực hiện các tác vụ thông thường như gửi tin nhắn, thêm biểu tượng cảm xúc vào tin nhắn,… Slack cũng cung cấp Python Slack Event API để tích hợp với các sự kiện trong Slack, cho phép bạn thực hiện các hành động đối với các hành động như tin nhắn và đề cập đến người khác.

Điều kiện để tạo Slackbot bằng Python trên Ubuntu 20.04

Để làm theo hướng dẫn này, bạn sẽ cần:

  • Một Slack Workspace mà bạn có khả năng cài đặt các ứng dụng vào đó.
  • (Không bắt buộc) Một server hoặc máy tính có địa chỉ IP public để phát triển công cụ. Bạn có thể cài đặt Ubuntu 20.04 mới, với tài khoản người dùng không phải root và có đặc quyền sudo và bật SSH.

Bạn có thể sẽ muốn thử nghiệm theo bài này trên một máy chủ có địa chỉ IP public. Slack sẽ gửi các sự kiện như tin nhắn đến bot của bạn. Nếu bạn đang thử nghiệm trên máy local, bạn sẽ cần chuyển tiếp lưu lượng truy cập qua firewall đến hệ thống local của mình.

Bài viết này sử dụng Python 3 và không tương thích với Python 2. (Hướng dẫn chi tiết về cách cài đặt Python 3 trên Ubuntu 20.04 tại đây)

Để Slackbot được hoạt động ổn định, an toàn và đáp ứng được yêu cầu của doanh nghiệp hoặc nhóm làm việc. Nếu bạn chọn VPS để cài đặt Slackbot thì VPS cần cung cấp môi trường ổn định và đủ tài nguyên để chạy ứng dụng Slackbot một cách hiệu quả.

Hiện tại Vietnix đang cung cấp nhiều gói VPS cho bạn dễ dàng lựa chọn như: VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS NVMe và VPS GPU.

Nhanh tay đăng ký dịch vụ VPS tốc độ cao của Vietnix ngay hôm nay!

Bước 1: Tạo ra Slackbot trên Slack UI

Trước tiên, hãy tạo ứng dụng Slack của bạn trong Slack API Control Panel. Đăng nhập vào workspace trong Slack thông qua trình duyệt web và chuyển đến API Control Panel. Bây giờ hãy nhấp vào nút Create an App.

Nhấn vào nút Create an App
Nhấn vào nút Create an App

Tiếp theo, bạn sẽ được nhắc nhập tên ứng dụng của mình và chọn workspace cho Slack. Nếu theo ví dụ trong bài viết này thì hãy đặt tên cho ứng dụng là CoinBot và chọn một workspace mà bạn có quyền truy cập quản trị viên. Khi bạn đã hoàn thành việc này, hãy nhấp vào nút Create App.

Create App trong Create a Slack App
Create App trong Create a Slack App

Khi ứng dụng của bạn được tạo, bạn sẽ thấy bảng điều khiển ứng dụng mặc định sau đây. Trang dashboard này là nơi bạn quản lý ứng dụng của mình bằng cách đặt quyền, đăng ký event, cài đặt ứng dụng vào workspace,…

Dashboard hiển thị các thông tin cá nhân
Dashboard hiển thị các thông tin cá nhân

Để ứng dụng của bạn có thể đăng tin nhắn lên một kênh, bạn cần cấp cho ứng dụng quyền gửi tin nhắn. Bạn bấm vào nút Permissions trong bảng điều khiển.

Cấp quyền ứng dụng gửi tin nhắn
Cấp quyền ứng dụng gửi tin nhắn

Khi bạn đến trang OAuth & Permissions, hãy cuộn xuống cho đến khi bạn tìm thấy phần Scopes của trang. Sau đó, tìm mục Bot Token Scopes trong phần scope và nhấp vào nút Add an OAuth Scope.

Nhấn vào Add an OAuth Scope
Nhấn vào Add an OAuth Scope

Nhấp vào nút đó rồi nhập chat:write. Chọn quyền để thêm vào bot của bạn. Điều này sẽ cho phép ứng dụng đăng tin nhắn lên các kênh mà ứng dụng có thể truy cập. Để biết thêm thông tin về các quyền khả dụng, bạn có thể tham khảo thêm tại tài liệu chính thức của Slack.

Add chat:write
Add chat:write

Bây giờ bạn đã thêm quyền thích hợp, đã đến lúc cài đặt ứng dụng của bạn vào workspace Slack. Cuộn lên trên trang OAuth & Permissions và nhấp vào nút Install App to Workspace ở trên cùng.

Nhấn vào Install App to Workspace
Nhấn vào Install App to Workspace

Nhấp vào nút này và xem lại các hành động mà ứng dụng có thể thực hiện trong kênh. Khi bạn đã thiết lập xong, hãy nhấp vào nút Allow để hoàn tất cài đặt.

Nhấn Allow để hoàn tất cài đặt
Nhấn Allow để hoàn tất cài đặt

Sau khi bot được cài đặt, bạn sẽ được cung cấp Bot User OAuth Access Token để ứng dụng của bạn sử dụng khi thực hiện các hành động trong workspace. Hãy tiếp tục và sao chép mã thông báo này vì bạn sẽ cần sau này.

Lưu trữ mã Token
Lưu trữ mã Token

Cuối cùng, thêm bot mới cài đặt của bạn vào một kênh trong workspace của bạn. Nếu chưa tạo kênh, bạn có thể sử dụng kênh #general được tạo theo mặc định trong workspace Slack của mình. Tìm ứng dụng trong phần Apps của thanh điều hướng trong ứng dụng client Slack và nhấp vào ứng dụng đó.

Khi bạn đã hoàn tất, hãy mở menu Details ở trên cùng bên phải. Nếu ứng dụng client Slack không ở chế độ toàn màn hình thì sẽ trông giống như một chữ i trong vòng tròn.

Biểu tượng của client Slack
Biểu tượng của client Slack

Để hoàn tất việc thêm ứng dụng của bạn vào một kênh, hãy nhấp vào nút More được biểu thị bằng ba dấu chấm trong trang detail và chọn Add this app to a channel… Nhập kênh của bạn và nhấp vào Add.

Thêm ứng dụng vào kênh bằng nút More
Thêm ứng dụng vào kênh bằng nút More

Vậy là bạn đã tạo thành công ứng dụng của mình và thêm vào một kênh trong workspace Slack. Sau khi bạn viết mã cho ứng dụng, ứng dụng sẽ có thể đăng thông báo trong kênh đó.

Bước 2: Thiết lập môi trường Python dành cho nhà phát triển

Hãy thiết lập môi trường Python để bạn có thể phát triển Slackbot. Mở terminal để cài đặt python3 và các công cụ có liên quan vào hệ thống:

sudo apt install python3 python3-venv

Tiếp theo, bạn sẽ tạo một môi trường ảo để tách biệt các package Python khỏi quá trình cài đặt hệ thống của Python. Để thực hiện việc này, trước tiên hãy tạo một thư mục mà bạn sẽ tạo môi trường ảo của mình. Tạo một thư mục mới tại ~/.venvs:

mkdir ~/.venvs

Bây giờ hãy tạo môi trường ảo Python của bạn:

python3 -m venv ~/.venvs/slackbot

Tiếp theo, kích hoạt môi trường ảo của bạn để có thể sử dụng, cài các gói cài đặt Python:

source ~/.venvs/slackbot/bin/activate

Shell prompt của bạn bây giờ sẽ hiển thị môi trường ảo có syntax trong ngoặc đơn. Kết quả sẽ hiện ra prefix như sau:

(slackbot)sammy@slackbotserver:$

Bây giờ, hãy sử dụng pip để cài đặt các gói Python cần thiết vào môi trường ảo của bạn:

pip install slackclient slackeventsapi Flask

slackclientslackeventsapi tạo điều kiện thuận lợi cho sự tương tác của Python với các API của Slack. Flask là một microweb framework phổ biến mà bạn sẽ sử dụng để triển khai ứng dụng.
Vậy là bạn đã thiết lập môi trường dành cho nhà phát triển, bạn có thể bắt đầu viết Python Slackbot của mình.

Bước 3: Tạo ra class tin nhắn Slackbot bằng Python

Tin nhắn trong Slack được gửi qua payload JSON được định dạng một cách cụ thể. Đây là một ví dụ về JSON mà Slackbot của bạn sẽ tạo và gửi dưới dạng tin nhắn:

{
   "channel":"channel",
   "blocks":[
      {
         "type":"section",
         "text":{
            "type":"mrkdwn",
            "text":"Sure! Flipping a coin....\n\n"
         }
      },
      {
         "type":"section",
         "text":{
            "type":"mrkdwn",
            "text":"*flips coin* The result is Tails."
         }
      }
   ]
}

Bạn có thể tạo JSON này theo cách thủ công và gửi đi, nhưng thay vào đó hãy xây dựng một class Python không chỉ tạo ra payload này mà còn mô phỏng việc tung đồng xu.
Đầu tiên sử dụng lệnh touch để tạo một tệp có tên coinbot.py:

touch coinbot.py

Tiếp theo, mở tệp này bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:

nano coinbot.py

Bây giờ hãy thêm các dòng code sau để nhập các thư viện có liên quan cho ứng dụng của bạn. Thư viện duy nhất bạn cần cho lớp này là thư viện random từ Python Standard Library. Thư viện này sẽ cho phép mô phỏng việc tung đồng xu.
Thêm các dòng sau vào coinbot.py để nhập tất cả các thư viện cần thiết:

# import the random library to help us generate the random numbers
import random

Tiếp theo, tạo lớp CoinBot của bạn và một phiên bản của lớp này để tạo payload tin nhắn. Thêm các dòng sau vào coinbot.py để tạo lớp CoinBot:

...
class CoinBot:

Bây giờ lùi sau từng dòng một và tạo các hằng số, hàm tạo và phương thức cần thiết cho class của bạn. Trước tiên, hãy tạo hằng số để giữ phần base của payload trong tin nhắn. Phần này chỉ định rằng hằng số này thuộc loại section và văn bản được định dạng thông qua đánh dấu.

Phần này cũng chỉ định văn bản bạn muốn hiển thị. Bạn có thể đọc thêm về các tùy chọn payload khác nhau trong tài liệu chính thức về tải trọng tin nhắn Slack. Ghi thêm các dòng sau vào coinbot.py để tạo template cho payload:

...
    # Create a constant that contains the default text for the message
    COIN_BLOCK = {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": (
                "Sure! Flipping a coin....\n\n"
            ),
        },
    }

Tiếp theo, tạo một hàm tạo cho lớp của bạn để bạn có thể tạo một phiên bản riêng của bot cho mọi request. Đừng lo lắng về hao tổn bộ nhớ; tiến trình thu gom rác của Python sẽ dọn sạch các instance khi chúng không còn cần thiết nữa. Đoạn code này đặt kênh người nhận dựa trên tham số được truyền cho hàm tạo.
Ghi thêm các dòng sau vào coinbot.py để tạo hàm constructor:

...
    # The constructor for the class. It takes the channel name as the a
    # parameter and sets it as an instance variable.
    def __init__(self, channel):
        self.channel = channel

Bây giờ hãy viết code để mô phỏng việc tung đồng xu. Bạn sẽ tạo ngẫu nhiên số 1 hoặc 0, tương ứng với mặt ngửa hoặc mặt sấp.
Ghi thêm các dòng sau vào coinbot.py để mô phỏng việc tung đồng xu và trả về payload:

...
    # Generate a random number to simulate flipping a coin. Then return the 
    # crafted slack payload with the coin flip message.
    def _flip_coin(self):
        rand_int =  random.randint(0,1)
        if rand_int == 0:
            results = "Heads"
        else:
            results = "Tails"

        text = f"The result is {results}"

        return {"type": "section", "text": {"type": "mrkdwn", "text": text}},

Cuối cùng, hãy tạo một phương thức thủ công và trả về toàn bộ nội dung tin nhắn, bao gồm cả dữ liệu từ hàm tạo của bạn, bằng cách gọi phương thức _flip_coin. Ghi thêm các dòng sau vào coinbot.py để tạo phương thức thực hiện chức năng tạo payload:

...
    # Craft and return the entire message payload as a dictionary.
    def get_message_payload(self):
        return {
            "channel": self.channel,
            "blocks": [
                self.COIN_BLOCK,
                *self._flip_coin(),
            ],
        }

Bây giờ bạn đã hoàn thành class CoinBot và đã sẵn sàng để thử nghiệm. Trước khi tiếp tục, hãy xác minh rằng file coinbot.py chứa các nội dung sau:

# import the random library to help us generate the random numbers
import random

# Create the CoinBot Class
class CoinBot:

    # Create a constant that contains the default text for the message
    COIN_BLOCK = {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": (
                "Sure! Flipping a coin....\n\n"
            ),
        },
    }

    # The constructor for the class. It takes the channel name as the a 
    # parameter and then sets it as an instance variable
    def __init__(self, channel):
        self.channel = channel

    # Generate a random number to simulate flipping a coin. Then return the 
    # crafted slack payload with the coin flip message.
    def _flip_coin(self):
        rand_int =  random.randint(0,1)
        if rand_int == 0:
            results = "Heads"
        else:
            results = "Tails"

        text = f"The result is {results}"

        return {"type": "section", "text": {"type": "mrkdwn", "text": text}},

    # Craft and return the entire message payload as a dictionary.
    def get_message_payload(self):
        return {
            "channel": self.channel,
            "blocks": [
                self.COIN_BLOCK,
                *self._flip_coin(),
            ],
        }

Lưu và đóng tập tin.
Bây giờ bạn đã có một class Python sẵn sàng thực hiện công việc cho Slackbot của mình, hãy đảm bảo rằng lớp này tạo ra một payload thông báo hữu ích và bạn có thể gửi đến workspace của mình.

Bước 4: Thử nghiệm việc nhắn tin

Bây giờ hãy kiểm tra xem lớp này có tạo ra một payload phù hợp không. Tạo một file có tên coinbot_test.py:

nano coinbot_test.py

Đảm bảo thay đổi tên kênh khi khởi tạo lớp coinbot coin_bot = coinbot("#YOUR_CHANNEL_HERE"). Đoạn mã này tạo một ứng dụng client Slack bằng Python sẽ gửi một thông báo đến kênh mà bạn chỉ định rằng bạn đã cài đặt ứng dụng vào:

from slack import WebClient
from coinbot import CoinBot
import os

# Create a slack client
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))

# Get a new CoinBot
coin_bot = CoinBot("#YOUR_CHANNEL_HERE")

# Get the onboarding message payload
message = coin_bot.get_message_payload()

# Post the onboarding message in Slack
slack_web_client.chat_postMessage(**message)

Lưu và đóng tập tin.
Trước khi có thể chạy file này, bạn cần xuất mã thông báo Slack mà bạn đã lưu ở Bước 1 dưới dạng biến môi trường:

export SLACK_TOKEN="your_bot_user_token"

Bây giờ hãy kiểm tra tệp này và xác định rằng payload được tạo và gửi bằng cách chạy tập lệnh sau trong terminal của bạn. Đảm bảo rằng môi trường ảo của bạn đã được kích hoạt. Bạn có thể xác minh điều này bằng cách xem văn bản (slackbot) ở phía trước dấu nhắc bash prompt của bạn. Chạy lệnh này, bạn sẽ nhận được một tin nhắn từ Slackbot của mình với kết quả tung đồng xu:

python coinbot_test.py

Kiểm tra kênh mà bạn đã cài đặt ứng dụng của mình vào và xác minh rằng bot của bạn thực sự đã gửi tin nhắn về việc tung đồng xu. Kết quả của bạn sẽ là mặt ngửa (head) hoặc mặt sấp (tail).

Kết quả việc tung đồng xu
Kết quả việc tung đồng xu

Bây giờ bạn đã xác minh rằng Slackbot của bạn có thể tung đồng xu, tạo tin nhắn và gửi tin nhắn, hãy tạo một ứng dụng Flask để chạy ứng dụng này vĩnh viễn đồng thời là chia sẻ kết quả bất cứ khi nào ứng dụng nhìn thấy một số văn bản nhất định trong tin nhắn gửi trong kênh.

Bước 5: Tạo ra ứng dụng Flask để chạy Slackbot

Vậy là bạn đã có một ứng dụng đang hoạt động có thể gửi tin nhắn đến workspace Slack của mình, bạn cần tạo một quy trình đầy đủ để bot của bạn có thể nghe tin nhắn được gửi trong kênh và trả lời chúng nếu văn bản đáp ứng các tiêu chí nhất định. Bạn sẽ sử dụng framework Python Flask để chạy quy trình này và lắng nghe các event trong kênh.
Trong phần này, bạn sẽ chạy ứng dụng Flask từ một máy chủ có địa chỉ IP public để API Slack có thể gửi cho bạn các sự kiện. Nếu bạn đang chạy ứng dụng này trên máy local của mình, bạn sẽ cần chuyển tiếp cổng từ firewall sang cổng sẽ chạy trên máy trạm của bạn. Các cổng này có thể giống nhau và hướng dẫn này sẽ được thiết lập để sử dụng cổng 3000.
Trước tiên, hãy điều chỉnh cài đặt firewall của bạn để cho phép lưu lượng truy cập qua cổng 3000:

sudo ufw allow 3000

Bây giờ hãy kiểm tra trạng thái của ufw:

sudo ufw status

Output sẽ hiển thị như sau:

Output
Status: active

To                            Action        From
--                              ------           ----
OpenSSH                 ALLOW      Anywhere
3000                       ALLOW       Anywhere
OpenSSH (v6)         ALLOW       Anywhere (v6)
3000 (v6)                ALLOW       Anywhere (v6)

Bây giờ hãy tạo tệp cho ứng dụng Flask của bạn. Đặt tên cho tệp này là app.py:

touch app.py

Tiếp theo, mở tệp này trong trình soạn thảo văn bản yêu thích của bạn:

nano app.py

Bây giờ hãy thêm các câu statements sau. Bạn sẽ import các thư viện vì những lý do sau:

  • import os – Để truy cập các biến môi trường.
  • import logging – Để ghi nhật ký các sự kiện của ứng dụng.
  • from flask import Flask – Để tạo ứng dụng Flask.
  • from flask import WebClient – Để gửi tin nhắn qua Slack.
  • from slackeventsapi import SlackEventAdapter – Để nhận các sự kiện từ Slack và xử lý chúng.
  • from coinbot import CoinBot – Để tạo một phiên bản CoinBot của bạn và tạo tải trọng tin nhắn.

Ghi thêm các dòng sau vào app.py để nhập tất cả các thư viện cần thiết:

import os
import logging
from flask import Flask
from slack import WebClient
from slackeventsapi import SlackEventAdapter
from coinbot import CoinBot

Bây giờ hãy tạo ứng dụng Flask và đăng ký Slack Event Adapter cho ứng dụng Slack tại endpoit /slack/event. Thao tác này sẽ tạo một lộ trình trong ứng dụng Slack của bạn, nơi các sự kiện Slack sẽ được gửi và nhập. Để làm điều này, bạn sẽ cần nhận một token khác từ ứng dụng Slack của mình, bạn sẽ thực hiện việc này sau trong hướng dẫn.

Khi bạn nhận được biến này, bạn sẽ xuất dưới dạng biến môi trường có tên SLACK_EVENTS_TOKEN. Hãy tiếp tục và viết mã khi tạo SlackEventAdapter, mặc dù bạn chưa đặt mã thông báo.
Ghi thêm các dòng sau vào app.py để tạo ứng dụng Flask và đăng ký event adapter vào ứng dụng này:

...
# Initialize a Flask app to host the events adapter
app = Flask(__name__)

# Create an events adapter and register it to an endpoint in the slack app for event ingestion.
slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)

Tiếp theo, hãy tạo một đối tượng web client cho phép ứng dụng của bạn thực hiện các hành động trong workspace, cụ thể là để gửi tin nhắn. Điều này tương tự như những gì bạn đã làm khi kiểm tra tệp coinbot.py của mình trước đây.
Gõ thêm dòng sau vào app.py để tạo slack_web_client này:

...
# Initialize a Web API client
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))

Đến đây, hãy tạo một function có thể được gọi để tạo phiên bản CoinBot, sau đó sử dụng instance này để tạo payload tin nhắn và chuyển payload đến ứng dụng web Slack để gửi. Hàm này sẽ nhận một tham số duy nhất đó là channel, sẽ chỉ định kênh nào nhận được tin nhắn.
Ghi thêm các dòng sau vào app.py để tạo chức năng này:

...
def flip_coin(channel):
    """Craft the CoinBot, flip the coin and send the message to the channel
    """
    # Create a new CoinBot
    coin_bot = CoinBot(channel)

    # Get the onboarding message payload
    message = coin_bot.get_message_payload()

    # Post the onboarding message in Slack
    slack_web_client.chat_postMessage(**message)

Bây giờ bạn đã tạo một function để xử lý việc nhắn tin trong ứng dụng, hãy tạo một chức năng giám sát các sự kiện Slack cho một hành động nhất định và sau đó thực thi bot. Bạn sẽ cấu hình ứng dụng của mình để phản hồi với kết quả giả lập tung đồng xu khi ứng dụng nhìn thấy cụm từ “Hey Sammy, Flip a coin”. Bạn sẽ chấp nhận bất kỳ kết quả của trường hợp này – trường hợp này sẽ không ngăn ứng dụng phản hồi.
Trước tiên, hãy làm phong phú thêm function của bạn bằng cú pháp @slack_events_adapter.on cho phép hàm của bạn nhận các sự kiện. Chỉ định rằng bạn chỉ muốn các sự kiện tin nhắn và yêu cầu hàm của bạn chấp nhận tham số payload chứa tất cả thông tin Slack cần thiết.

Khi bạn có payload này, bạn sẽ chuẩn hóa đoạn text và tiến hành phân tích. Sau đó, nếu nhận được cụm từ kích hoạt, ứng dụng của bạn sẽ gửi kết quả tung đồng xu. Ghi thêm đoạn code sau vào app.py để nhận, phân tích và xử lý các tin nhắn đến:

# When a 'message' event is detected by the events adapter, forward that payload
# to this function.
@slack_events_adapter.on("message")
def message(payload):
    """Parse the message event, and if the activation string is in the text,
    simulate a coin flip and send the result.
    """

    # Get the event data from the payload
    event = payload.get("event", {})

    # Get the text from the event that came through
    text = event.get("text")

    # Check and see if the activation phrase was in the text of the message.
    # If so, execute the code to flip a coin.
    if "hey sammy, flip a coin" in text.lower():
        # Since the activation phrase was met, get the channel ID that the event
        # was executed on
        channel_id = event.get("channel")

        # Execute the flip_coin function and send the results of
        # flipping a coin to the channel
        return flip_coin(channel_id)

Cuối cùng, tạo main để thực hiện ghi nhật ký để bạn có thể xem phần bên trong ứng dụng của mình cũng như khởi chạy ứng dụng trên địa chỉ IP bên ngoài của bạn trên cổng 3000. Để nhập các sự kiện từ Slack, chẳng hạn như khi có tin nhắn mới được gửi, bạn phải kiểm tra ứng dụng của mình trên một địa chỉ IP public.
Gõ thêm các dòng sau vào app.py để thiết lập main của bạn:

if __name__ == "__main__":
    # Create the logging object
    logger = logging.getLogger()

    # Set the log level to DEBUG. This will increase verbosity of logging messages
    logger.setLevel(logging.DEBUG)

    # Add the StreamHandler as a logging handler
    logger.addHandler(logging.StreamHandler())

    # Run your app on your externally facing IP address on port 3000 instead of
    # running it on localhost, which is traditional for development.
    app.run(host='0.0.0.0', port=3000)

Bây giờ bạn đã hoàn thành với ứng dụng Flask và đã sẵn sàng để thử nghiệm. Trước khi bạn tiếp tục xác minh rằng tệp đã hoàn thành của mình, app.py chứa các nội dung sau:

import os
import logging
from flask import Flask
from slack import WebClient
from slackeventsapi import SlackEventAdapter
from coinbot import CoinBot

# Initialize a Flask app to host the events adapter
app = Flask(__name__)
# Create an events adapter and register it to an endpoint in the slack app for event injestion.
slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)

# Initialize a Web API client
slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))

def flip_coin(channel):
    """Craft the CoinBot, flip the coin and send the message to the channel
    """
    # Create a new CoinBot
    coin_bot = CoinBot(channel)

    # Get the onboarding message payload
    message = coin_bot.get_message_payload()

    # Post the onboarding message in Slack
    slack_web_client.chat_postMessage(**message)


# When a 'message' event is detected by the events adapter, forward that payload
# to this function.
@slack_events_adapter.on("message")
def message(payload):
    """Parse the message event, and if the activation string is in the text, 
    simulate a coin flip and send the result.
    """

    # Get the event data from the payload
    event = payload.get("event", {})

    # Get the text from the event that came through
    text = event.get("text")

    # Check and see if the activation phrase was in the text of the message.
    # If so, execute the code to flip a coin.
    if "hey sammy, flip a coin" in text.lower():
        # Since the activation phrase was met, get the channel ID that the event
        # was executed on
        channel_id = event.get("channel")

        # Execute the flip_coin function and send the results of
        # flipping a coin to the channel
        return flip_coin(channel_id)

if __name__ == "__main__":
    # Create the logging object
    logger = logging.getLogger()

    # Set the log level to DEBUG. This will increase verbosity of logging messages
    logger.setLevel(logging.DEBUG)

    # Add the StreamHandler as a logging handler
    logger.addHandler(logging.StreamHandler())

    # Run our app on our externally facing IP address on port 3000 instead of
    # running it on localhost, which is traditional for development.
    app.run(host='0.0.0.0', port=3000)

Lưu và đóng tập tin.
Bây giờ ứng dụng Flask đã sẵn sàng để phục vụ ứng dụng của bạn.

Bước 6: Chạy ứng dụng FLask

Ở bước cuối, bạn sẽ tập hợp mọi thứ lại với nhau và chạy ứng dụng. Trước tiên, hãy thêm ứng dụng đang chạy của bạn làm trình xử lý được ủy quyền cho Slackbot.
Điều hướng đến phần Basic Information của ứng dụng trong Slack UI. Cuộn xuống cho đến khi bạn tìm thấy App Credentials.

Kéo xuống mục App Credentials
Kéo xuống mục App Credentials

Sao chép Signing Secret và xuất dưới dạng biến môi trường SLACK_EVENTS_TOKEN:

export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"

Với điều này, bạn có tất cả các token API cần thiết để chạy ứng dụng của mình. Tham khảo Bước 1 nếu bạn cần xem lại cách xuất SLACK_TOKEN. Bây giờ bạn có thể khởi động ứng dụng của mình và xác minh rằng thiết lập vừa rồi đang chạy. Đảm bảo rằng môi trường ảo của bạn đã được kích hoạt và chạy lệnh sau để khởi động ứng dụng Flask:

python3 app.py

Bạn sẽ thấy một output như thế này:

(slackbot) [20:04:03] sammy:coinbot$ python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:3000/ (Press CTRL+C to quit)

Để xác minh rằng ứng dụng của bạn đã hoạt động, hãy mở một terminal mới và nhập địa chỉ IP của máy chủ của bạn với đúng cổng tại /slack/events:

curl http://YOUR_IP_ADDRESS:3000/slack/events

curl sẽ trả về như sau:

Output
These are not the slackbots you're looking for.

Nhận được thông báo These are not the slackbots you're looking for., cho biết ứng dụng của bạn đã được thiết lập và đang chạy.
Bây giờ, hãy để ứng dụng Flask này chạy trong khi bạn hoàn tất việc cấu hình ứng dụng của mình trong Slack UI.
Trước tiên, hãy cấp cho ứng dụng của bạn các quyền thích hợp để ứng dụng có thể nghe tin nhắn và phản hồi tương ứng. Nhấp vào Event Subcriptions trong thanh bên giao diện người dùng và bật nút Enable Events.

Bật nút Enable Events
Bật nút Enable Events

Khi bạn đã hoàn thành việc đó, hãy nhập địa chỉ IP, cổng và endpoint /slack/events của bạn vào Request URL. Đừng quên prefix giao thức HTTP. Slack sẽ cố gắng kết nối với endpoint của bạn. Khi đã được thực hiện thành công, bạn sẽ thấy một dấu check màu xanh lá với từ Verified ở bên cạnh.

Nhấn On để bật Events
Nhấn On để bật Events

Tiếp theo, hãy mở rộng phần Subscribe to bot events và thêm quyền message.channels vào ứng dụng. Điều này sẽ cho phép ứng dụng nhận tin nhắn từ kênh và xử lý chúng.

Thêm quyền vào ứng dụng
Thêm quyền vào ứng dụng

Khi bạn đã hoàn thành việc này, bạn sẽ thấy sự kiện được liệt kê trong phần Subscibe to bot events. Tiếp theo, nhấp vào nút Save Changes màu xanh lá ở góc dưới cùng bên phải.

Nhấn nút Save Changes
Nhấn nút Save Changes

Sau khi thực hiện việc này, bạn sẽ thấy một biểu ngữ màu vàng ở đầu màn hình thông báo rằng bạn cần cài đặt lại ứng dụng của mình để áp dụng những thay đổi. Mỗi khi bạn thay đổi quyền, bạn sẽ cần cài đặt lại ứng dụng của mình. Nhấp vào liên kết cài đặt lại ứng dụng của bạn trong biểu ngữ này để cài đặt lại ứng dụng của bạn.

Dòng thông báo màu vàng
Dòng thông báo màu vàng

Màn hình sẽ hiển thị xác nhận tóm tắt các quyền mà bot của bạn sẽ có và bạn có muốn cho phép cài đặt hay không. Nhấp vào nút Allow màu xanh để kết thúc quá trình cài đặt.

Nhấn Allow để kết thúc quá trình cài đặt
Nhấn Allow để kết thúc quá trình cài đặt

Quay lại kênh mà bạn đã cài đặt CoinBot, vào và gửi một tin nhắn có chứa cụm từ Hey Sammy, Flip a coin. Bot của bạn sẽ tung một đồng xu và trả lời kèm theo kết quả. Đến đây bạn đã tạo một Slackbot thành công.

Lưu ý: Hiện tại ứng dụng đã sẵn sàng để được khai thác trên môi trường production, nhưng người dùng cần triển khai trên máy chủ trước tiên. Lí do là Flask không phải là môi trường có tính an toàn. Người dùng có nhiều cách để triển khai tốt hơn như Docker hay uWSGI,… và đều hỗ trợ Flask rất tốt.

Với 11 năm hoạt động Vietnix hỗ trợ cho hơn 50.000 khách hàng cá nhân và doanh nghiệp phát triển kinh doanh trên internet. Vietnix luôn chú trọng đầu tư vào hạ tầng và nhân sự chất lượng nhằm mang đến cho khách hàng một dịch vụ ổn định nhất. Tính đến thời điểm hiện tại Vietnix tự hào vì đã đạt được những con số ấn tượng như sau:

  • 50.000 khách hàng.
  • 97% khách hàng đánh giá 5* và giới thiệu dịch vụ sau khi sử dụng.
  • 89% khách hàng duy trì dịch vụ đến thời điểm hiện tại.
  • 100.000 dịch vụ được kích hoạt.
  • Thương hiệu Việt Nam xuất sắc 2022.

Nhanh tay đăng ký Vietnix VPS ngay và trải nghiệm dịch vụ ổn định, tốc độ cao, hỗ trợ nhanh chóng với nhiều ưu đãi hấp dẫn nhất.

  • Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
  • Hotline: 1800 1093.
  • Email: sales@vietnix.com.vn

Lời kết

Như vậy là bạn đã tạo Slackbot bằng Python trên Ubuntu 20.04 thành công. Từ bài viết này bạn có thể tự tùy biến thêm các đoạn code và sửa đổi để phù hợp với nhu cầu, cho dù đó là hỗ trợ tự động, quản lý tài nguyên, hình ảnh,… Nếu có gì thắc mắc bạn có thể để lại bình luận bên dưới để được Vietnix hỗ trợ.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Kết nối với mình qua

Kết nối với mình qua

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

Chỉ số tăng trưởng

Điểm Desktop

100 (+39)

Điểm Mobile

100 (+67)

Core Web Vitals

Passed

Lĩnh vực

Ecommerce

Chỉ số tăng trưởng

Điểm Desktop

99 (+28)

Điểm Mobile

100 (+50)

Core Web Vitals

Passed

Lĩnh vực

SEO

Chỉ số tăng trưởng

Điểm Desktop

99 (+26)

Điểm Mobile

98 (+59)

Core Web Vitals

Passed

Lĩnh vực

Ecommerce

Chỉ số tăng trưởng

Điểm Desktop

100 (+8)

Điểm Mobile

98 (+35)

Core Web Vitals

Passed

Lĩnh vực

Giáo Dục

Chỉ số tăng trưởng

Điểm Desktop

100 (+61)

Điểm Mobile

100 (+61)

Core Web Vitals

Passed

Lĩnh vực

Giáo Dục

Võ Thiên Tòng

25 Tháng 2 lúc 21:09

·

Mình muốn gửi lời cảm ơn chân thành đến Team Vietnix, anh Hưng Nguyễn, anh Vietnix Trung, em Quốc Huy đã hỗ trợ tối ưu Page Speed Insight (PSI) cho website vanvoiminhhoa.vn của mình.
Biết đến anh Hưng đã lâu nhưng chưa có duyên sử dụng dịch vụ bên anh. Tình cờ thấy được bài Post của anh về việc hỗ trợ tối ưu PSI miễn phí chỉ với vài Slot, thấy AE cmt khá nhiều nên cũng không nghĩ tới lượt mình. Hôm sau đánh liều inbox 1 phen xem sao thì may mắn được đưa vào danh sách. Vài ngày sau được Team Vietnix liên hệ và hỗ trợ.
Kết quả đạt được:
• Điểm xanh lè xanh lét
• Tốc độ tải trang nhanh hơn hẳn
• Các chỉ số cũng được cải thiện đáng kể
• Và mình tin rằng với việc PSI được cải thiện cũng thúc đẩy những thứ khác đi lên theo!
Mình thực sự hài lòng với dịch vụ của Vietnix và muốn giới thiệu đến tất cả mọi người:
• Dịch vụ Wordpress Hosting: Tốc độ nhanh, ổn định, bảo mật cao, hỗ trợ kỹ thuật 24/7. (https://vietnix.vn/wordpress-hosting/)
• Dịch vụ Business Hosting: Dung lượng lớn, phù hợp cho website có lượng truy cập cao, tích hợp nhiều tính năng cao cấp. (https://vietnix.vn/business-hosting/)
Đặc biệt, Vietnix đang có chương trình ưu đãi:
• Giảm giá 20% trọn đời khi nhập code THIENTONG_PAGESPEED tại trang thanh toán (Chu kỳ 12 tháng trở lên)
• Tặng 1 lần tối ưu điểm Page Speed Insight cho 1 website
Cám ơn Vietnix một lần nữa!
#Vietnix #Vanvoiminhhoa #Pagespeedinsight
Trước khi tối ưu
Sau khi tối ưu
Thiện Nguyễn - CEO SEO Dạo

5 Tháng 3 lúc 16:21

·

CORE WEB VITAL YẾU TỐ XẾP HẠNG TÌM KIẾM SEO
Core Web Vitals là một tập hợp các chỉ số đo lường hiệu suất của trang web từ góc độ người dùng, được Google sử dụng để đánh giá trải nghiệm người dùng trên các trang web. Các chỉ số chính bao gồm:
– Largest contentful paint (LCP): Tốc độ render của page. Mục tiêu là dưới 2,5 giây.
– First input delay (FID): Tốc độ phản hồi của website với tương tác của người dùng. Mục tiêu là dưới 100ms.
– Cumulative Layout Shift (CLS): Độ ổn định của bố cục trang. Mục tiêu là dưới 0.1.
Tất cả các chỉ số này đo lường các khía cạnh quan trọng của trải nghiệm người dùng trên trang web. Google đã công bố rằng từ tháng 5 năm 2021, các Core Web Vitals sẽ được sử dụng làm một trong các yếu tố đánh giá trong việc xếp hạng trang web trên kết quả tìm kiếm. Do đó, hiểu và cải thiện các Core Web Vitals là rất quan trọng đối với SEO.
Tóm lại, Core Web Vitals không chỉ giúp cải thiện hiệu suất và xếp hạng trang web trên công cụ tìm kiếm, mà còn cải thiện trải nghiệm của người dùng khi họ truy cập và tương tác với trang website.
P/s: mình đang có gói hỗ trợ đặc biệt cho anh em tối ưu tốc độ bên VIETNIX:
– Giảm 20% lifetime dịch vụ Hosting Business và Hosting Wordpress chu kỳ 12 tháng trở lên.
– Tặng 1 lần tối ưu điểm Page Speed Insight cho 1 website.
Anh em có nhu cầu đăng ký qua bạn Vietnix Trung này nhé và nhập mã SEODAO_PAGESPEED để được ưu đãi nhé.😁
Trước khi tối ưu
Sau khi tối ưu SEO Dạo
Icharm review

5 Tháng 3 lúc 15:43

·

[Mình vừa được hỗ trợ tối ưu page speed website]
Trước khi được tối ưu, web của mình điểm rất thấp, đặc biệt là mobile chỉ có 39. Cơ duyên thế nào lúc lướt face lại va phải chương trình tối ưu pagespeed bên Vietnix.
Sau khi được Trần Hoàng Phúc và team Vietnix hỗ trợ nhiệt tình, điểm web vọt lên 98 99 (như hình bên dưới). Dùng thử web thì thấy quá là mượt, 10 điểm cho team Vietnix.
Nói thật thì mình thật sự ấn tượng về sự nhiệt huyết, tận tâm và rất chuyên nghiệp bên Vietnix.
Anh em có nhu cầu về hosting hay có vấn đề về website như:
1. Web load chậm
2. Khách rời web vì đợi tải nội dung, hình ảnh lâu
3. Hay tất tần tật mọi thứ về website
THÌ LIÊN HỆ NGAY VIETNIX NHÉ!
Và đừng quên dùng pass “ICHARM_PAGESPEED” để được giảm 20% trọn đời hosting business và wp hosting. Quả code này còn được tặng 1 lần tối ưu pagespeed nữa nhé, ưu đãi chắc cũng phải nhất nhì thị trường luôn.
Trước khi tối ưu
Sau khi tối ưu
Hoàng Nguyễn

29 Tháng 2 lúc 17:04

·

Xin chào mọi người! Vừa rồi mình có sử dụng dịch vụ tối ưu website, tăng tốc độ tải trang pagespeed của Vietnix kết quả trên cả tuyệt vời nên mình viết bài này để chia sẻ thông tin với các bạn.
Lý do mình chọn dịch vụ tối ưu tốc độ website của Vietnix:
✅ Đội ngũ chuyên gia giàu kinh nghiệm: Đã tối ưu thành công cho hàng nghìn website trong nhiều lĩnh vực khác nhau. Các bạn nhân viên rất thân thiện, nhiệt tình và chủ động trong quá trình làm việc để cập nhật tiến độ.
✅ Quy trình chuyên nghiệp:
– Kiểm tra và phân tích: Vietnix sử dụng các công cụ tiên tiến để kiểm tra và phân tích tốc độ website của bạn.
– Xác định nguyên nhân: Vietnix xác định nguyên nhân khiến website tải chậm và đưa ra giải pháp tối ưu phù hợp.
– Tối ưu hóa website: Vietnix áp dụng các kỹ thuật tối ưu tiên tiến nhất để tăng tốc độ tải trang.
– Báo cáo kết quả: Vietnix cung cấp báo cáo chi tiết về kết quả tối ưu hóa website.
Công nghệ tiên tiến: Vietnix sử dụng các công nghệ tối ưu mới nhất như LiteSpeed, LSCache, Memcached, Redis, v.v.
✅ Cam kết kết quả: Vietnix cam kết tăng tốc độ website của bạn lên tối thiểu 90%.
✅ Giá cả cạnh tranh: Vietnix cung cấp dịch vụ tối ưu tốc độ website với mức giá cạnh tranh nhất trên thị trường.
📣 Để đăng ký sử dụng dịch vụ tối ưu tốc độ website và các dịch vụ khác như hosting, vps, domain… các bạn có thể đăng ký tại https://portal.vietnix.vn/aff.php?aff=57 hoặc Inbox cho sếp Vietnix Trung nhé.
Các bạn có thể kiểm tra tốc độ trang của mình https://lasan.edu.vn hoặc một vài trang khác đã sử dụng dịch vụ của Vietnix như sau:
https://pagespeed.web.dev/…/https…/v8beqewyt2…
https://pagespeed.web.dev/…/https…/etiohjvtl4…
https://pagespeed.web.dev/…/https…/yczuqpw6d1…
https://pagespeed.web.dev/…/https…/xf9y65kuzk…
https://pagespeed.web.dev/…/https…/fdrsms15en…
https://pagespeed.web.dev/…/https…/s7p9cgzeri…
Trước khi tối ưu
Sau khi tối ưu
Dũng cá xinh

30 Tháng 1 lúc 19:09

·

[Đỉnh]
Em có dùng hosting, vps, cloud vps, cloud server, dedicated server của rất nhiều bên từ trong nước đến nước ngoài để hosting khoảng 2,000+ domain. Mỗi bên đều có ưu nhược khác nhau, nhưng có 1 số bên đặc biệt “bá đạo”, trong đó có: Vietnix!!!!

Lần đầu tiên em được cả CEO Hưng Nguyễn lẫn Master về dev Vietnix Trung của 1 đơn vị hàng đầu liên quan đến Hosting, Server support từ A – Z (từ Zalo, Tele, đến FB và cả Phone)

Em có khá nhiều web dạng Big Data (bài, ảnh, database, data) lên đến hàng trăm Gb. Càng to thì nó càng có nhiều vấn đề về phần phản hồi ban đầu (nhược điểm cố hữu của php wordpress so với nativejs, reactjs, html, headless,…), và anh em Vietnix có nhã ý hỗ trợ xử lý phần Speed Insight này.

Kết quả thực sự kinh ngạc, từ cách trao đổi đến xử lý vấn đề, cut off những cái cần cut off, xử lý rất sâu vấn đề và gợi ý rất nhiều ý tưởng optimize hệ thống!!!! Thực sự quá hài lòng về kết quả cũng như cách tương tác của các đầu tầu bên Vietnix ^^!!!

Nhân cơ duyên được kết nối với những cao thủ của Vietnix, em xin chia sẻ và lan tỏa để nhiều anh em có cơ hội được sử dụng những dịch vụ tốt nhất với giá vô cùng hợp lý!!!!

1 – Với anh em chưa có hosting, em đặc biệt recommend sử dụng hosting bên Vietnix:
– Sử dụng mã DUNGCAXINH_PAGESPEED sẽ được giảm 20% trọn đời (lifetime luôn)
– Áp dụng các gói Hosting Business, Hosting wordpress và reg 1 năm trở lên
– Anh em chưa biết cách reg thì còm men hoặc ib để em hướng dẫn hoặc nhờ các bạn bên Vietnix support từ A – Z

2 – Anh em có hosting rồi và muốn build blog hoặc web = wordpress mà chưa có giao diện thì nhân tiện em đang có tài khoản Premium bên Envato, em sẽ tặng bất kỳ giao diện nào có trên Envato Themes (Link em để dưới còm men) ạ. Cả nhà còm hoặc ib em Themes mà mọi người “chim ưng”, em sẽ cho anh em tải về, up drive và gửi ạ!!! (Chương trình này kéo dài đến ngày 29 tết âm lịch ạ)

3 – BEST NHẤT luôn!!!! Anh em nào mua hosting dùng mã DUNGCAXINH_PAGESPEED sẽ được tối ưu 100 điểm tốc độ cho 1 web (đây là ưu đãi riêng của CEO Hưng Nguyễn dành cho bạn bè của #dungcaxinh ^^) (Giá trị nhất là cái vụ số 3 này anh chị em nhé ^^), cơ hội vàng để move về đơn vị hosting uy tín là đây ^^!!!!

Một lần nữa xin chân thành cám ơn 2 đồng chí em: Hưng Nguyễn và Vietnix Trung đã giải được một bài toán khó cho các trang WP Big data mà anh loay hoay bao lâu nay chưa tìm ra đáp án!!! Chúc Vietnix ngày càng phát triển và có một năm 2024 đại đại thắng nhé ^^ !!!!!
#SEO #Vietnix #dungcaxinh

Trước khi tối ưu
Sau khi tối ưu
Hiếu AI

2 Tháng 2 lúc 21:06

·

UY TÍN – TẬN TÂM – TỐC ĐỘ

3 từ trên là vẫn chưa đủ để nói về quy trình làm việc cực chuyên nghiệp của team Vietnix.Chuyện là mình có con website chính đang có lượt truy cập organic hàng ngày cũng tương đối (hình 1)

Vấn đề là, con site này đang nằm trên hosting dùng chung nên tốc độ load chưa nhanh, tốc độ load chưa nhanh thì trải nghiệm visitor chưa tốt, trải nghiệm visitor chưa tốt thì tỷ lệ chuyển đổi ra đơn hàng kiểu gì thì kiểu cũng sẽ bị ảnh hưởng.

Biết rõ là đang mất tiền nhưng không biết xử lý như lào, nghĩ mà cay.

Đang loay hoay thì vận may nó tới, hôm qua đang lướt phở bò thấy a Nguyễn Việt Dũng đăng bài, rảnh nên thả cái comment hóng hớt, ai ngờ ngoằng phát thấy ông Dũng tạo nhóm với Vietnix Trung luôn.

Ae Vietnix thì siêu tốc độ, lập tức lấy thông tin vào việc, không hỏi han lằng nhằng, không kỳ kèo chốt đơn dù lúc đấy cũng đang đêm muộn.
Sáng hôm sau dậy vẫn còn đang lơ ngơ mở điện thoại check tin nhắn thì đã thấy ae Vietnix báo xong việc, trong khi mình vẫn chưa biết có chuyện gì xảy ra @@.

Được cái bấm thử website thì thấy load siêu nhanh, chưa tới một giây là thông tin các thứ hiện hết. Quá phê, thả con ảnh trước sau (hình 2,3) để ace tiện đối chiếu nhé. Thế này thì mình gửi gắm nốt 15 em website còn lại cho team Vietnix thôi chứ không cần nghĩ ngợi gì nữa. 10/10.

Nên là:

  1. Anh chị em muốn có một con website tốc độ load nhanh như tốc độ trở mặt của nyc – Dùng ngay dịch vụ hosting của Vietnix
  2. Anh chị em có website rồi muốn tìm bên hosting uy tín, chuyên nghiệp hỗ trợ không quản ngày đêm – Liên hệ ngay Vietnix Trung
  3. Anh chị em quan tâm đến trải nghiệm khách hàng, từ những cái nhỏ nhất như tăng tốc độ website – Better call Vietnix Trung

Và đừng quên dùng pass “HIEUAI_PAGESPEED” để được giảm 20% trọn đời hosting business và wp hosting, quả code này còn được tặng 1 lần tối ưu pagespeed nữa nhé, ưu đãi chắc cũng phải nhất nhì thị trường luôn.
#SEO #Vietnix #hieuai

Website
Trước khi tối ưu
Sau khi tối ưu

Chỉ số tăng trưởng

Điểm Desktop

100 (+43)

Điểm Mobile

100 (+74)

Core Web Vitals

Passed

Lĩnh vực

AI