截至 2025-09-19 仍然未被注册的三字母 .me 域名

看到有佬需要,就顺手扫了

有教育邮箱可以去 nc.me 免费注册一年(可惜我没有 :sob:

image

bvq.me
cfu.me
dnh.me
elr.me
euw.me
eyx.me
fjm.me
fpd.me
frk.me
ftq.me
fzq.me
gby.me
gmj.me
gpw.me
gqv.me
gvh.me
hdu.me
hxf.me
hxi.me
ijx.me
ilr.me
iyv.me
izw.me
jqg.me
jqo.me
jqp.me
jqq.me
jrq.me
jvq.me
kqa.me
kqo.me
kqp.me
kqx.me
ksj.me
kyz.me
lhf.me
lqd.me
lqe.me
mbj.me
mqo.me
nqg.me
nqo.me
nxv.me
nzq.me
ofe.me
ofq.me
oij.me
oiy.me
ojf.me
oju.me
ojx.me
ojy.me
ojz.me
olb.me
olq.me
oqb.me
oqd.me
oqf.me
oqh.me
oqj.me
oqk.me
oqv.me
oqx.me
oqy.me
ouq.me
ouz.me
oxb.me
oxh.me
oxj.me
oxq.me
oxw.me
oyj.me
oyn.me
oyq.me
oyw.me
ozj.me
pqu.me
pqv.me
pqz.me
psq.me
pvx.me
pyb.me
qaj.me
qcu.me
qeh.me
qek.me
qez.me
qfl.me
qfm.me
qfv.me
qgu.me
qhv.me
qiv.me
qjb.me
qjd.me
qje.me
qjf.me
qjy.me
qkb.me
qks.me
qku.me
qmy.me
qoi.me
qoj.me
qow.me
qqg.me
qqw.me
qqx.me
qud.me
qvg.me
qvn.me
qvy.me
qwh.me
qye.me
qyo.me
qzh.me
rkf.me
rlq.me
rqk.me
rqv.me
rqz.me
ruq.me
rvq.me
rwk.me
sjk.me
tjz.me
tqe.me
txq.me
ucq.me
udq.me
uej.me
ueq.me
ugq.me
ugy.me
uhk.me
uhv.me
uhx.me
ujg.me
ujq.me
ujw.me
ujz.me
ulj.me
ulq.me
ulw.me
umq.me
umw.me
uoj.me
uoq.me
uov.me
uqb.me
uqe.me
uqf.me
uqj.me
uql.me
uqn.me
uqv.me
urj.me
uuj.me
uvj.me
uvq.me
uvz.me
uwx.me
uwy.me
uxk.me
uxq.me
uxy.me
uyd.me
uyg.me
uyh.me
uyj.me
uyq.me
uyv.me
uzf.me
uzg.me
uzj.me
uzt.me
vcj.me
vdq.me
vfj.me
vfz.me
vgq.me
vjr.me
vjw.me
vkq.me
vnq.me
vnu.me
vqd.me
vqf.me
vqh.me
vqk.me
vqm.me
vqp.me
vro.me
vtq.me
vwj.me
vwq.me
vwu.me
vxq.me
vyk.me
wfq.me
wgp.me
woq.me
wqd.me
wqo.me
wqp.me
wvj.me
wxf.me
xbh.me
xcj.me
xeh.me
xey.me
xfq.me
xgf.me
xgv.me
xhk.me
xhv.me
xiw.me
xje.me
xji.me
xjv.me
xke.me
xkh.me
xku.me
xlj.me
xmd.me
xmq.me
xrh.me
xsv.me
xtq.me
xuj.me
xuk.me
xvj.me
xvl.me
xvy.me
ybv.me
ycu.me
yeq.me
ygv.me
ygx.me
yhv.me
yjb.me
yje.me
ylr.me
ypn.me
ypz.me
yqe.me
yqj.me
ysm.me
ytw.me
yvd.me
yvh.me
yvk.me
yvu.me
yvw.me
yvx.me
ywv.me
ywz.me
yxj.me
yxu.me
zej.me
znf.me
zqd.me
zqu.me
zsi.me
zuq.me
zvf.me
zvj.me
zvo.me
zvw.me

脚本:

# filename: scan_me_3letters.py
import asyncio
import httpx
import itertools
import random
import string
import csv
import time
from typing import Optional, Dict, Any

# ======= 必填:把下面三个值改成你浏览器里抓到的值 =======
X_CSRF_TOKEN = "iIAQ1FBxUMGBpJE9odzm2SqM98XxvxoKC9F7S1VB"
COOKIE_XSRF = "eyJpdiI6IndwXC9sbWpvTGNWb0RUSlwvTHhhNjc4Zz09IiwidmFsdWUiOiJTM29VQVFyWHNoXC9LWmdBWk5FbEdoT1BYN1RrVEZEelwvYitvS1laUDQxMzM1WUxON0dZdUtFTGNWbndWaXpCNDUiLCJtYWMiOiJhZTk5NWU1YjdlZTg4YzQyYzBkNzc3ZDVkZDAxZTQ1YjViYWI2MTlmY2NmMzU4YjIwZjBlZjZiYzI1ZGU5NWZhIn0%3D"
COOKIE_SESSION = "eyJpdiI6Ino0Z09xSzl6anBhdUFDclk2d3M3UVE9PSIsInZhbHVlIjoiZ0pOdXRmRE1qaFVKeEdibm52UEYrS051T3pMbTVcL2pydkJLN1ZwN1E5RjNxaVJmdjR1UnZZTFYxMlBUcEZJRVciLCJtYWMiOiI3YWJmMDQ1YjUzZTZlOWZmY2VhODZhOWY4MGFmNzFhYjgwNjFjOGJiN2U3MjNhMDY1OGNhNWZhYjE1NjRmZmJiIn0%3D"
# ===============================================

# 并发/节流参数
MAX_CONCURRENCY = 12         # 并发请求数,遇到限流可以调小
RETRY_MAX = 5                # 单请求最大重试次数
TIMEOUT = 15.0               # 单请求超时
JITTER = (0.02, 0.12)        # 轻微随机抖动,减轻风控
SAVE_EVERY = 20              # 每找到多少个结果就落盘一次

SEARCH_URL = "https://nc.me/api/search"

HEADERS_BASE = {
    "accept": "application/json, text/plain, */*",
    "content-type": "application/json;charset=UTF-8",
    "origin": "https://nc.me",
    "referer": "https://nc.me/search",
    "x-requested-with": "XMLHttpRequest",
    "sec-ch-ua": '"Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"',
    "sec-ch-ua-platform": '"Windows"',
    "x-csrf-token": X_CSRF_TOKEN,          # 关键
    "x-xsrf-token": COOKIE_XSRF,           # 一般与上面成对出现
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
}

COOKIES = {
    "XSRF-TOKEN": COOKIE_XSRF,
    "namecheap_for_education_session": COOKIE_SESSION,
}

def gen_three_letter_names():
    letters = string.ascii_lowercase  # 三“字母”= 仅 a-z;如需包含数字自行替换成 string.ascii_lowercase + string.digits
    for a, b, c in itertools.product(letters, repeat=3):
        yield f"{a}{b}{c}"

async def fetch_one(term: str, client: httpx.AsyncClient, sem: asyncio.Semaphore) -> Optional[Dict[str, Any]]:
    """查询单个三字母名是否可注册(仅取 .me); 返回可注册项的信息,否则 None"""
    payload = {"term": term}
    backoff = 0.5
    for attempt in range(1, RETRY_MAX + 1):
        await asyncio.sleep(random.uniform(*JITTER))
        async with sem:
            try:
                r = await client.post(SEARCH_URL, json=payload, timeout=TIMEOUT)
                if r.status_code == 429:
                    # 限流:指数退避
                    await asyncio.sleep(backoff + random.uniform(0, 0.5))
                    backoff = min(backoff * 2, 8.0)
                    continue
                r.raise_for_status()
                data = r.json()
                for d in data.get("domains", []):
                    ext = d.get("extension", {}) or {}
                    if ext.get("name") == "me" and d.get("available") is True:
                        # 返回简要信息
                        return {
                            "domain": f"{term}.me",
                            "price": ext.get("price"),
                            "price_renewal": ext.get("price_renewal"),
                        }
                return None
            except (httpx.ReadTimeout, httpx.ConnectTimeout, httpx.RemoteProtocolError, httpx.HTTPStatusError) as e:
                # 网络/状态错误重试
                if attempt >= RETRY_MAX:
                    # 最后一轮仍失败,放弃该 term
                    return None
                await asyncio.sleep(backoff + random.uniform(0, 0.5))
                backoff = min(backoff * 2, 8.0)
            except Exception:
                # 其他异常不影响整体
                return None
    return None

async def main():
    start = time.time()
    sem = asyncio.Semaphore(MAX_CONCURRENCY)
    available = []
    found_since_save = 0

    # 预先创建客户端(复用连接 + 统一 headers/cookies)
    async with httpx.AsyncClient(headers=HEADERS_BASE, cookies=COOKIES, http2=True) as client:
        tasks = []
        total = 26 ** 3  # 17576
        processed = 0

        async def handle_result(task):
            nonlocal available, found_since_save
            res = await task
            if res:
                available.append(res)
                found_since_save += 1

        for term in gen_three_letter_names():
            t = asyncio.create_task(fetch_one(term, client, sem))
            t.add_done_callback(lambda fut: None)  # 占位,防止未取结果警告
            tasks.append(t)

            # 控制队列长度避免占用过多内存(分批 gather)
            if len(tasks) >= MAX_CONCURRENCY * 50:
                for coro in asyncio.as_completed(tasks):
                    await handle_result(coro)
                    processed += 1
                    if processed % 200 == 0:
                        elapsed = time.time() - start
                        rate = processed / elapsed if elapsed > 0 else 0
                        print(f"[进度] {processed}/{total} ({processed/total:.1%}) | 速度 ~{rate:.2f} req/s | 已找到 {len(available)} 个")

                    # 间隔保存
                    if found_since_save >= SAVE_EVERY:
                        save_csv(available)
                        found_since_save = 0
                tasks.clear()

        # 收尾:处理剩余任务
        for coro in asyncio.as_completed(tasks):
            await handle_result(coro)
            processed += 1
            if processed % 200 == 0:
                elapsed = time.time() - start
                rate = processed / elapsed if elapsed > 0 else 0
                print(f"[进度] {processed}/{total} ({processed/total:.1%}) | 速度 ~{rate:.2f} req/s | 已找到 {len(available)} 个")

        # 最终保存
        save_csv(available)

    elapsed = time.time() - start
    print(f"\n✅ 扫描完成,用时 {elapsed:.1f}s,共找到 {len(available)} 个可注册三字母 .me,已保存到 available_me_3letter.csv")

def save_csv(rows):
    if not rows:
        return
    # 去重并按字典序排序
    uniq = {r["domain"]: r for r in rows}
    rows_sorted = [uniq[k] for k in sorted(uniq.keys())]
    with open("available_me_3letter.csv", "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=["domain", "price", "price_renewal"])
        writer.writeheader()
        writer.writerows(rows_sorted)

if __name__ == "__main__":
    asyncio.run(main())

点个赞呗 :heart:

34 个赞

都是无明显意义的,不值钱应该

3 个赞

应该是,至少好记一点

1 个赞

如果正好有人的姓名拼音首字母对上了那也是有意义的

2 个赞

我都是注册一些拼音的,我注册域名不注重短,主要注册一些抽象的

离谱,我学校的edu.cn邮箱他不认…


好像只有美国、英国、澳大利亚和加拿大的高校能够直接注册,其他国家的都需要走Github Student Developer Pack

1 个赞

可惜没有裤裤的名字的域名

1 个赞

你试试申请github学生包,学生包里包含这个我记得。也是从这里申请域名到时候

我的学生包在去年就过期了喵… :melting_face:

1 个赞

那你已经拿过了算是

1 个赞

好域名基本都没了

我刚注册的i66.me….留着当短链啥的了

感谢分享!


这就算成功了吗?

ozj.me具有象形意义:smiling_face_with_sunglasses:

1 个赞

尸分摩登!

1 个赞

有没有扫GV靓号的脚本

我的好像没了…

感谢,刚刚领取了 qqx.me,正在注册局审核、备案

1 个赞

能帮到佬友们就好 :smiling_face_with_three_hearts: