YouMind
Đăng nhập

Xây dựng Grok Bot từ số 0 trong một đêm: Hướng dẫn thiết lập đầy đủ + bộ lọc rug copy-paste

@0xboan
TIẾNG ANH17 thg 10, 2026
126K
139
19
20
439

TL;DR

Hướng dẫn này chi tiết cách xây dựng bàn giao dịch Grok Bot từ đầu, tập trung vào bộ lọc rug nghiêm ngặt gồm 14 bước để loại bỏ các token lừa đảo trước khi thực thi. Quy trình nhấn mạnh vào workflow 'code kills, Grok reads, you sign' cùng các biện pháp bảo vệ bằng giao dịch thử nghiệm.

hầu hết mọi người biết đến Grok Bot qua ảnh chụp pnl của ai đó, mở nó lên, chĩa vào một biểu đồ, và mất 50 đô đầu tiên cho một token đã chết từ trước khi họ kịp mua. con bot không phải là vấn đề. chẳng ai bảo nó thế nào là "chết" cả.

đây là bộ khung tôi sẽ dựng lại ngay tối nay nếu phải làm lại từ đầu. một bot, một thư mục, mười file nhỏ. nó không săn x100. nhiệm vụ chính của nó là loại bỏ token, và vài đồng sống sót được vẫn cần Grok đọc X trước khi một đô la duy nhất được chuyển đi.

bước 01 đến 07 dành cho buổi tối đầu tiên: con bot, cái key, các giới hạn, các điểm thoát. 08 đến 12 là bộ lọc rug, 14 bước kiểm tra, mỗi bước đều được viết thành code. 13 và 14 đưa nó vào chế độ tự động, nhưng chạy trên giấy trước đã.

nếu bạn đã đọc bài viết về bàn giao dịch tám agent của tôi, thì đây chính là nền móng mà cái bàn đó đứng lên.

https://x.com/0xboan/status/2092226208234647626

cách dùng: mở Grok Bot của bạn, dán toàn bộ bài viết này vào, và nói "dựng bộ khung này trong /workspace/desk, chế độ paper, hỏi tôi trước khi có gì chạm vào ví." nó sẽ tự viết từng file, trên máy tính của chính nó.

nguyên tắc cốt lõi bạn phải nhớ: code ra tay loại bỏ, Grok đọc X, bạn ký lệnh. không ai trên bàn làm việc của người khác.

01. chuẩn bị bốn thứ trước khi bắt đầu

bốn thứ. mỗi thứ đều ghi rõ nó là gì, bạn làm gì với nó tối nay, và tại sao bộ khung cần nó.

1. Grok Bot

nó là gì. ứng dụng nơi bạn thuê các con bot có tên. mỗi con chạy trên một máy tính đám mây có trình duyệt, file và terminal, và tiếp tục làm việc kể cả khi bạn gập laptop lại.

bạn làm gì. tải nó tại x.ai/bot, đăng nhập, chọn Create your own.

tại sao. toàn bộ hệ thống nằm trên cái máy đó. file, quy trình, cảnh báo, tất cả ở một nơi bạn có thể mở từ điện thoại.

2. một API key của xAI

nó là gì. quyền truy cập trả phí vào Grok từ code, tích hợp sẵn tìm kiếm X.

bạn làm gì. vào console.x.ai, mục API Keys, tạo một cái. đừng dán nó vào đâu vội, bước 03 sẽ chỉ chỗ để nhét vào.

tại sao. một quy trình không thể ngồi ngẫm nghĩ về bốn mươi token trong khung chat. một đoạn script gọi một lần cho mỗi token thì làm được, và nó ghi log mọi câu trả lời theo cùng một định dạng.

3. Rugcheck và DexScreener

nó là gì. hai API công khai miễn phí. Rugcheck đọc contract: quyền mint, LP, holder, insider, ví dev. DexScreener đọc pool: độ sâu, tuổi thọ, lực mua so với bán.

bạn làm gì. không làm gì cả. không cần đăng ký, không cần key để đọc.

tại sao. dữ kiện phải đi trước ý kiến. quyền mint đang mở không phải là phán đoán chủ quan, nó là dữ kiện, và dữ kiện ra tay loại bỏ trước tiên.

4. một ví phụ (burner wallet), nhưng không phải tối nay

nó là gì. một ví Solana mới tinh chưa từng giữ bất cứ thứ gì khác.

bạn làm gì. chưa làm gì cả. tuần đầu tiên chạy trên giấy.

tại sao. bộ khung không bao giờ giữ key. khi bạn chạy thật, nó chỉ bảo bạn mua gì và bạn tự tay ký lệnh.

02. thuê một bot, không phải tám

bàn giao dịch của tôi hiện chạy tám bot. nó không bắt đầu như vậy, và của bạn cũng không nên thế. tám bot trong ngày đầu tiên nghĩa là tám thứ phải debug cùng lúc. một bot với một nhiệm vụ sẽ cho bạn thấy bảy con còn lại sẽ cần gì sau này.

chọn Create your own và đưa cho nó đoạn này, nguyên văn từng chữ:

text
1Tên: RUG DESK
2Nhiệm vụ: Bàn giao dịch memecoin Solana, chạy paper trước
3Mô tả: Dựng và vận hành bộ khung trong /workspace/desk dựa trên bài viết tôi dán vào.
4Mọi token đều phải qua check.py, không ngoại lệ, không đường tắt.
5Bạn không bao giờ được mua, bán, ký hay di chuyển tiền. Bạn không bao giờ sửa config.py trừ khi tôi yêu cầu
6trong khung chat này. Bạn không bao giờ hạ thông số bộ lọc để cho một token lọt qua.
7Báo cáo mỗi lần loại bỏ kèm lý do, không phải ý kiến cá nhân của bạn về token đó.
8Khi một nguồn bị sập, hãy nói rõ nguồn nào và bỏ qua. Không bao giờ được đoán bừa một con số bị thiếu.

hai dòng cuối quan trọng hơn năm dòng đầu. một con bot dám đoán bừa con số bị thiếu rồi sẽ có ngày đoán trúng con số khiến bạn mất tiền.

boan - inline image

03. giấu key khỏi khung chat

mọi thứ bạn gõ cho bot đều rơi vào lịch sử chat. nên key phải được đưa vào một file, do chính bạn gõ, trên máy tính của bot.

mở máy tính của bot, bấm Take over, mở terminal và chạy lệnh này. nó sẽ hỏi key mà không hiển thị ra màn hình, nên key cũng không bao giờ xuất hiện trong lịch sử lệnh:

bash
1mkdir -p /workspace/desk && cd /workspace/desk
2read -rs -p "xai key: " K && printf 'XAI_API_KEY=%s\n' "$K" > .env && unset K
3chmod 600 .env
4pip install requests

sau đó chứng minh key hoạt động trước khi làm bất cứ việc gì khác. gọi một lần thôi, để sau này bạn không bao giờ nhầm lẫn giữa key hỏng và prompt dở:

bash
1curl -s https://api.x.ai/v1/responses \
2 -H "Authorization: Bearer $(cut -d= -f2 .env)" \
3 -H "Content-Type: application/json" \
4 -d '{"model":"grok-4.7","input":"reply with OK"}'
5
6-> ... "type":"output_text","text":"OK" ...

bấm I'm done và trả lại máy tính. từ đây bot có thể vận hành bộ khung, mà vẫn không bao giờ nhìn thấy key trong khung chat.

boan - inline image

04. nhìn toàn bộ phễu trước khi xây bất cứ thứ gì

tám vòng lọc. các vòng miễn phí chạy trước. chỉ những gì sống sót qua vòng miễn phí mới tốn một lượt gọi Grok, và chỉ những gì Grok hô MUA mới tốn tiền. tuần này thì thậm chí chưa tốn tiền.

text
10. LEAD một CA từ bất cứ đâu: cuộc gọi, bài đăng, scan.py -> một địa chỉ mint
21. LIMITS book.py: lỗ ngày, slot trống, thời gian chờ -> miễn phí, không cần mạng
32. FACTS rugcheck.py: 10 tiêu chí loại thẳng tay -> mint mở, LP chưa khóa, top 10 nắm quá nhiều sẽ chết ở đây
43. POOL market.py: độ sâu, tuổi thọ, lực bán -> pool mỏng và honeypot chết ở đây
54. JUDGE grok.py + tìm kiếm X, gọi một lần -> MUA hoặc BỎ QUA, một lý do, một rủi ro
65. FILL paper: book.py khớp giá thật -> live: bạn tự tay ký lệnh
76. WATCH watch.py mỗi 10 phút -> cắt lỗ, chốt lời từng phần, trailing stop, cắt lỗ theo thời gian
87. REPORT report.py lúc 21:30 -> cái nào chết, cái nào sinh lời, cái nào cần nghi ngờ

quyền mint đang mở không phải là phán đoán chủ quan. nó là dữ kiện, và dữ kiện thì miễn phí. Grok chỉ được nhìn thấy những token đã vượt qua mọi bước kiểm tra mà script có thể làm.

boan - inline image

05. gom mọi con số vào một file

lưu thành config.py. mọi con số của bộ khung đều nằm ở đây, nên khi muốn tinh chỉnh, bạn chỉ sửa một file duy nhất. đây là thông số của tôi, chỉnh cho lệnh 25 đô. chúng không phải lời khuyên, chúng là điểm khởi đầu để bạn tự thay đổi.

python
1# config.py
2# mọi con số của bộ khung đều nằm ở đây. khi tinh chỉnh, bạn chỉ sửa file này và không gì khác.
3
4MODEL = "grok-4.7" # kiểm tra console.x.ai -> Models nếu API từ chối
5PAPER = True # tuần đầu: khớp lệnh giả với giá thật. chỉ đổi sau khi bạn đọc xong log
6
7TICKET_USD = 25 # cố định. không bao giờ tăng size vì mấy lệnh trước thắng
8MAX_OPEN = 4 # tối đa 4 x $25 = $100 trên thị trường
9MAX_ENTRIES_PER_DAY = 6
10DAILY_LOSS_HALT_USD = 50 # lỗ thực tế hôm nay chạm mức này -> không vào lệnh mới cho đến mai
11COOLDOWN_HOURS = 24 # không vào lại token vừa thoát ra
12
13FACTS = { # bộ lọc rug. chỉ dùng code, không dùng model
14 "max_risk_score": 40, # score_normalised của rugcheck, 0-100, càng cao càng rủi ro
15 "min_lp_locked_pct": 90, # pool lớn nhất: LP phải được khóa hoặc đốt
16 "max_top10_pct": 30, # top 10 holder, không tính pool và locker
17 "max_dev_pct": 5, # lượng cung còn nằm trong ví creator
18 "max_insiders": 0, # holder bị gắn cờ insider + số hit insider trên graph
19 "min_liquidity_usd": 30000,
20 "max_ticket_share": 0.01, # lệnh của bạn không bao giờ vượt quá 1% pool
21 "min_age_min": 30, # non hơn mức này thì mọi báo cáo vẫn chỉ là đoán mò
22 "max_age_hours": 72,
23}
24
25MIN_CONFIDENCE = 0.7 # Grok hô MUA dưới mức này -> coi như BỎ QUA
26
27EXIT = {
28 "stop_pct": -35, # cắt lỗ cứng tính từ điểm vào
29 "ladder": [(100, 0.50), (200, 0.25)], # lãi +100% bán nửa, +200% bán thêm một phần tư
30 "trail_pct": 30, # phần còn lại: thoát khi giá giảm 30% từ đỉnh
31 "time_stop_hours": 6, # không tăng 20% sau 6 giờ -> thoát, tiền chết
32 "time_stop_min_pct": 20,
33 "liq_drop_pct": 40, # thanh khoản pool giảm 40% so với lúc vào -> thoát ngay
34}
35
36LOG = "checks.csv"
37POSITIONS = "positions.json"
38TRADES = "trades.csv"
text
1LỆNH CỐ ĐỊNH. khối lượng không bao giờ tăng chỉ vì ba lệnh trước thắng.
2BOT ĐỌC config.py, NÓ KHÔNG BAO GIỜ GHI VÀO ĐÓ. con số chỉ thay đổi khi bạn tự tay đổi.
3NỚI LỎNG BỘ LỌC PHẢI ĐƯỢC GHI LẠI. bạn đổi một con số, bạn phải nói lý do trong chat, ngay trong ngày.

06. chạy giới hạn trước mọi thứ khác

lưu thành book.py. bước kiểm tra rẻ nhất trong bộ khung là bước không bao giờ gọi API. nếu hôm nay đã lỗ 50 đô, bộ khung thậm chí không thèm nhìn token. nếu đang có bốn vị thế mở, tương tự. file này cũng là bộ nhớ của hệ thống: hai file bạn có thể tự mở ra xem, positions.json và trades.csv.

python
1# book.py
2# vị thế, giao dịch, giới hạn. bộ nhớ của hệ thống nằm trong hai file bạn có thể tự mở.
3import csv, json, os, sys, time
4from config import (POSITIONS, TRADES, TICKET_USD, MAX_OPEN, MAX_ENTRIES_PER_DAY,
5 DAILY_LOSS_HALT_USD, COOLDOWN_HOURS)
6
7def load() -> dict:
8 return json.load(open(POSITIONS)) if os.path.exists(POSITIONS) else {}
9
10def save(book: dict):
11 json.dump(book, open(POSITIONS, "w"), indent=2)
12
13def trades() -> list[dict]:
14 return list(csv.DictReader(open(TRADES))) if os.path.exists(TRADES) else []
15
16def record(mint, symbol, action, usd, pnl, reason):
17 new = not os.path.exists(TRADES)
18 with open(TRADES, "a", newline="") as f:
19 w = csv.DictWriter(f, fieldnames=["time", "mint", "symbol", "action", "usd", "pnl", "reason"])
20 if new:
21 w.writeheader()
22 w.writerow({"time": time.strftime("%Y-%m-%d %H:%M"), "mint": mint, "symbol": symbol,
23 "action": action, "usd": round(usd, 2), "pnl": round(pnl, 2), "reason": reason})
24
25def today_pnl() -> float:
26 day = time.strftime("%Y-%m-%d")
27 return sum(float(t["pnl"]) for t in trades() if t["time"].startswith(day))
28
29def guard(mint: str) -> str | None:
30 """Giới hạn chạy trước mọi lệnh gọi mạng. Một lệnh vào bị chặn không tốn xu nào."""
31 day = time.strftime("%Y-%m-%d")
32 book = load()
33 if today_pnl() <= -DAILY_LOSS_HALT_USD: return "halted_daily_loss"
34 if mint in book: return "already_open"
35 if len(book) >= MAX_OPEN: return "max_open"
36 opens = [t for t in trades() if t["action"] == "open" and t["time"].startswith(day)]
37 if len(opens) >= MAX_ENTRIES_PER_DAY: return "max_entries_today"
38 cutoff = time.strftime("%Y-%m-%d %H:%M", time.localtime(time.time() - COOLDOWN_HOURS * 3600))
39 if any(t["mint"] == mint and t["action"] == "close" and t["time"] >= cutoff for t in trades()):
40 return "cooldown"
41 return None
42
43def open_position(mint, symbol, price, liq_usd, usd=TICKET_USD):
44 book = load()
45 book[mint] = {"symbol": symbol, "entry": price, "qty0": usd / price, "qty": usd / price,
46 "peak": price, "liq0": liq_usd, "opened": time.time(), "steps": 0}
47 save(book)
48 record(mint, symbol, "open", usd, 0, "entry")
49
50def sell(mint, frac_of_original, price, reason) -> float:
51 """Bán một phần của KHỐI LƯỢNG BAN ĐẦU (1.0 = bán hết phần còn lại). Trả về pnl thực tế."""
52 book = load()
53 p = book[mint]
54 q = min(p["qty"], p["qty0"] * frac_of_original)
55 pnl = q * (price - p["entry"])
56 p["qty"] -= q
57 action = "close" if p["qty"] <= p["qty0"] * 1e-6 else "partial"
58 record(mint, p["symbol"], action, q * price, pnl, reason)
59 if action == "close":
60 del book[mint]
61 save(book)
62 return pnl
63
64if __name__ == "__main__":
65 # chế độ live: sau khi bạn mua bằng ví của mình -> python book.py add <mint> <usd> <price> <liq_usd>
66 # sau khi bạn tự tay bán -> python book.py close <mint> <price>
67 cmd = sys.argv[1]
68 if cmd == "add":
69 mint, usd, price, liq = sys.argv[2], float(sys.argv[3]), float(sys.argv[4]), float(sys.argv[5])
70 open_position(mint, mint[:6], price, liq, usd)
71 elif cmd == "close":
72 print(round(sell(sys.argv[2], 1.0, float(sys.argv[3]), "manual"), 2))

07. viết luật thoát trước khi vào lệnh

hầu hết mọi người quyết định lúc nào bán khi đang nhìn chằm chằm vào cây nến xanh. đó là thời điểm tệ nhất để quyết định bất cứ điều gì. trên bộ khung này, mọi điểm thoát đều tồn tại trước khi token được mua, và bot chỉ việc kiểm tra mỗi 10 phút:

  • thanh khoản rút 40% so với lúc vào: thoát, bán hết, không hỏi han gì
  • giảm 35%: thoát
  • tăng 100%: bán nửa, phần còn lại là tiền của thị trường
  • tăng 200%: bán thêm một phần tư
  • sau lần chốt lời đầu tiên, phần còn lại thoát khi giá giảm 30% từ đỉnh
  • sáu tiếng mà không đạt +20%: thoát, cái slot đó đáng giá hơn sự kỳ vọng

lưu thành watch.py:

python
1# watch.py
2# kiểm tra mọi vị thế đang mở, mỗi 10 phút. không in gì nếu không có thay đổi.
3import time
4from config import EXIT, PAPER
5from market import pool
6import book
7
8def watch() -> list[str]:
9 events = []
10 for mint, p in list(book.load().items()):
11 try:
12 m = pool(mint)
13 except Exception as e:
14 events.append(f"{p['symbol']}: nguồn cấp giá sập ({e}), đang giữ, sẽ thử lại")
15 continue
16 if not m or m["price"] <= 0:
17 events.append(f"{p['symbol']}: pool biến mất. coi như bị rug, bán được bao nhiêu thì bán")
18 book.sell(mint, 1.0, 0.0, "pool_gone")
19 continue
20
21 price = m["price"]
22 b = book.load(); s = b[mint]
23 s["peak"] = max(s["peak"], price); book.save(b)
24 pct = (price / s["entry"] - 1) * 100
25 hours = (time.time() - s["opened"]) / 3600
26
27 def out(frac, why):
28 pnl = book.sell(mint, frac, price, why)
29 verb = "đã bán" if PAPER else "BÁN NGAY trong ví của bạn"
30 size = "phần còn lại" if frac >= 1 else f"{int(frac * 100)}%"
31 events.append(f"{s['symbol']}: {verb} {size} ở mức {pct:+.0f}% ({why}), pnl ${pnl:+.2f}")
32
33 if m["liq_usd"] < s["liq0"] * (1 - EXIT["liq_drop_pct"] / 100):
34 out(1.0, "liquidity_pulled"); continue
35 if pct <= EXIT["stop_pct"]:
36 out(1.0, "stop"); continue
37 ladder = EXIT["ladder"]
38 if s["steps"] < len(ladder) and pct >= ladder[s["steps"]][0]:
39 out(ladder[s["steps"]][1], f"take_profit_{ladder[s['steps']][0]}")
40 b = book.load()
41 if mint in b:
42 b[mint]["steps"] += 1; book.save(b)
43 continue
44 if s["steps"] > 0 and price <= s["peak"] * (1 - EXIT["trail_pct"] / 100):
45 out(1.0, "trailing_stop"); continue
46 if hours >= EXIT["time_stop_hours"] and pct < EXIT["time_stop_min_pct"]:
47 out(1.0, "time_stop")
48 return events
49
50if __name__ == "__main__":
51 for e in watch():
52 print(e)
text
1THANH KHOẢN LÀ TRÊN HẾT. một pool bị rút tiền đánh bại mọi luật khác, kể cả khi vị thế đang xanh.
2TRAILING STOP CHỈ KÍCH HOẠT SAU LẦN CHỐT LỜI ĐẦU TIÊN. trước đó, -35% là sàn duy nhất.
3TIỀN CHẾT CŨNG LÀ THUA LỖ. sáu tiếng đi ngang giải phóng slot cho token tiếp theo.
4IM LẶNG CŨNG LÀ MỘT TRẠNG THÁI. watch.py không in gì nếu không có thay đổi, nên khung chat im lìm nghĩa là bạn không cần phải ngó tới.
boan - inline image

08. học 14 cách một token chết

nếu phải vứt bỏ mọi thứ ở trên và chỉ giữ lại một thứ, tôi sẽ giữ cái này. nó cũng hoạt động mà không cần bot nào: tự tay chạy 14 bước kiểm tra y hệt trên rugcheck.xyz và dexscreener trước lệnh mua tiếp theo, bạn sẽ né được phần lớn những token mà lẽ ra bạn sẽ hối hận.

13 bước là code. chỉ là phép so sánh, không model, không ý kiến. bước thứ 14 là bước duy nhất cần Grok.

#

bước kiểm tra

loại bỏ khi

lý do

1

đã bị rug

Rugcheck đánh dấu là rugged

có người làm rồi

2

quyền mint

vẫn đang mở

dev có thể in thêm cung xả vào túi bạn

3

quyền đóng băng

vẫn đang mở

dev có thể đóng băng token của bạn, bạn không bán được

4

cờ nguy hiểm

bất kỳ rủi ro mức danger nào

Rugcheck đã thấy thứ mà bạn sẽ rất khó bác bỏ

5

điểm rủi ro

trên 40/100

những cảnh báo nhỏ cộng dồn lại

6

khóa LP

pool lớn nhất khóa hoặc đốt dưới 90%

thanh khoản chưa khóa là nút bấm để rút thảm

7

top 10 holder

trên 30%, không tính pool và locker

mười cái ví có thể cùng nhau kết thúc lệnh của bạn

8

ví dev

creator vẫn giữ trên 5%

dev là người bán đầu tiên

9

insider / bundle

bất kỳ holder nào là insider hoặc dính trên graph insider

các ví được nạp tiền cùng nhau sẽ xả cùng nhau

10

độ sâu pool

thanh khoản dưới 30k đô

bạn sẽ thành thanh khoản thoát hàng cho ai đó

11

tỷ trọng lệnh

25 đô của bạn chiếm hơn 1% pool

chính lệnh mua của bạn làm trượt giá

12

tuổi thọ

dưới 30 phút hoặc trên 72 giờ

quá mới để có báo cáo nào, hoặc sóng đã chạy xong rồi

13

có lệnh bán không

20+ lệnh mua trong giờ qua, không có lệnh bán nào

đó là hình dáng của một honeypot

14

đọc X (Grok)

không có bài đăng, CA copycat, mua hype, có lịch sử rug

phần mà không API nào trả về được

boan - inline image

09. để code loại bỏ những kẻ lộ liễu

bước kiểm tra 1 đến 9. nó lấy một báo cáo và chỉ giữ lại những trường mà bộ khung cần đọc. Grok không bao giờ thấy báo cáo thô, payload nặng vừa tốn token vừa giảm độ chính xác.

một chi tiết mọi người hay bỏ qua: vault của chính cái pool và các locker nằm trong danh sách top holder. đếm cả chúng vào thì token nào trông cũng như token cá voi. code sẽ loại chúng ra trước khi cộng tổng top 10.

python
1# rugcheck.py
2# một báo cáo cho mỗi token, cắt gọn còn đúng những trường bộ khung cần đọc. Grok không bao giờ thấy báo cáo thô.
3import requests
4from config import FACTS
5
6RC = "https://api.rugcheck.xyz/v1/tokens"
7
8def report(mint: str) -> dict:
9 r = requests.get(f"{RC}/{mint}/report", timeout=20)
10 r.raise_for_status()
11 d = r.json()
12 token = d.get("token") or {}
13 known = d.get("knownAccounts") or {}
14
15 def is_pool(h): # vault AMM và locker nằm trong top holder, chúng không phải cá voi
16 tag = known.get(h.get("owner")) or known.get(h.get("address")) or {}
17 return str(tag.get("type", "")).upper() in ("AMM", "LOCKER")
18
19 holders = [h for h in (d.get("topHolders") or []) if not is_pool(h)]
20 markets = sorted(d.get("markets") or [],
21 key=lambda m: ((m.get("lp") or {}).get("baseUSD") or 0)
22 + ((m.get("lp") or {}).get("quoteUSD") or 0),
23 reverse=True)
24 lp = (markets[0].get("lp") or {}) if markets else {}
25 supply = token.get("supply") or 0
26 risks = d.get("risks") or []
27
28 return {
29 "mint": mint,
30 "symbol": (d.get("tokenMeta") or {}).get("symbol"),
31 "rugged": bool(d.get("rugged")),
32 "risk_score": d.get("score_normalised"),
33 "danger": [x.get("name") for x in risks if x.get("level") == "danger"],
34 "warn": [x.get("name") for x in risks if x.get("level") == "warn"],
35 "mint_authority": token.get("mintAuthority", d.get("mintAuthority")),
36 "freeze_authority": token.get("freezeAuthority", d.get("freezeAuthority")),
37 "lp_locked_pct": lp.get("lpLockedPct", d.get("lpLockedPct")),
38 "top10_pct": round(sum(h.get("pct") or 0 for h in holders[:10]), 2) if holders else None,
39 "dev_pct": round((d.get("creatorBalance") or 0) / supply * 100, 2) if supply else None,
40 "insiders": sum(1 for h in holders if h.get("insider")) + (d.get("graphInsidersDetected") or 0),
41 "holders": d.get("totalHolders"),
42 }
43
44def fact_kill(t: dict) -> str | None:
45 """Chỉ là phép so sánh thuần túy. Lỗi đầu tiên thắng, lý do được ghi log."""
46 if t["risk_score"] is None: return "no_report"
47 if t["rugged"]: return "already_rugged"
48 if t["mint_authority"]: return "mint_open"
49 if t["freeze_authority"]: return "freeze_open"
50 if t["danger"]: return "danger:" + t["danger"][0]
51 if t["risk_score"] > FACTS["max_risk_score"]: return "risk_score"
52 if t["lp_locked_pct"] is None or t["lp_locked_pct"] < FACTS["min_lp_locked_pct"]:
53 return "lp_unlocked"
54 if t["top10_pct"] is None or t["top10_pct"] > FACTS["max_top10_pct"]:
55 return "top10_heavy"
56 if t["dev_pct"] is None or t["dev_pct"] > FACTS["max_dev_pct"]:
57 return "dev_holds"
58 if t["insiders"] > FACTS["max_insiders"]: return "insiders"
59 return None
boan - inline image

10. kiểm tra pool, không chỉ contract

bước kiểm tra 10 đến 13. contract có thể hoàn hảo nhưng pool vẫn không cho bạn thoát. đoạn này đọc pool sâu nhất của token và hỏi bốn câu nhàm chán: trong đó có đủ tiền không, lệnh của mình to cỡ nào so với nó, nó bao nhiêu tuổi rồi, và có ai thực sự đang bán không.

python
1# market.py
2# bản thân cái pool: độ sâu, tuổi thọ, giá, và liệu có ai thực sự bán được không.
3import time
4import requests
5from config import FACTS, TICKET_USD
6
7DS = "https://api.dexscreener.com/tokens/v1/solana"
8
9def pool(mint: str) -> dict | None:
10 r = requests.get(f"{DS}/{mint}", timeout=15)
11 r.raise_for_status()
12 data = r.json()
13 pairs = data if isinstance(data, list) else (data.get("pairs") or [])
14 pairs = [p for p in pairs if (p.get("baseToken") or {}).get("address") == mint]
15 if not pairs:
16 return None
17 p = max(pairs, key=lambda x: (x.get("liquidity") or {}).get("usd") or 0)
18 h1 = (p.get("txns") or {}).get("h1") or {}
19 born = p.get("pairCreatedAt")
20 return {
21 "symbol": (p.get("baseToken") or {}).get("symbol"),
22 "price": float(p.get("priceUsd") or 0),
23 "liq_usd": (p.get("liquidity") or {}).get("usd") or 0,
24 "age_min": round((time.time() * 1000 - born) / 60000) if born else None,
25 "buys_1h": h1.get("buys", 0),
26 "sells_1h": h1.get("sells", 0),
27 "vol_1h": (p.get("volume") or {}).get("h1"),
28 "url": p.get("url"),
29 }
30
31def market_kill(m: dict | None) -> str | None:
32 if not m: return "no_pool"
33 if m["price"] <= 0: return "no_price"
34 if m["liq_usd"] < FACTS["min_liquidity_usd"]: return "thin_pool"
35 if TICKET_USD / m["liq_usd"] > FACTS["max_ticket_share"]: return "ticket_too_big"
36 if m["age_min"] is None or m["age_min"] < FACTS["min_age_min"]:
37 return "too_fresh"
38 if m["age_min"] > FACTS["max_age_hours"] * 60: return "too_old"
39 if m["buys_1h"] >= 20 and m["sells_1h"] == 0: return "nobody_can_sell"
40 return None

11. để Grok đọc những gì code không đọc được

bước kiểm tra 14. đây là lý do bộ khung này chạy trên Grok chứ không phải model nào khác: nó có thể tìm kiếm X ngay trong lúc suy nghĩ. một token có thể vượt qua cả 13 bước kiểm tra mà vẫn là hàng copycat với địa chỉ contract khác, hoặc một đợt launch mà bốn mươi tài khoản lập tuần trước cùng đăng một câu y hệt trong cùng một phút. không API nào trả về được chuyện đó. X thì có.

lưu thành grok.py. đây là file duy nhất đọc key và là nơi duy nhất bộ khung giao tiếp với xAI:

python
1# grok.py
2# tệp duy nhất chứa khóa API và là nơi duy nhất bàn giao dịch giao tiếp với xAI.
3import os, json, datetime, requests
4from config import MODEL
5
6URL = "https://api.x.ai/v1/responses"
7
8def _key() -> str:
9 k = os.environ.get("XAI_API_KEY")
10 if not k and os.path.exists(".env"):
11 for line in open(".env"):
12 if line.startswith("XAI_API_KEY="):
13 k = line.split("=", 1)[1].strip().strip('"')
14 if not k:
15 raise RuntimeError("không tìm thấy XAI_API_KEY trong biến môi trường hoặc trong .env")
16 return k
17
18def _text(resp: dict) -> str:
19 if isinstance(resp.get("output_text"), str):
20 return resp["output_text"]
21 parts = []
22 for item in resp.get("output") or []:
23 if item.get("type") == "message":
24 for c in item.get("content") or []:
25 if c.get("type") in ("output_text", "text"):
26 parts.append(c.get("text") or "")
27 return "\n".join(parts)
28
29def ask(system: str, payload: dict, read_x: bool = False) -> dict:
30 """Một lần gọi, JSON vào, JSON ra. Bất cứ thứ gì không phải JSON đều sẽ báo lỗi, và lỗi nghĩa là BỎ QUA ở tầng trên."""
31 body = {"model": MODEL,
32 "input": [{"role": "system", "content": system},
33 {"role": "user", "content": json.dumps(payload)}]}
34 if read_x:
35 since = (datetime.date.today() - datetime.timedelta(days=3)).isoformat()
36 body["tools"] = [{"type": "x_search", "from_date": since}]
37 body["max_turns"] = 2 # hai vòng tìm kiếm, sau đó bắt buộc phải trả lời
38 r = requests.post(URL, timeout=180, json=body,
39 headers={"Authorization": f"Bearer {_key()}"})
40 r.raise_for_status()
41 text = _text(r.json())
42 start, end = text.find("{"), text.rfind("}")
43 if start == -1:
44 raise ValueError(f"không có json trong câu trả lời: {text[:200]}")
45 return json.loads(text[start:end + 1])

lưu thành prompts.py. đây là tệp bạn sẽ thực sự đọc lại:

python
1# prompts.py
2# prompt Grok duy nhất trên bàn giao dịch. đây là tệp bạn sẽ thực sự đọc lại.
3
4JUDGE_PROMPT = """
5Bạn là RUG DESK. Một memecoin Solana vừa vượt qua mọi bước kiểm tra cứng trong mã nguồn:
6quyền hạn, LP, người nắm giữ, ví dev, nội gián, độ sâu pool, tuổi token.
7Đừng kiểm tra lại những con số đó. Bạn quyết định xem có đưa một vé cược cố định vào hay không.
8Bạn không bao giờ quyết định khối lượng, không bao giờ chọn điểm thoát lệnh.
9
10INPUT: {"token": {...dữ kiện từ rugcheck...}, "pool": {...dữ kiện từ dexscreener...}}
11
12BƯỚC 1. Tìm kiếm trên X theo ticker và địa chỉ hợp đồng, trong 72 giờ qua.
13BƯỚC 2. Chỉ đánh giá những gì mã nguồn không thấy được:
14 - các rủi ro mức cảnh báo có cộng dồn thành vấn đề nghiêm trọng hơn không
15 - ai đăng bài đầu tiên: dev, một tài khoản thật có lịch sử, hay một loạt tài khoản mới tạo
16 - tự nhiên hay mua chuộc: cùng một nội dung, cùng một phút, tài khoản không có quá khứ
17 - địa chỉ hợp đồng trong các bài đăng đó có giống với INPUT không
18 - tên ticker này hoặc dev này đã từng dính phốt rug trước đây chưa
19
20CHỈ TRẢ VỀ JSON:
21{"verdict": "BUY" | "SKIP", "confidence": 0.0-1.0,
22 "why": "tối đa hai dòng", "x_read": "một dòng mô tả tình hình trên X",
23 "main_risk": "một dòng"}
24
25Không có bài đăng nào trên X cũng là một câu trả lời: chẳng ai biết nó tồn tại. SKIP.
26Có một địa chỉ hợp đồng khác dưới cùng ticker trên X: rủi ro hàng nhái. SKIP.
27KHÔNG BAO GIỜ trả lời BUY khi một trường bạn cần bị null.
28KHÔNG BAO GIỜ nhắc đến mục tiêu giá. Bạn không biết chúng.
29"""

12. kết nối tất cả thành một lệnh duy nhất

một địa chỉ hợp đồng vào, một phán quyết ra. giới hạn, dữ kiện, pool, Grok, theo đúng thứ tự đó, và cái đầu tiên nói "không" sẽ kết thúc quy trình:

python
1# check.py
2# một địa chỉ hợp đồng vào, một phán quyết ra. chạy mỗi khi có token đi qua bàn giao dịch của bạn.
3import csv, json, os, sys, time
4from config import LOG, MIN_CONFIDENCE, PAPER, TICKET_USD
5from rugcheck import report, fact_kill
6from market import pool, market_kill
7from grok import ask
8from prompts import JUDGE_PROMPT
9import book
10
11def log(row: dict):
12 new = not os.path.exists(LOG)
13 with open(LOG, "a", newline="") as f:
14 w = csv.DictWriter(f, fieldnames=["time", "mint", "symbol", "stage", "verdict",
15 "confidence", "reason"])
16 if new:
17 w.writeheader()
18 w.writerow({k: row.get(k) for k in w.fieldnames})
19
20def check(mint: str) -> dict:
21 if (g := book.guard(mint)): # giới hạn, miễn phí
22 return {"stage": "limits", "verdict": "SKIP", "reason": g}
23
24 try:
25 token = report(mint) # bộ lọc rug, miễn phí
26 except Exception as e:
27 return {"stage": "facts", "verdict": "SKIP", "reason": f"rugcheck thất bại: {e}"}
28 if (k := fact_kill(token)):
29 return {"stage": "facts", "verdict": "SKIP", "reason": k, "symbol": token["symbol"]}
30
31 try:
32 m = pool(mint) # pool, miễn phí
33 except Exception as e:
34 return {"stage": "pool", "verdict": "SKIP", "reason": f"dexscreener thất bại: {e}"}
35 if (k := market_kill(m)):
36 return {"stage": "pool", "verdict": "SKIP", "reason": k, "symbol": token["symbol"]}
37
38 try:
39 ans = ask(JUDGE_PROMPT, {"token": token, "pool": m}, read_x=True) # bước trả phí duy nhất
40 except Exception as e:
41 return {"stage": "grok", "verdict": "SKIP", "reason": f"grok thất bại: {e}"}
42
43 verdict, conf = ans.get("verdict"), ans.get("confidence") or 0
44 if verdict == "BUY" and conf < MIN_CONFIDENCE:
45 verdict = "SKIP"
46 ans["why"] = f"độ tin cậy thấp {conf}"
47 return {**ans, "stage": "grok", "verdict": verdict, "symbol": m["symbol"] or token["symbol"],
48 "reason": ans.get("why"), "price": m["price"], "liq_usd": m["liq_usd"], "url": m["url"]}
49
50if __name__ == "__main__":
51 mint = sys.argv[1].strip()
52 v = check(mint)
53 log({"time": time.strftime("%Y-%m-%d %H:%M"), "mint": mint, **v})
54 if v["verdict"] == "BUY":
55 if PAPER:
56 book.open_position(mint, v["symbol"], v["price"], v["liq_usd"])
57 v["action"] = f"MUA GIẤP ${TICKET_USD} ở giá {v['price']}"
58 else:
59 v["action"] = (f"CẦN PHÊ DUYỆT: hãy mua ${TICKET_USD} {v['symbol']} trong ví của bạn, "
60 f"sau đó chạy: python book.py add {mint} {TICKET_USD} <giá khớp> {v['liq_usd']}")
61 print(json.dumps(v, indent=2))

bạn không cần máy quét để dùng nó. lấy một CA từ kênh call, một bài đăng, hay tin nhắn của bạn bè: bảo bot "check <CA>" và nó sẽ chạy một dòng. kết quả trả về trông như thế này (ví dụ minh họa, không phải token thật):

json
1{
2 "verdict": "SKIP",
3 "confidence": 0.78,
4 "why": "vượt qua mọi bước kiểm tra cứng, nhưng 30 bài đăng đầu tiên đến từ các tài khoản mới tạo tuần này, cùng một nội dung.",
5 "x_read": "một tài khoản thật, một loạt tài khoản mới, không sai lệch CA",
6 "main_risk": "hype mua chuộc, người mua sẽ rời đi khi ngừng đăng bài",
7 "stage": "grok",
8 "symbol": "EXAMPLE",
9 "reason": "vượt qua mọi bước kiểm tra cứng, nhưng 30 bài đăng đầu tiên đến từ các tài khoản mới tạo tuần này, cùng một nội dung."
10}
boan - inline image
text
1DỮ KIỆN TRƯỚC Ý KIẾN. Grok không bao giờ quyết định việc một mint có mở hay không.
2LỜI GỌI THẤT BẠI LÀ MỘT LỆNH BỎ QUA. Rugcheck sập, DexScreener sập, Grok sập, JSON lỗi: SKIP.
3NULL KHÔNG CÓ NGHĨA LÀ SẠCH. một trường không trả về dữ liệu sẽ loại token đó, chứ không bao giờ cho nó qua.
4MỖI TOKEN MỘT PHÁN QUYẾT. đừng bao giờ chạy lại cho đến khi nó báo BUY. nếu bạn không đồng ý, tức là bạn đang không đồng ý với config.py.
5HÃY ĐỌC CÁC LÝ DO LOẠI, CHỨ KHÔNG PHẢI CÁC LỆNH MUA. lệnh mua mang lại cảm giác tốt. lý do loại cho bạn biết bộ lọc có hoạt động hay không.

13. ba tác vụ định kỳ, mỗi cái một câu

không cần trình dựng luồng công việc. bạn chỉ cần nói cho bot mỗi tác vụ một lần, bằng một câu, và nó sẽ cho bạn xem lần chạy tiếp theo. đây là của tôi, nguyên văn từng chữ:

text
1Cứ 10 phút một lần, trong /workspace/desk chạy python watch.py.
2Nếu nó không in ra gì thì đừng nói gì. Nếu nó in ra bất cứ thứ gì, hãy đăng nguyên văn vào đây.
text
1Cứ 30 phút một lần, trong /workspace/desk chạy python scan.py.
2Chỉ đăng các phán quyết BUY: symbol, confidence, x_read.
3Nếu Rugcheck hoặc DexScreener bị sập, hãy nói rõ cái nào một lần thôi, đừng lặp lại ở mỗi lần chạy.
text
1Mỗi ngày lúc 21:30, trong /workspace/desk chạy python report.py và đăng kết quả vào đây.
2Thêm một điều hiệu quả hôm nay và một con số trong config.py mà bạn muốn đặt dấu hỏi, kèm lý do.
3Đừng bao giờ tự thay đổi con số đó.

hai tệp mà các tác vụ đó chạy. lưu thành report.py:

python
1# report.py
2# báo cáo buổi tối. mọi thứ trong này đều lấy từ checks.csv và trades.csv, không có gì từ bộ nhớ.
3import csv, os, time
4from collections import Counter
5from config import LOG, PAPER
6import book
7
8day = time.strftime("%Y-%m-%d")
9checks = [r for r in csv.DictReader(open(LOG))] if os.path.exists(LOG) else []
10checks = [r for r in checks if r["time"].startswith(day)]
11done = [t for t in book.trades() if t["time"].startswith(day) and t["action"] != "open"]
12
13by_stage = Counter(r["stage"] for r in checks if r["verdict"] == "SKIP")
14buys = [r for r in checks if r["verdict"] == "BUY"]
15wins = [t for t in done if float(t["pnl"]) > 0]
16reasons = Counter(r["reason"] for r in checks if r["stage"] in ("facts", "pool"))
17
18print(f"BÁO CÁO BUỔI TỐI {day} {'(GIẤP)' if PAPER else '(THẬT)'}")
19print(f"đã kiểm tra: {len(checks)}")
20print(f"bị loại bởi bộ lọc rug: {by_stage['facts']} | bởi pool: {by_stage['pool']} | "
21 f"bởi Grok: {by_stage['grok']} | bởi giới hạn: {by_stage['limits']}")
22print(f"đã mua: {len(buys)} | đang mở: {len(book.load())}")
23print(f"lãi lỗ chốt hôm nay: ${book.today_pnl():+.2f}")
24if done:
25 print(f"thoát lệnh có lãi: {len(wins)}/{len(done)}")
26 best = max(done, key=lambda t: float(t["pnl"]))
27 worst = min(done, key=lambda t: float(t["pnl"]))
28 print(f"tốt nhất: {best['symbol']} ${float(best['pnl']):+.2f} | tệ nhất: {worst['symbol']} ${float(worst['pnl']):+.2f}")
29if reasons:
30 top, n = reasons.most_common(1)[0]
31 print(f"lý do loại phổ biến nhất: {top} ({n} lần)")

và scan.py, nguồn tìm token tùy chọn. nó kéo các token Solana mới vừa trả tiền mua hồ sơ DexScreener. hồ sơ trả phí không phải là tín hiệu chất lượng, nó chỉ có nghĩa là dev đã chịu chi tiền. phần còn lại do bộ lọc quyết định:

python
1# scan.py
2# nguồn tìm token tùy chọn: các token Solana mới vừa trả tiền mua hồ sơ DexScreener.
3# hồ sơ trả phí không phải tín hiệu chất lượng, chỉ có nghĩa là dev đã chịu chi tiền. bộ lọc sẽ quyết định.
4import csv, os, subprocess, sys
5import requests
6from config import LOG
7
8seen = {r["mint"] for r in csv.DictReader(open(LOG))} if os.path.exists(LOG) else set()
9r = requests.get("https://api.dexscreener.com/token-profiles/latest/v1", timeout=15)
10r.raise_for_status()
11fresh = [t["tokenAddress"] for t in r.json()
12 if t.get("chainId") == "solana" and t.get("tokenAddress") not in seen]
13
14for mint in fresh[:5]: # năm token mỗi lần chạy, để một giờ cao điểm không làm cạn ngân sách API
15 subprocess.run([sys.executable, "check.py", mint])

điều cuối cùng tối nay: Settings, General, Auto-review. thêm hai quy tắc Ask first (Hỏi trước), chúng sẽ chặn hành động và chờ bạn bất kể tác vụ định kỳ nghĩ gì:

text
1Hỏi trước khi thực hiện bất kỳ kết nối ví, ký, swap hay chuyển tiền nào.
2Hỏi trước khi chỉnh sửa bất kỳ tệp nào tên là config.py.
boan - inline image
boan - inline image

14. một tuần giao dịch giấy trước khi bỏ ra một đô la nào

PAPER = True nghĩa là bàn giao dịch làm mọi thứ y như thật ngoại trừ tiền. token thật, giá thật, điểm thoát thật, lệnh khớp giả. sau bảy ngày, hãy mở checks.csv và đọc nó như thể một người lạ viết ra.

những gì bạn cần tìm: bước kiểm tra nào loại nhiều nhất, các lệnh BUY có phải những lệnh bạn sẽ mua thật không, và có lý do SKIP nào trông vô lý không. lệnh khớp giấy xảy ra ở giá trên màn hình, lệnh khớp thật thì không bao giờ như vậy, nên hãy coi kết quả giấy là mức trần, không phải dự báo.

khi bạn chuyển sang giao dịch thật, hãy đổi PAPER thành False và không có gì thay đổi ngoài bước cuối cùng. check.py sẽ ngừng mua và thay vào đó đăng một dòng yêu cầu phê duyệt: tự mua $25 trong ví của bạn, rồi một lệnh sẽ đưa nó vào sổ để watch.py bắt đầu canh giữ.

khi hệ thống gặp lỗi

cái này liên quan đến tiền, nên mọi lỗi đều phải có sẵn một đáp án được ghi ra trước khi nó xảy ra.

text
1401 từ xAI -> khóa sai. Hãy Take over, viết lại .env, chạy lại lệnh curl từ bước 03.
2400 / 404 từ xAI -> tên model đã đổi. sửa MODEL trong config.py, không làm gì khác.
3429 từ xAI -> giới hạn tốc độ. token đó là SKIP, lần chạy sau sẽ bỏ qua. đừng bao giờ lặp lại nó.
4lỗi về x_search -> MODEL của bạn không tìm kiếm được trên X. hãy chọn một model hỗ trợ trong console.x.ai -> Models.
5Grok trả lời bằng văn xuôi -> ValueError, được ghi log, SKIP. đừng bao giờ biến một đoạn văn thành một lệnh giao dịch.
6rugcheck 404 hoặc trống -> quá mới để lập chỉ mục. SKIP. mới không có nghĩa là sạch.
7lp_unlocked trên mọi thứ -> một số loại pool hoàn toàn không có token LP. hãy tự mở thử một cái trên rugcheck
8 trước khi bạn đụng vào con số đó, và thay đổi nó bằng văn bản.
9no_pool -> chưa giao dịch trên DEX, hoặc không phải Solana. SKIP.
10tác vụ im lìm -> Grok Bot tạm dừng các tác vụ sau khi bạn vắng mặt lâu.
11 hãy mở Routines và bật chúng lại.

hóa đơn

mọi thứ trước bước phán xét đều miễn phí: giới hạn, Rugcheck, DexScreener. bước trả phí duy nhất là một lần gọi Grok cho mỗi token sống sót qua cả 13 bước kiểm tra, có bật tìm kiếm X.

text
1chi_phí_mỗi_token = input_tokens / 1_000_000 * giá_mỗi_M_input
2 + output_tokens / 1_000_000 * giá_mỗi_M_output
3 + posts_fetched / 1_000 * 5 # tìm kiếm X: $5 cho mỗi 1.000 bài đăng được lấy
4
5max_turns = 2 giữ việc tìm kiếm ở hai vòng, nên posts_fetched luôn nhỏ.
6mỗi phản hồi đều tự báo cáo x_posts_fetched của nó, nên ngày đầu tiên sẽ cho bạn con số thực tế.
7
8giá: [giá từ console.x.ai]

phần mọi người hay hiểu sai: hóa đơn tăng theo số token sống sót, không phải theo máy quét. scan.py có thể nạp cho bàn giao dịch 240 token mỗi ngày và phần lớn chúng bị loại miễn phí trước khi Grok kịp biết đến.

boan - inline image

phần quan trọng

đây là thiết lập của tôi, không phải chiến lược của bạn.

mọi con số trong config.py đều là của tôi, được chọn cho một vé cược $25 và sức chịu đựng của riêng tôi khi nhìn một thứ gì đó về 0. phần lớn memecoin đều về 0, và phần lớn người giao dịch chúng đều mất tiền. bộ lọc không làm cho một token trở nên tốt. nó loại bỏ những cách thua lỗ hiển nhiên, và ép bạn phải đọc lý do vì sao mỗi token chết.

hãy chạy thử một tuần trên giấy. đọc các lý do loại. thay đổi những con số bạn không đồng ý, bằng văn bản. sao chép cấu trúc, đừng sao chép các hằng số. đây không phải lời khuyên tài chính.

mã nguồn lo việc loại, Grok lo việc đọc X, bạn lo việc ký. một script không bao giờ được quyền phán đoán, Grok không bao giờ được cấp máy tính, và không ai ngoài bạn được chạm vào ví.

hãy lưu lại trước lần mua tiếp theo của bạn. follow nếu bạn định chạy một hệ thống tương tự, sẽ còn nhiều thứ nữa 🫶

tg của tôi - t.me/+8wAXS0nHWgA2MGEy

github của tôi - github.com/0xboan

giao dịch tại đây - fomo.family/r/0xboan

Lưu một chạm

Đọc sâu bài viết viral bằng AI trong YouMind

Lưu nguồn, đặt câu hỏi tập trung, tóm tắt lập luận và biến một bài viết viral thành các ghi chú có thể tái sử dụng trong một không gian làm việc AI duy nhất.

Khám phá YouMind
Dành cho nhà sáng tạo

Biến Markdown của bạn thành bài viết 𝕏 gọn gàng

Khi bạn đăng bài viết dài của riêng mình, việc định dạng hình ảnh, bảng và khối mã cho 𝕏 rất mệt mỏi. YouMind biến cả bản nháp Markdown thành một bài viết 𝕏 gọn gàng, sẵn sàng để đăng.

Thử Markdown sang 𝕏

Thêm pattern để giải mã

Bài viết viral gần đây

Khám phá thêm bài viết viral