看到有佬需要,就顺手扫了
有教育邮箱可以去 nc.me 免费注册一年(可惜我没有
)
![]()
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())


