2023.05.03
- 支持通过参数 -l, -t 方式传入域名长度和飞书通知密钥
- 同时打印出明天将要释放的域名
import argparse
import csv
import os
import re
import requests
import json
from datetime import datetime,timedelta
def download_csv(file_name, file_url):
"""
定义下载 CSV 文件的函数
:param file_name: 保存的文件名
:param file_url: csv 下载地址
"""
response = requests.get(file_url)
with open(file_name, 'wb') as f:
f.write(response.content)
def is_domain_available(domain):
"""
判断是否可注册
:param domain: xxx
:return: 是否可注册
"""
# 设置请求参数
params = {"domainName": domain}
# 发送 POST 请求
response = requests.post("https://www.nic.top/cn/whoischeck.asp", data=params)
# 检查响应内容是否包含 "is available"
return 'is available' in response.text
def send_feishu_msg(hook_token, content):
"""
发送 Feishu 消息
:param hook_token: 机器人 hook_token
:param content: 消息内容
:return: 请求响应
"""
if hook_token == '':
return
headers = {'Content-Type': 'application/json'}
data = {'msg_type': 'text', 'content': {'text': content}}
hook_url = f'https://open.feishu.cn/open-apis/bot/v2/hook/{hook_token}'
response = requests.post(hook_url, headers=headers, data=json.dumps(data))
return response
def main(domain_len=3, feishu_token=''):
csv_file = 'top.csv'
file_url = 'https://www.nic.top/upload/top/dellist.csv'
# 检查文件是否存在,不存在则下载
if not os.path.isfile(csv_file):
download_csv(csv_file, file_url)
# 获取当前时间
current_time = datetime.now()
# 获取文件的最后修改时间和当前时间
file_time = datetime.fromtimestamp(os.path.getmtime(csv_file))
today = current_time.date()
tomorrow = today + timedelta(days=1)
tomorrow_time = current_time.replace(day=tomorrow.day, month=tomorrow.month, year=tomorrow.year)
# 如果文件的最后修改时间不是今天,则下载文件
if file_time.date() != today:
download_csv(csv_file, file_url)
# 打开 CSV 文件并创建 reader 对象
with open(csv_file, newline='', encoding='gbk') as csvfile:
reader = csv.reader(csvfile)
# 跳过 CSV 文件的头部
next(reader)
# 字符串数组
data_list = []
# 明天可注册
data_next = []
# 遍历指定列,找出长度小于等于 domain_len 并且符合条件的数据并打印
for row in reader:
data = row[0].replace('.top', '')
if re.match(r'^[a-zA-Z0-9]+$', data) and len(data) <= domain_len:
# 域名释放的日期
given_time = datetime.strptime(row[1], "%Y/%m/%d %H:%M")
# 若释放时间早于当前时间,则已释放
if given_time < current_time:
# 可注册
available = is_domain_available(data)
if available:
# print(data)
print(f'date: {row[1]}, domain: {data} -> {row[0]}')
data_list.append(data)
elif given_time < tomorrow_time:
data_next.append(data)
data_list.sort
print(data_list)
# 打印符合条件的数据总数
print(f'Total count: {len(data_list)}')
# 将数组中的数据拼接成字符串
data_str = ','.join(data_list)
# 写入到日志
file_log = f'{today}.log'
with open(file_log, 'w') as f:
f.write(data_str)
# 发送到飞书群通知
resp = send_feishu_msg(feishu_token, data_str)
if resp is not None:
print(resp.json())
# 明天可释放的域名
print(f'Tomorrow: \n{data_next}')
data_next_str = ','.join(data_next)
# 发送到飞书群通知
resp = send_feishu_msg(feishu_token, 'tomorrow: \n' + data_next_str)
if resp is not None:
print(resp.json())
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-l", "--length", type=int, default=3, help="length of domain name")
parser.add_argument("-t", "--token", type=str, help="feishu token")
args = parser.parse_args()
length = args.length if args.length > 0 else 3
token = args.token if args.token is not None else ''
main(length, token)