Coder Social home page Coder Social logo

luolongfei / freenom Goto Github PK

View Code? Open in Web Editor NEW
3.3K 26.0 1.8K 11.28 MB

Freenom 域名自动续期。Freenom domain name renews automatically.

License: MIT License

Shell 0.01% Dockerfile 0.01% PHP 98.91% HTML 0.04% CSS 0.53% JavaScript 0.51% Makefile 0.01%
freenom telegram-bot docker bot php telegram domain renew auto-renewal php8

freenom's Introduction

freenom logo

Freenom:freenom域名自动续期

PHP version Docker pulls GitHub stars MIT license

Documentation: English version | 中文版

📢 公告

🌿 特别感谢 Special Thanks

📃 引言

🍭 效果

🎁 事前准备

📪 配置送信功能(支持 邮件送信 / Telegram Bot / 企业微信 / Server 酱 / Bark 等送信方式)

⛵ 通过 Docker Compose 方式部署

🐳 通过 Docker 方式部署(推荐,最简单的部署方式之一)

🧊 通过 Heroku 部署

🚈 通过 Railway 部署

📦 通过 Koyeb 部署(推荐没有自己服务器的用户使用此方案,一键部署)

🧪 通过 Mogenius 部署(已不可行)

☁ 通过 各种云函数 部署 (目前各平台已开启收费模式,已放弃支持)

🚧 直接拉取源码部署

📋 赞助名单 Donation List

❤ 赞助 Donation

🪓 信仰

🌚 作者

💖 所有贡献者

📝 TODO List

🍅 本项目的其它语言实现

🎉 鸣谢

🥝 开源协议

📢 公告

  • 热心网友创建了Freenom 续期事务局群组,可供交流、测试、反馈, 加入可直接访问 https://t.me/freenom_auto_renew ,或者扫码加入:

freenom_tg_group.png

🌿 特别感谢 Special Thanks

感谢 JetBrains 提供的非商业开源软件开发授权。

Thanks for non-commercial open source development authorization by JetBrains.

JetBrains Logo (Main) logo.

📃 引言

众所周知,Freenom是地球上唯一一个提供免费顶级域名的商家,不过需要每年续期,每次续期最多一年。由于我申请了一堆域名,而且不是同一时段申请的, 所以每次续期都觉得折腾,于是就写了这个自动续期的脚本。

🍭 效果

无论是续期成败或者程序执行出错,都会收到脚本发出的通知。如果是续期成败相关的通知,通知会包括未续期域名的到期天数等内容。此处展示的是通知邮件的内容。

邮件示例

🎁 事前准备

  • VPS:随便一台服务器都行,系统推荐DebianPHP版本需在php7.3及以上,如果有Docker环境则可无视这个限制。如果你没有服务器,可参考本文档部署到各种免费环境中。
  • 送信邮箱(可选):为了方便理解又称机器人邮箱,用于发送通知邮件。目前针对GmailQQ邮箱163邮箱以及Outlook邮箱,程序会自动判断送信邮箱类型并使用合适的配置。 如果你使用的是其它第三方邮箱或者自建邮件服务,那么请参考 .env.example 文件中与邮件配置相关的注释进行配置。
  • 收信邮箱(可选):用于接收机器人发出的通知邮件。
  • 上面的送信邮箱收信邮箱是可选项,因为目前程序已支持邮件送信 / Telegram Bot / 企业微信 / Server 酱 / Bark等送信方式,仅当你使用邮件送信的时候,送信邮箱收信邮箱 才是必须的,其它送信方式所需请参考下面的 配置送信功能
  • 耐心。

📪 配置送信功能

此处会分别介绍邮件送信 / Telegram Bot / 企业微信 / Server 酱 / Bark送信方式的配置方法,以及其所需的资料,你可以任选一种送信方式进行配置,直接跳到对应的文档查看即可。 如果你是 IOS 用户,推荐使用 Bark 送信方式,其它平台的用户根据自己喜好选择可接受的送信方式即可。不太推荐使用Server 酱送信,Server 酱每日送信条数的限制,以及需要开会员才能直接看到送信内容,否则需要跳到 Server 酱 网站才能查看内容,都是不推荐的原因。同样的配置完全可以直接使用企业微信送信方式,企业微信送信直接在普通微信客户端就能看到信件内容。

快速到文档指定位置:

邮件送信

Telegram Bot

企业微信

Server 酱

Bark 送信

邮件送信

下面分别介绍GmailQQ邮箱以及163邮箱的设置,你只用看自己需要的部分。注意,QQ邮箱163邮箱均使用账户加授权码的方式登录, 谷歌邮箱使用账户加密码或者账户加授权码的方式登录,请知悉。另外还想吐槽一下,国产邮箱你得花一毛钱给邮箱提供方发一条短信才能拿到授权码。

(点击即可展开或收起)

设置Gmail

推荐打开浏览器隐私模式后再登录 gmail 进行设置,防止当你有多个 gmail 账户时无法跳到正确的设置地址。

1、在设置>转发和POP/IMAP中,勾选

  • 对所有邮件启用 POP
  • 启用 IMAP

gmail配置01

然后保存更改。

2、开启两步验证

参考官方文档:开启两步验证

3、配置使用应用专用密码登录邮箱

参考官方文档:使用应用专用密码登录

由于 Gmail 已不再支持“不安全的登录方式”,故目前只能使用账户加应用专用密码的方式登录。


设置QQ邮箱

设置>账户>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务下,开启POP3/SMTP服务

qq邮箱配置01

此时坑爹的QQ邮箱会要求你用手机发送一条短信给腾讯,发送完了点一下我已发送

qq邮箱配置02

然后你就能看到你的邮箱授权码了,使用邮箱账户加授权码即可登录,记下授权码

qq邮箱配置03

qq邮箱配置04


设置163邮箱

设置>POP3/SMTP/IMAP下,开启POP3/SMTP服务IMAP/SMTP服务并保存

163邮箱配置01

163邮箱配置02

现在点击侧边栏的客户端授权密码,并获取授权码,你看到画面可能和我不一样,因为我已经获取了授权码,所以只有重置授权码按钮,这里自己根据网站提示申请获取授权码,网易和腾讯一样恶心,需要你用手机给它发一条短信才能拿到授权码

163邮箱配置03

163 邮箱送信后,接收方如果没收到可以在垃圾邮件里面找一下。


上面的动作完成后,在.env文件中,将MAIL_USERNAMEMAIL_PASSWORD设置为你的邮箱和密码(或令牌),将TO设置为你的收信邮箱,然后将MAIL_ENABLE的值设为1以启用邮箱送信功能。

上面介绍了三种邮箱的设置方法,如果你不想使用邮件送信,将根目录下的.env文件中的MAIL_ENABLE的值改为0即可关闭邮件推送方式。

邮件 送信部分完。

Telegram Bot

有关 【Telegram Bot】 的具体配置步骤请参考 此处

企业微信

有关 【企业微信】 的具体配置步骤请参考 此处

Server 酱

有关 【Server 酱】 的具体配置步骤请参考 此处

Bark 送信

有关 【Bark 送信】 的具体配置步骤请参考 此处


与 配置送信功能 相关的篇幅完。下面开始讲本项目的几种使用方式。推荐使用 Docker 方式,无需纠结环境。


⛵ 通过 Docker Compose 部署

注意,目前是 beta 版本,只支持在 amd64 架构的机器上安装,arm 或其它架构的用户请稍安勿躁,等后续更新。或者如果你需要一台服务器,可以考虑 美国便宜 VPS

1、一键安装 docker 和 docker compose

Debian / Ubuntu(推荐)

apt-get update -y;
apt-get install -y wget vim git make;
wget -qO- get.docker.com | bash;
systemctl start docker;
sudo systemctl enable docker.service;
sudo systemctl enable containerd.service;
docker version;
DOCKER_COMPOSE_VER=2.24.3;
DOCKER_CONFIG=/usr/local/lib/docker;
mkdir -p $DOCKER_CONFIG/cli-plugins;
curl -SL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VER}/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose;
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose;
docker compose version;

CentOS

yum update -y;
yum install -y wget vim make;
wget -qO- get.docker.com | bash;
systemctl start docker;
sudo systemctl enable docker.service;
sudo systemctl enable containerd.service;
docker version;
DOCKER_COMPOSE_VER=2.24.3;
DOCKER_CONFIG=/usr/local/lib/docker;
mkdir -p $DOCKER_CONFIG/cli-plugins;
curl -SL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VER}/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose;
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose;
docker compose version;

2、下载本项目

git clone https://github.com/luolongfei/freenom.git && cd freenom

3、配置

3.1、申请 wit.ai 的 token

3.1.1 访问 https://wit.ai

3.1.2 使用 Facebook 账户登录或者使用邮箱注册账户登录,只需要邮箱就可以注册

3.1.3 前往 https://wit.ai/apps 画面,创建一个新的 app

3.1.4 语言选择 English,名字随意,类型选择私有,创建之

3.1.5 前往 Management > Settings (https://wit.ai/apps//settings) 画面

3.1.6 复制 Client Access Token,下面需要写入 .env 文件中,WIT_AI_KEY='你复制的 Client Access Token'

3.2、修改 .env 配置文件

将 .env 配置文件中的内容修改为你自己的配置,如果是从旧版升级,也可以直接把旧版 .env 复制到新版项目根目录,脚本会自动更新它。配置含义参考 .env.example 文件中的注解。

cp .env.example .env;
vim .env;

修改完成后,输入 :wq 保存并退出。

4、启动

注意:以下命令均需要在 docker-compose.yml 所在目录执行才有效。

make up

没错,就是这么简单。然后可以执行 make logs 查看实时日志。

4.1、常用命令

启动或者更新到最新版

make up

停止

make down

查看实时日志

make logs

清理容器占用的空间

make clear

重启容器

make restart

通过 docker compose 部署部分结束。

🐳 通过 Docker 部署

如果你有自己的服务器,这是最推荐的部署方式。

Docker 仓库地址为: https://hub.docker.com/r/luolongfei/freenom ,同样欢迎 star 。 此镜像支持的架构为linux/amd64linux/arm64linux/ppc64lelinux/s390xlinux/386linux/arm/v7linux/arm/v6, 理论上支持群晖威联通树莓派以及各种类型的VPS

1、安装 Docker

1.1 以 root 用户登录,执行一键脚本安装 Docker

升级源并安装软件(下面两行命令二选一,根据你自己的系统)

Debian / Ubuntu

apt-get update && apt-get install -y wget vim make

CentOS

yum update && yum install -y wget vim make

执行此命令等候自动安装 Docker

wget -qO- get.docker.com | bash

说明:请使用 KVM 架构的 VPS,OpenVZ 架构的 VPS 不支持安装 Docker,另外 CentOS 8 不支持用此脚本来安装 Docker。 更多关于 Docker 安装的内容参考 Docker 官方安装指南

1.2 针对 Docker 执行以下命令

启动 Docker 服务

systemctl start docker

查看 Docker 运行状态

systemctl status docker

将 Docker 服务加入开机自启动

systemctl enable docker

2、通过 Docker 部署域名续期脚本

2.1 用 Docker 创建并启动容器

命令如下

docker run -d --name freenom --restart always -v $(pwd):/conf -v $(pwd)/logs:/app/logs luolongfei/freenom

或者,如果你想自定义脚本执行时间,则命令如下

docker run -d --name freenom --restart always -v $(pwd):/conf -v $(pwd)/logs:/app/logs -e RUN_AT="11:24" luolongfei/freenom

上面这条命令只比上上条命令多了个 -e RUN_AT="11:24",其中11:24表示在北京时间每天的 11:24 执行续期任务,你可以自定义这个时间。 这里的RUN_AT参数同时也支持 CRON 命令里的时间形式,比如, -e RUN_AT="9 11 * * *",表示每天北京时间 11:09 执行续期任务, 如果你不想每天执行任务,只想隔几天执行,只用修改RUN_AT的值即可。

注意:不推荐自定义脚本执行时间。因为你可能跟很多人定义的是同一个时间点,这样可能导致所有人都是同一时间向 Freenom 的服务器发起请求, 使得 Freenom 无法稳定提供服务。而如果你不自定义时间,程序会自动指定北京时间 06 ~ 23 点全时段随机的一个时间点作为执行时间, 每次重启容器都会自动重新指定。

点我查看上方 Docker 命令的参数解释
命令 含义
docker run 开始运行一个容器
-d 参数 容器以后台运行并输出容器 ID
--name 参数 给容器分配一个识别符,方便将来的启动,停止,删除等操作
--restart 参数 配置容器启动类型,always 即为 docker 服务重新启动时自动启动本容器
-v 参数 挂载卷(volume),冒号后面是容器的路径,冒号前面是宿主机的路径(只支持绝对路径),$(pwd)表示当前目录,如果是 Windows 系统,则可用${PWD}替换此处的$(pwd)
-e 参数 指定容器中的环境变量
luolongfei/freenom 这是从 docker hub 下载回来的镜像完整路径名

至此,你的自动续期容器就跑起来了,执行ls -a后你就可以看到在你的当前目录下,有一个.env文件和一个logs目录,logs目录里面存放的是程序日志, 而.env则是配置文件,现在直接执行vim .env.env文件里的所有配置项改为你自己的并保存即可。然后重启容器,如果配置正确的话,便很快可以收到相关邮件。

点我查看 .env 文件中部分配置项的含义
变量名 含义 默认值 是否必须 备注
FREENOM_USERNAME Freenom 账户 - 只支持邮箱账户,如果你是使用第三方社交账户登录的用户,请在 Freenom 管理页面绑定邮箱,绑定后即可使用邮箱账户登录
FREENOM_PASSWORD Freenom 密码 - 某些特殊字符可能需要转义,详见.env文件内注释
MULTIPLE_ACCOUNTS 多账户支持 - 多个账户和密码的格式必须是“<账户1>@<密码1>|<账户2>@<密码2>|<账户3>@<密码3>”,注意不要省略“<>”符号,否则无法正确匹配。如果设置了多账户,上面的FREENOM_USERNAMEFREENOM_PASSWORD可不设置
MAIL_USERNAME 机器人邮箱账户 - 支持GmailQQ邮箱163邮箱以及Outlook邮箱
MAIL_PASSWORD 机器人邮箱密码 - Gmail填应用专用密码,QQ邮箱163邮箱填授权码
TO 接收通知的邮箱 - 你自己最常用的邮箱,用来接收机器人邮箱发出的域名相关邮件
MAIL_ENABLE 是否启用邮件推送功能 0 1:启用
0:不启用
默认不启用,如果设为1,启用邮件推送功能,则上面的MAIL_USERNAMEMAIL_PASSWORDTO变量变为必填项
TELEGRAM_CHAT_ID 你的chat_id - 通过发送/start@userinfobot可以获取自己的id
TELEGRAM_BOT_TOKEN 你的Telegram bottoken -
TELEGRAM_BOT_ENABLE 是否启用Telegram Bot推送功能 0 1:启用
0:不启用
默认不启用,如果设为1,则必须设置上面的TELEGRAM_CHAT_IDTELEGRAM_BOT_TOKEN变量
NOTICE_FREQ 通知频率 1 0:仅当有续期操作的时候
1:每次执行
NEZHA_SERVER 哪吒探针服务端的 IP 或域名 -
NEZHA_PORT 哪吒探针服务端的端口 -
NEZHA_KEY 哪吒探针客户端专用 Key -
NEZHA_TLS 哪吒客户SSL/TLS加密 - 1:启用
0:不启用

更多配置项含义,请参考 .env.example 文件中的注释。

如何验证你的配置是否正确呢?

修改并保存.env文件后,执行docker restart freenom重启容器,等待 5 秒钟左右,然后执行docker logs freenom查看输出内容, 观察输出内容中有执行成功 字样,则表示配置无误。如果你还来不及配置送信邮箱等内容,可先停用邮件功能。

如何升级到最新版或者重新部署呢?

.env所在目录,执行docker rm -f freenom删除现有容器,然后再执行 docker rmi -f luolongfei/freenom 删除旧的镜像,然后再执行上面的 docker run -d --name freenom --restart always -v $(pwd):/conf -v $(pwd)/logs:/app/logs luolongfei/freenom 重新部署即可,这样部署后就是最新的代码了。当然,新版对应的.env文件可能有变动,不必担心,程序会自动更新.env文件内容,并将已有的配置迁移过去。

一句话操作,即在.env文件所在目录下执行以下命令,即可完成更新升级:

docker rm -f freenom && docker rmi -f luolongfei/freenom && docker run -d --name freenom --restart always -v $(pwd):/conf -v $(pwd)/logs:/app/logs luolongfei/freenom
2.2 后期容器管理以及 Docker 常用命令

查看容器在线状态及大小

docker ps -as

查看容器的运行输出日志

docker logs freenom

重新启动容器

docker restart freenom

停止容器的运行

docker stop freenom

移除容器

docker rm -f freenom

查看 docker 容器占用 CPU,内存等信息

docker stats --no-stream

查看 Docker 安装版本等信息

docker version

重启 Docker(非容器)

systemctl restart docker

有关容器部署的内容结束。


🧊 通过 Heroku 部署

Heroku 已于 2022-11-28 停止提供免费服务,所以,忘掉本文吧。官方通告:https://blog.heroku.com/next-chapter

有关 【通过 Heroku 部署】 的具体操作步骤请参考 此处


🚈 通过 Railway 部署

Railway 已更新服务条款,每月增加了使用时长限制,新的服务条款导致每月最多只能运行 21 天左右, 除非你验证了信用卡,则没有这个限制 。详细条款内容参考 此处

有关 【通过 Railway 部署】 的具体操作步骤请参考 此处


📦 通过 Koyeb 部署

推荐没有自己服务器的用户使用此方案部署。此方案完全免费。

有关 【通过 Koyeb 部署】 的具体操作步骤请参考 此处

在看完上行文档的具体内容,并且你确定你行后,便可点击下方按钮,尝试一键部署:

Deploy to Koyeb


🧪 通过 Mogenius 部署

已下线免费套餐,不再可用。 #208


☁ 通过各种云函数部署

所有云函数使用的是同一个压缩包,已做兼容处理,下载地址: https://github.com/luolongfei/freenom/releases/download/v0.5.1/freenom_scf.zip 。本文档会在发布新版的时候同步更新此处的压缩包下载地址,所以不必担心,你看到的下载地址指向的包一定是最新版本。

下载后你将得到一个 zip 文件,将 zip 文件放到你能找到的任意目录,后面我们将以 zip 文件的形式上传到各种云函数。

有关 【通过腾讯云函数部署】 的具体操作步骤请参考 此处

有关 【通过阿里云函数部署】 的具体操作步骤请参考 此处

有关 【通过华为云函数部署】 的具体操作步骤请参考 此处


🚧 直接拉取源码部署

有关 【直接拉取源码部署】 的具体操作步骤请参考 此处


遇到任何问题或 Bug 欢迎提 issue (请按模板格式提issue,以便我快速复现你的问题,否则问题会被忽略), 如果Freenom 改变算法导致此项目失效,请提 issue 告知,我会及时修复,本项目长期维护。 欢迎star~

📋 赞助名单 Donation List

非常感谢「 这些用户 」对本项目的赞助支持!

❤ 赞助 Donation

如果你觉得本项目对你有帮助,请考虑赞助本项目,以激励我投入更多的时间进行维护与开发。 If you find this project helpful, please consider supporting the project going forward. Your support is greatly appreciated.

ko-fi

PayPal: https://www.paypal.me/mybsdc

Every time you spend money, you're casting a vote for the kind of world you want. -- Anna Lappe

pay

每一次你花的钱都是在为你想要的世界投票。

题外话:赞助的时候可以留言,留言内容将被展示在 赞助列表画面 。如果赞助图片未能正常显示,请访问: https://images.llfapp.com/pay.png

你的star或者赞助是我长期维护此项目的动力所在,由衷感谢每一位支持者,“每一次你花的钱都是在为你想要的世界投票”。 另外,将本项目推荐给更多的人,也是一种支持的方式,用的人越多更新的动力越足。

🪓 信仰

相信未来,保持“理智”。

认真是我们参与这个社会的方式,认真是我们改变这个社会的方式。 ——李志

南京市民李先生

🌚 作者

💖 所有贡献者

All Contributors

@anjumrafidofficial

📝 TODO List

  • 支持交互式安装,免去手动修改配置的繁琐操作
  • 支持自动升级
  • 多个账户的续期结果通知合并为同一条消息

🍅 本项目的其它语言实现

(更多其它语言欢迎提交 PR 更新此列表)

🎉 鸣谢

🥝 开源协议

MIT

freenom's People

Contributors

abwuge avatar dizicheng avatar fscarmen avatar hanero avatar josark2005 avatar jwan9714 avatar llfapp avatar luolongfei avatar mattraks avatar mybsdc avatar pencilnavigator avatar thund1r avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

freenom's Issues

feature_request是否可以增加pp.ua的支持

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
是否可以增加pp.ua自动续期的支持
非常感谢!

腾讯云函数部署无法进行smtp(Gmail)送信

描述问题

无法进行smtp(Gmail)送信。使用腾讯云函数部署。
已手动测试,账户和密码均无误。

重现步骤

腾讯云函数中配置变量,并且 .env.example 中设置相同内容。

截图&日志
image

你做了哪些尝试

重新配置账户,密码。
多次测试。
启用不安全应用访问,并且已经前往[这个页面](https://accounts.google.com/b/0/DisplayUnlockCaptcha)允许登录

环境信息

  • Tencent SCF
  • php7.2
  • freenom续期脚本版本 v0.2.2

额外的备注

bug_report出错:登录 freenom 出错。错误信息:cURL error 6

描述问题

[2022-02-06 22:50:51] 当前程序版本 v0.4.4 
[2022-02-06 22:50:51] 共发现 1 个 freenom 账户,处理中 
[2022-02-06 22:50:56] 出错:登录 freenom 出错。错误信息:cURL error 6: Could not resolve host: my.freenom.com (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)(Error code: 34520002) 
[Info] 已自动指定执行时间,续期任务将在北京时间每天 「17:32」 执行
[Info] 在没有手动指定 RUN_AT 环境变量的情况下,每次重启容器,程序都会重新在 06 ~ 23 点全时段中自动随机指定一个执行时间,目的是防止很多人在同一个时间点执行任务导致 Freenom 无法稳定提供服务
[Info] 计划任务:32 17 * * * php /app/run > /app/logs/freenom_cron.log 2>&1

重现步骤

重启 docker (非重启容器)后还是出现现这种情况,

截图&日志

环境信息

  • centos7 x64
  • php7.2
  • freenom续期脚本版本 v0.2.2

群晖Docker部署bug

黑群晖6.2.3部署docker时出现的,脚本会自己运行两次?第一次提示没有配置,第二次是正确提示,我已经按照要求修改了.env文件,但是不知道第一次运行的时候是读取的哪个.env文件。完整信息如下

root@DiskStation:/volume1/docker/Freenom# docker logs freenom
[Info] 已生成 .env 文件,请将 .env 文件中的配置项改为你自己的,然后重启容器
[Info] 已自动指定执行时间,续期任务将在北京时间每天 「14:13」 执行
[Info] 在没有手动指定 RUN_AT 环境变量的情况下,每次重启容器,程序都会重新在 06 ~ 23 点全时段中自动随机指定一个执行时间,目的是防止很多人在同一个时间点执行任务导致 Freenom 无法稳定提供服务
[Info] 计划任务:13 14 * * * php /app/run > /app/logs/freenom_cron.log 2>&1
[2022-02-28 00:07:12] 当前程序版本 v0.4.5
[2022-02-28 00:07:12] 执行出错:检测到你尚未配置 freenom 账户信息,请修改 .env 文件中与账户相关的项,否则程序无法正常运作(Error code: 34520001) [{"file":"/app/app/Console/FreeNom.php","line":419,"function":"getAccounts","class":"Luolongfei\App\Console\FreeNom","type":"->","args":[]},{"file":"/app/run","line":110,"function":"handle","class":"Luolongfei\App\Console\FreeNom","type":"->","args":[]},{"file":"/app/run","line":121,"function":"run","args":[]}]
[Info] 已自动指定执行时间,续期任务将在北京时间每天 「14:49」 执行
[Info] 在没有手动指定 RUN_AT 环境变量的情况下,每次重启容器,程序都会重新在 06 ~ 23 点全时段中自动随机指定一个执行时间,目的是防止很多人在同一个时间点执行任务导致 Freenom 无法稳定提供服务
[Info] 计划任务:49 14 * * * php /app/run > /app/logs/freenom_cron.log 2>&1
[2022-02-28 00:11:52] 当前程序版本 v0.4.5
[2022-02-28 00:11:52] 共发现 1 个 freenom 账户
[2022-02-28 00:11:52] 开始处理第 1 个 freenom 账户:[email protected] [1/1]
[2022-02-28 00:11:58] [email protected]:执行成功,今次没有需要续期的域名。

环境信息

  • debian11 x64
  • php8.0
  • freenom续期脚本版本 v0.4.5

额外的备注

  • 能看看是哪里的问题吗,虽然看起来能正确运行,但好像还是有点小bug

运行异常

请教一下,安装了青龙面板。是不是影响这个呢、

建议增加自定义邮箱smtp参数功能

首先,非常感谢您的这个项目。
我计划使用个人域名邮箱发送通知邮件,但是项目只支持这3个邮箱类型,gmail登录被拒,其他两个不想验证邮箱。尽管我的域名是托管在gsuit上的,smtp参数和gmail一样,项目仍无法判断出来,最终我把Mail.php当中的代码修改了一点点才可以发送成功。
因此建议增加一点配置,可以自定义smtp服务器参数。

Call to undefined function GuzzleHttp\\_idn_uri_convert()

最近几天在执行函数的时候遇到了这个错误,以往并没有这个问题
平台:阿里云函数

错误类型:UnhandledInvocationError
返回结果
{"errorMessage":"Call to undefined function GuzzleHttp\\_idn_uri_convert()","errorType":"Error","stackTrace":{"file":"\/code\/vendor\/guzzlehttp\/guzzle\/src\/Client.php","line":220,"traceString":""}}
日志输出

FunctionCompute php7.2 runtime inited.
FC Invoke Start RequestId: 7ba666f6-39ec-4caf-ab42-d5ab9df35cc6
2022-02-04T07:35:03Z 7ba666f6-39ec-4caf-ab42-d5ab9df35cc6 [INFO] 开始执行阿里云函数
FC Invoke End RequestId: 7ba666f6-39ec-4caf-ab42-d5ab9df35cc6
array (
  'errorMessage' => 'Call to undefined function GuzzleHttp\\_idn_uri_convert()',
  'errorType' => 'Error',
  'stackTrace' => 
  array (
    'file' => '/code/vendor/guzzlehttp/guzzle/src/Client.php',
    'line' => 220,
    'traceString' => '',
  ),
)

无法登录freenom账号,bark发送失败: cURL error 6

描述问题

按文档部署后测试正常,但是第二天登录查看日志时显示:
无法登录freenom账号,bark发送失败: cURL error 6

重现步骤

截图&日志
重启docker前
image
image
重启docker后
image

你做了哪些尝试

重启容器后问题依旧
重启docker后问题消失,恢复正常

环境信息

  • centos8 x64
  • Docker version 20.10.11, build dea9396
  • freenom续期脚本版本 v0.4.3

额外的备注

bug_report

描述问题

邮件截图显示503错误,坐等freenom修复还是freenom改url了?
Server error: `POST https://my.freenom.com/dologin.php` resulted in a `503 Service Unavailable: Back-end server is at capacity` response
在https://my.freenom.com/clientarea.php页面上手动登录时OK的

截图&日志
image

你做了哪些尝试

找了一下登录页的源码
<form method="post" action="dologin.php" class="form-stacked">
      。。。
</form>
又好像url没变

环境信息
腾讯云函数

额外的备注
在此之前都是OK的,今天第一次出现

服务器上部署后运行php run报错

root@debian11:/data/wwwroot/freenom# php run
PHP Fatal error: Class 'Luolongfei\Libs\Log' not found in /data/wwwroot/freenom/run on line 54

Fatal error: Class 'Luolongfei\Libs\Log' not found in /data/wwwroot/freenom/run on line 54

用的是方式三:直接拉取源码部署的

通过直接拉取源码部署报错

描述问题
通过直接拉取源码部署

重现步骤

最后一步的时候验证的时候
cd /data/wwwroot/freenom/ && php run
报错
[2022-03-12 18:56:34] {"type":2,"message":"require(\/data\/wwwroot\/freenom\/resources\/lang\/zh_cn:zh.php): Failed to open stream: No such file or directory","file":"\/data\/wwwroot\/freenom\/libs\/Lang.php","line":22}
**截图&日志**


**环境信息**
 - debian11 x64
 - php8.0
 - freenom续期脚本版本 v0.4.5

**额外的备注**
- 直接拉取源码部署

bug_report

描述问题

0.4.4 无法更新到最新版0.4.5

重现步骤

 2862  docker rm -f freenom
 2863  docker rmi -f luolongfei/freenom
 2864  docker run -d --name freenom --restart always -v $(pwd):/conf -v $(pwd)/logs:/app/logs luolongfei/freenom
 2865  docker run -d --name freenom --restart always -v $(pwd):/conf -v $(pwd)/logs:/app/logs luolongfei/freenom\n
 2866  docker restart freenom
 2867  docker logs freenom

截图&日志
[2022-03-19 23:19:23] 当前程序版本 v0.4.4
[2022-03-19 23:19:23] 共发现 1 个 freenom 账户,处理中
[2022-03-19 23:19:35] 当前通知频率为「仅当有续期操作时」,故本次不会推送通知
[2022-03-19 23:19:35] *********:执行成功,今次没有需要续期的域名。
[Info] 已自动指定执行时间,续期任务将在北京时间每天 「13:24」 执行
[Info] 在没有手动指定 RUN_AT 环境变量的情况下,每次重启容器,程序都会重新在 06 ~ 23 点全时段中自动随机指定一个执行时间,目的是防止很多人在同一个时间点执行任务导致 Freenom 无法稳定提供服务
[Info] 计划任务:24 13 * * * php /app/run > /app/logs/freenom_cron.log 2>&1
[2022-03-19 23:21:57] FreeNom 续期工具有新的版本可用,最新版本为 v0.4.5(https://github.com/luolongfei/freenom/releases/tag/v0.4.5)
[2022-03-19 23:22:18] 邮件发送失败:SMTP 错误:数据不被接受。
[2022-03-19 23:22:18] 当前程序版本 v0.4.4
[2022-03-19 23:22:18] 共发现 1 个 freenom 账户,处理中
[2022-03-19 23:22:26] 当前通知频率为「仅当有续期操作时」,故本次不会推送通知
[2022-03-19 23:22:26] ********:执行成功,今次没有需要续期的域名。
你做了哪些尝试

重复以上命令多次,依旧无法更新

环境信息

  • 系统: ubuntu server 20.04
  • PHP 版本: (例如 php8.0)
  • 脚本版本: 0.4.4
  • 是否 Docker: 是,docker v20.10.8

额外的备注

家庭网络环境下 nas,

续期成功,但是微信推送报错

腾讯云部署。

续期成功,但是微信推送报错,如下:

主人,出错了,There is no existing directory at "/var/user/logs/2022-03" and its not buildable: Read-only file system

具体是在/var/user/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php文件的第174行,抛出了一个异常。异常的内容是There is no existing directory at "/var/user/logs/2022-03" and its not buildable: Read-only file system,快去看看吧。(账户:[email protected]

日志如下:

[2022-03-29 12:12:26] 出错:There is no existing directory at "/var/user/logs/2022-03" and its not buildable: Read-only file system [{"file":"/var/user/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php","line":99,"function":"createDir","class":"Monolog\Handler\StreamHandler","type":"->","args":[]},{"file":"/var/user/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php","line":39,"function":"write","class":"Monolog\Handler\StreamHandler","type":"->","args":[{"message":"账户:[email protected]\n续期结果如下:\n","context":

重新运行一遍函数,微信推送正常。

报告,今天没有域名需要续期

我刚刚帮小主看了一下,账户 [email protected] 今天并没有需要续期的域名。所有域名情况如下:
xxx.xx 还有 345 天到期
更多信息可以参考 Freenom官网 哦~

获取域名状态页面出错

主人,出错了,获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009)
具体是在/var/user/app/Console/FreeNom.php文件的第204行,抛出了一个异常。异常的内容是获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009),快去看看吧。(账户:)

bug_report

描述问题
.env文件为隐藏,能否可以取消隐藏,这样在OP ENWRT的DOCKER里就可以直接实现修改,而无需借助其他链接工具了。谢谢。

企业微信送信失败:cURL error 7

描述问题

按照手册注册企业,创建应用,随后填入对应的键值
运行后log中提示“企业微信送信失败:cURL error 7: Failed to connect to qyapi.weixin.qq.com port 443: Connection refused (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)”

重现步骤

截图&日志
image

你做了哪些尝试

重新核查了一遍所需配置的键值对, 无误

环境信息

  • docker 19.03.12
  • freenom续期脚本latest(2021年12月7日)

额外的备注

  • N/A.

可不可以增加一个对阿里云函数的支持

在尝试部署到阿里云函数计算的时候提示
{"errorMessage":"function handler not found","errorType":"Exception","stackTrace":{"file":"/var/fc/runtime/php7.2/src/invoke.php","line":71,"traceString":""}}
可以尝试支持一下吗

bug_report bark报错"Cannot POST //"

描述问题

docker模式下使用bark报错
[2022-01-08 21:39:51] Bark 送信失败:Client error: `POST http://...//...` resulted in a `404 Not Found` response:
Cannot POST //

重现步骤

截图&日志
image

你做了哪些尝试

环境信息

  • Docker version 20.10.12, build e91ed57
  • freenom续期脚本版本 v0.4.4

额外的备注

配置好env,执行后出现问题,用的最新docker镜像

大佬您好,出现这个问题,期待您的回答。
具体是在/app/app/Console/FreeNom.php文件的第195行,抛出了一个异常。异常的内容是获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009),快去看看吧。
image

bug_report

描述问题

获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009)

具体是在/var/user/app/Console/FreeNom.php文件的第204行,抛出了一个异常。异常的内容是获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009),快去看看吧。

重现步骤

获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009)

具体是在/var/user/app/Console/FreeNom.php文件的第204行,抛出了一个异常。异常的内容是获取域名状态页面出错,可能是未登录或者登录失效,请重试。(Error code: 34520009),快去看看吧。

截图&日志

你做了哪些尝试

v0.4.4也试了 同样的问题 不知道是我的问题还是文件的问题

环境信息

  • 腾讯云函数
  • php7.2
  • freenom续期脚本版本 v0.4.5

额外的备注

docker也试了 同样的问题

针对 hax vps 报错 cURL error 6: Could not resolve host: my.freenom.com 的解决方案

描述问题
执行报错

重现步骤
安装好docker,修改env文件后,重启docker,在输入日志
截图&日志
出错:登录 freenom 出错。错误信息:cURL error 6: Could not resolve host: my.freenom.com (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://my.freenom.com/dologin.php(Error code: 34520002)
你做了哪些尝试
重新编辑env文件

环境信息

  • Ubantu 20
  • php8.0
  • freenom续期脚本版本 v0.4.5

额外的备注

  • Add any other context about the problem here.

腾讯云函数执行出错

描述问题

部署完后
END RequestId: 7c31cb0e-42da-4450-b16b-5aaca63b7a84
Report RequestId: 7c31cb0e-42da-4450-b16b-5aaca63b7a84 Duration:3000ms Memory:512MB MemUsage:13.6208MB

重现步骤

点测试后出现以下

截图&日志
Uploading image.png…

你做了哪些尝试

描述你发现问题后做了哪些尝试,方便我快速排除某些问题,提高沟通效率。

环境信息

  • php7.2
  • 最新版本

额外的备注

  • Add any other context about the problem here.

bug_report

描述问题

root@NAS:/www/server/php/74/bin# php /data/wwwroot/freenom/run                 
 [2022-02-02 01:18:20] {"type":64,"message":"require(): Failed opening required '\/data\/wwwroot\/freenom\/resources\/lang\/en_US:en.php' (include_path='.:')","file":"\/data\/wwwroot\/freenom\/libs\/Lang.php","line":22}

重现步骤

root@NAS:/www/server/php/74/bin# php /data/wwwroot/freenom/run   

截图&日志

你做了哪些尝试

描述你发现问题后做了哪些尝试,方便我快速排除某些问题,提高沟通效率。

环境信息

  • debian 10
  • php7.4
  • freenom续期脚本版本 v0.4.4

额外的备注

  • Add any other context about the problem here.

bug_report

描述问题
消息正常推送,但控制台报错。

[2022-01-18 09:47:24] Telegram 消息发送失败:Client error: `POST https://api.telegram.org/bot<TOKEN>/sendMessage` resulted in a `400 Bad Request` response:
{"ok":false,"error_code":400,"description":"Bad Request: can't parse entities: Character '{' is reserved and must be esc (truncated...)

环境信息

  • Termux
  • PHP 8.1.0 (cli) (built: Jan 14 2022 10:39:18) (NTS)
  • freenom续期脚本版本 v0.4.4

腾讯云函数添加后测试失败

返回结果

Text
{"errorCode":-1,"errorMessage":"Invoking task timed out after 3 seconds","requestId":"179f949c-648a-4746-b828-edf350886988","statusCode":433}

执行日志

UTF-8
START RequestId: 179f949c-648a-4746-b828-edf350886988

Event RequestId: 179f949c-648a-4746-b828-edf350886988

[2021-09-27 18:31:41] 当前程序版本 v0.3_scf

END RequestId: 179f949c-648a-4746-b828-edf350886988

Report RequestId: 179f949c-648a-4746-b828-edf350886988 Duration:3000ms Memory:128MB MemUsage:13.7305MB

添加支持Cloudflare Workers部署

Is your feature request related to a problem? Please describe.
添加一个部署方式多一种选择(主要是更方便点)

Describe the solution you'd like
添加支持Cloudflare Workers部署

登录 freenom 出错。错误信息:Client error: `POST https://my.freenom.com/dologin.php` resulted in a `429 Too Many Requests` response(Error code: 34520002)

描述问题

开始使用ok,这几天邮件提示“具体是在/root/freenom/app/Console/FreeNom.php文件的第131行,抛出了一个异常。异常的内容是登录 freenom 出错。错误信息:Client error: `POST https://my.freenom.com/dologin.php` resulted in a `429 Too Many Requests` response(Error code: 34520002),快去看看吧。”

重现步骤

步骤一

截图&日志
image

环境信息

  • centos7 x64
  • php7.0
  • freenom续期脚本版本 未知

脚本是不是无法支持纯ipv6服务器,日志提示无法登录freenom

描述问题

脚本是不是无法支持纯ipv6服务器,日志提示无法登录freenom

重现步骤

确保安装和设置信息无误

截图&日志
开始处理第 1 个 freenom 账户 [1/1]
[2022-03-01 14:40:09] 出错:登录 freenom 出错。错误信息:cURL error 6: Could not resolve host: my.freenom.com (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://my.freenom.com/dologin.php(Error code: 34520002)
[2022-03-01 14:40:15] Telegram 消息发送失败:cURL error 6: Could not resolve host: api.telegram.org
你做了哪些尝试

1.修改了dns配置(地址:2001:67c:2b0::4 地址:2001:67c:2b0::6)
2.可以用ping6连通www.google.com及www.freenom.com,但无法连通my.freenom.com
3.多次过重启 Docker(非容器),包括服务器,有尝试。

环境信息

  • centos7.9 x64
  • php7.4
  • freenom续期脚本版本 v0.4.5

bug_report

Describe the problem

Docker container sends Chinese language notifications on Telegram.

Steps to reproduce

Add "LANGUAGE=en" in .env file

Screenshots & Logs

What did you try

I've manually downloaded the latest .env file from this repository but still, it sends Chinese notifications on Telegram.

Environmental Information

  • Ubuntu server 20.04 armhf
  • Docker image latest tag arm/v7

Additional Notes

  • Container may be working correctly because I don't have any renewable domain.

密码中含有%号也会报错

我的freenom 密码有% , 也会报错 , 查了半天才发现是这个问题。

请更新一下以免其他人也遇到,谢谢!

bug_report

描述问题


**重现步骤**


**截图&日志**
[2022-03-01 09:52:43] 执行出错:Failed to parse dotenv file due to a missing closing quote. Failed at ['5042328466:AAGTPmHxDvbKnsf8Hl378y3T6ckI_v_zsO4]. [{"file":"\/app\/vendor\/vlucas\/phpdotenv\/src\/Parser.php","line":30,"function":"parseValue","class":"Dotenv\\Parser","type":"::","args":["'5042328466:AAGTPmHxDvbKnsf8Hl378y3T6ckI_v_zsO4"]},{"file":"\/app\/vendor\/vlucas\/phpdotenv\/src\/Loader.php","line":169,"function":"parse","class":"Dotenv\\Parser","type":"::","args":["TELEGRAM_BOT_TOKEN='5042328466:AAGTPmHxDvbK4"]},{"file":"\/app\/vendor\/vlucas\/phpdotenv\/src\/Loader.php","line":107,"function":"processEntries","class":"Dotenv\\Loader","type":"->","args":[["ENV_FILE_VERSION='v2'","FREENOM_USERNAME=","FREENOM_PASSWORD=1","MULTIPLE_ACCOUNTS=''","FREENOM_PROXY=''","MAIL_USERNAME=1.com","MAIL_PASSWORD=rjbjfxhddj","[email protected]","MAIL_ENABLE=0","MAIL_HOST=''","MAIL_PORT=''","MAIL_ENCRYPTION=''","TELEGRAM_CHAT_ID=1273","TELEGRAM_BOT_TOKEN='5042AGTPmHxDvbKnsf8Hl378y3T6ckI_v_zsO4","'","TELEGRAM_PROXY=''","TELEGRAM_BOT_ENABLE=1","WECHAT_CORP_ID=''","WECHAT_CORP_SECRET=''","WECHAT_AGENT_ID=''","WECHAT_ENABLE=0","SCT_SEND_KEY=''","SCT_ENABLE=0","BARK_KEY=''","BARK_URL='https:\/\/api.day.app'","BARK_IS_ARCHIVE=''","BARK_GROUP='FreeNom'","BARK_LEVEL='active'","BARK_ICON='https:\/\/q2.qlogo.cn\/headimg_dl?dst_uin=593198779&spec=100'","BARK_JUMP_URL=''","BARK_SOUND='gotosleep'","BARK_ENABLE=0","NOTICE_FREQ=1","VERIFY_SSL=0","DEBUG=0","NEW_VERSION_DETECTION=1"]]},{"file":"\/app\/vendor\/vlucas\/phpdotenv\/src\/Loader.php","line":91,"function":"loadDirect","class":"Dotenv\\Loader","type":"->","args":
**你做了哪些尝试**
vi .env修改配置文件后 
再次尝试重启和输入还是不能运行

**环境信息**
 - ubuntu11 x64
 - php8.0
 - freenom续期脚本版本 v0.4.5

**额外的备注**
- Add any other context about the problem here.

增加可选推送途径

感谢作者的作品,测试了一下,配置简单,好用。
在配置推送方面,我测试了邮件、tg机器人、Server 酱。
在测试Server 酱时,出现了请求失败的情况,以及老版的Server 酱已经快没了。
请看下是否可以增加pushplus或者WxPusher。

bug_report tele配置报错

描述问题
报错如下:
,抛出了一个异常。异常的内容是Client error: POST https:\/\/api.telegram.org\/botTOKEN\/sendMessage resulted in a 400 Bad Request response:\n{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}\

重现步骤
第一次配置报错

环境信息

  • ubuntu
  • php7.2
  • freenom续期脚本版本 v0.3.0

php run出错: Failed opening required '\/home\/xxx\/freenom\/resources\/lang\/zh_CN:zh.php'

php run无法执行
php run程序无法顺利执行

重现步骤

  1. 不使用docker
  2. 按照README文档直接clone代码到本机
  3. 修改完.env配置文件
  4. 并添加进crontab中进行测试,出现程序出错

截图&日志

$cat freenom_crontab.log
[2022-01-24 21:58:22] {"type":64,"message":"require(): Failed opening required '\/home\/had\/freenom\/resources\/lang\/zh_CN:zh.php' (include_path='.:\/usr\/share\/php')","file":"\/home\/had\/freenom\/libs\/Lang.php","line":22}

你做了哪些尝试

  • 修改.env配置文件,将zh环境改成en,出错信息一样和上面一样.
$cat freenom_crontab.log
[2022-01-24 21:58:22] {"type":64,"message":"require(): Failed opening required '\/home\/had\/freenom\/resources\/lang\/zh_CN:zh.php' (include_path='.:\/usr\/share\/php')","file":"\/home\/had\/freenom\/libs\/Lang.php","line":22}
  • 进入目录, 手动执行php run, 出错信息依然一样
$ php run 
[2022-01-24 21:58:22] {"type":64,"message":"require(): Failed opening required '\/home\/had\/freenom\/resources\/lang\/zh_CN:zh.php' (include_path='.:\/usr\/share\/php')","file":"\/home\/had\/freenom\/libs\/Lang.php","line":22} 

环境信息

  • kali-rolling x64
  • 内核: Linux world 5.15.0-kali2-amd64 #1 SMP Debian 5.15.5-2kali2 (2021-12-22) x86_64 GNU/Linux
  • PHP 7.4.26
  • freenom续期脚本版本 v0.2.2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.