最近做了一个很有意思的小项目:通过 Telegram API 自动修改自己的 Telegram 显示姓名,在名字后面实时追加当前时间、天气图标和温度。

效果类似这样:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

image-UWfs.png

前面的 𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸 是用户自己设置的基础姓名,后面的 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂 会由脚本自动更新。

这个项目适合用来做 Telegram 个人主页小装饰,也可以作为一个练手项目,了解 Telegram 用户 API、定时任务、天气 API、环境变量配置和服务器常驻运行。

项目效果

最终 Telegram 显示姓名会变成:

JohnMuyno 14:11 🌦️ 25°C

或者使用花体 / 特殊 Unicode 字体:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

项目会定时获取:

  • 当前时间
  • 当前天气状态
  • 当前温度

然后调用 Telegram API 修改当前账号的 first_name

项目地址

Github链接:https://github.com/JohnMuyuan/TelegramNameShowTime

项目功能

这个小工具主要实现了以下功能:

  • 自动登录 Telegram 用户账号
  • 保存 Telegram 登录 Session,避免每次重复输入验证码
  • 使用 Open-Meteo 免费天气接口获取实时天气
  • 定时修改 Telegram 显示姓名
  • 支持自定义基础姓名
  • 支持自定义经纬度位置
  • 支持自定义时区
  • 支持自定义更新间隔
  • 支持数字花体显示,例如 15:00 转成 𝟏𝟓:𝟎𝟎
  • 可以部署到服务器长期运行

实现原理

整个项目的原理并不复杂,可以拆成几个部分。

1. Telegram 用户 API

Telegram 修改个人资料不能用普通 Bot API 完成,因为 Bot API 只能控制机器人,不能修改用户自己的昵称。

所以这里使用的是 Telegram 用户 API,也就是通过 api_idapi_hash 登录真实 Telegram 账号,然后调用 Telegram 的用户接口修改个人资料。

项目里使用的是 Node.js 的 gramjs 库,也就是 npm 包:

telegram

修改姓名时调用的是:

Api.account.UpdateProfile

核心逻辑类似:

await client.invoke(
  new Api.account.UpdateProfile({
    firstName: nextName
  })
);

这里的 nextName 就是最终要显示到 Telegram 上的姓名,例如:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

2. 获取当前时间

项目通过 JavaScript 内置的 Intl.DateTimeFormat 获取指定时区的当前时间。

例如:

new Intl.DateTimeFormat('en-GB', {
  hour: '2-digit',
  minute: '2-digit',
  hour12: false,
  timeZone: 'Asia/Shanghai'
}).format(new Date());

如果当前时间是下午三点,会得到:

15:00

然后项目会把普通数字转换成数学粗体数字:

15:00 -> 𝟏𝟓:𝟎𝟎

3. 获取天气和温度

天气数据使用的是 Open-Meteo。

Open-Meteo 的优点是:

  • 免费
  • 不需要 API Key
  • 支持经纬度查询
  • 支持当前温度和天气代码
  • 接口简单

请求地址类似:

https://api.open-meteo.com/v1/forecast?latitude=31.2304&longitude=121.4737&current=temperature_2m,weather_code&timezone=Asia/Shanghai

接口会返回当前温度和天气代码,例如:

{
  "current": {
    "temperature_2m": 28.4,
    "weather_code": 61
  }
}

项目会把温度四舍五入:

28.4 -> 28

然后把天气代码转换成对应 emoji:

61 -> 🌦️

最后拼接成:

🌦️ 𝟐𝟖°𝐂

4. 定时更新姓名

脚本启动后会立即更新一次姓名,然后按照配置的间隔定时更新。

例如配置:

UPDATE_INTERVAL_SECONDS=60

表示每 60 秒更新一次。

内部逻辑类似:

await updateName();
setInterval(updateName, config.updateIntervalSeconds * 1000);

为了避免重复请求,如果生成出来的姓名和上一次完全一样,脚本会跳过本次修改。

项目结构

项目结构大概如下:

TelegramNameShowTime/
├─ src/
│  └─ index.js
├─ .env.example
├─ .gitignore
├─ package.json
├─ package-lock.json
└─ README.md

主要文件说明:

src/index.js

核心代码,负责 Telegram 登录、天气获取、姓名拼接和定时更新。

.env.example

配置模板,复制成 .env 后填写自己的参数。

package.json

项目依赖和启动脚本。

README.md

项目使用说明。

安装环境(非服务器)

项目使用 Node.js 编写,建议版本:

Node.js >= 18

可以检查本机版本:

node -v
npm -v

如果没有安装 Node.js,可以到官网下载安装:

https://nodejs.org/

服务器部署时推荐使用 Node.js 20 LTS。

获取 Telegram API 信息

使用这个项目之前,需要先准备 Telegram 的 api_idapi_hash

打开:

https://my.telegram.org/apps

登录你的 Telegram 账号
image-hMwN.png
然后创建一个 App。

建议填写:

App title: NameTimeUpdater
Short name: nametimeupdater
Platform: Desktop
Description: Telegram name time updater

创建成功后会得到:

api_id
api_hash

image-pkUI.png

这两个值后面要写入 .env 文件。

image-RJcP.png
如果遇到上面的问题,请确保你的网络环境为家庭宽带,不要使用机房IP。切换为家庭宽带即可解决。

注意:这里用的是 Telegram 用户 API,不是 Bot API,所以不是去找 BotFather 创建机器人。

本地运行方法

1. 安装依赖

进入项目目录:

cd TelegramNameShowTime

安装依赖:

npm install

2. 创建配置文件

复制配置模板:

cp .env.example .env

Windows PowerShell 可以使用:

Copy-Item .env.example .env

3. 编辑配置

打开 .env,填写自己的配置。

示例:

TELEGRAM_API_ID=123456
TELEGRAM_API_HASH=your_api_hash

BASE_NAME=𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸

LATITUDE=24.8648
LONGITUDE=118.6699
TIME_ZONE=Asia/Shanghai

UPDATE_INTERVAL_SECONDS=60
SESSION_FILE=.telegram-session

4. 启动项目

npm start

首次运行时会要求输入 Telegram 手机号:

请输入 Telegram 手机号(含国家区号,例如 +8613...):

输入格式示例:

+8613812345678

之后 Telegram 会发送验证码,输入验证码即可。

如果账号开启了两步验证,还需要输入两步验证密码。

登录成功后,项目会保存 Session 到:

.telegram-session

以后再次运行就不需要重复输入验证码了。

服务器部署方法(推荐)

如果希望这个工具 24 小时运行,推荐部署到 Linux 服务器上,并使用 pm2 后台运行。

下面以 Ubuntu / Debian 为例。

1. 安装 Node.js

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

检查版本:

node -v
npm -v

有结果就是安装成功了。

2. 上传项目到服务器

可以使用 scp

scp -r TelegramNameShowTime root@你的服务器IP:/opt/TelegramNameShowTime

也可以使用 SFTP 工具,例如 WinSCP、FinalShell、Xftp。

前往项目地址,下载zip压缩包。
image-zoBb.png
随后将压缩包上传至服务器并解压。(可使用unzip解压,没安装就输入 apt install unzip 安装下)

3. 安装依赖

登录服务器:

ssh root@你的服务器IP

进入项目:

cd /opt/TelegramNameShowTime

安装依赖:

npm install

4. 配置 .env

cp .env.example .env
nano .env

示例.env如下:

TELEGRAM_API_ID=123456
TELEGRAM_API_HASH=your_api_hash

# Your original display name. The script appends time/weather after it.
BASE_NAME=Clifeals

# Location for weather and local time.
LATITUDE=31.2304
LONGITUDE=121.4737
TIME_ZONE=Asia/Shanghai

# Update frequency in seconds. Telegram may rate-limit too frequent profile edits.
UPDATE_INTERVAL_SECONDS=60

# Optional: store Telegram login session in a custom file.
SESSION_FILE=.telegram-session

填写你的 Telegram API 信息、基础姓名、经纬度和时区。

5. 首次手动登录

第一次需要手动运行:

npm start

image-kAID.png
完成手机号、验证码、两步验证密码输入。

看到更新成功后,按:

Ctrl + C

停止脚本。

这一步的目的是生成 .telegram-session

6. 使用 pm2 后台运行

安装 pm2:

sudo npm install -g pm2

启动项目:

pm2 start src/index.js --name telegram-name-show-time

查看状态:

pm2 status

查看日志:

pm2 logs telegram-name-show-time

7. 设置开机自启

pm2 startup

然后保存 pm2 配置:

pm2 save

之后服务器重启,项目也会自动运行。

配置项说明

.env 文件中主要有这些配置。

TELEGRAM_API_ID

Telegram App 的 api_id

示例:

TELEGRAM_API_ID=123456

TELEGRAM_API_HASH

Telegram App 的 api_hash

示例:

TELEGRAM_API_HASH=abcdef1234567890abcdef1234567890

BASE_NAME

基础姓名。

项目不会自动读取你当前 Telegram 姓名,而是使用这里配置的名字作为前缀。

示例:

BASE_NAME=JohnMuyno

显示效果:

JohnMuyno 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

也可以使用花体:

BASE_NAME=𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸

显示效果:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

之所以不自动读取当前 Telegram 姓名,是为了避免重复追加。

比如第一次更新后名字变成:

JohnMuyno 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

如果下次启动再读取当前姓名,就可能变成:

JohnMuyno 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂 𝟏𝟓:𝟎𝟏 🌦️ 𝟐𝟖°𝐂

所以固定使用 BASE_NAME 更稳定。

LATITUDE 和 LONGITUDE

天气位置的经纬度。

示例:

LATITUDE=24.8648
LONGITUDE=118.6699

含义:

LATITUDE = 纬度
LONGITUDE = 经度

例如:

# 上海
LATITUDE=31.2304
LONGITUDE=121.4737

# 北京
LATITUDE=39.9042
LONGITUDE=116.4074

# 广州
LATITUDE=23.1291
LONGITUDE=113.2644

# 深圳
LATITUDE=22.5431
LONGITUDE=114.0579

如果你拿到的是度分秒格式,例如:

31°13'55.21"N 121°28'11.65"E

需要换算成小数格式:

LATITUDE=31.23194
LONGITUDE=121.46972

TIME_ZONE

时区配置。

中国大陆一般使用:

TIME_ZONE=Asia/Shanghai

日本:

TIME_ZONE=Asia/Tokyo

美国洛杉矶:

TIME_ZONE=America/Los_Angeles

英国伦敦:

TIME_ZONE=Europe/London

UPDATE_INTERVAL_SECONDS

更新间隔,单位是秒。

示例:

UPDATE_INTERVAL_SECONDS=60

建议不要低于 60 秒。

虽然项目内部最低限制到了 30 秒,但 Telegram 可能会对频繁修改个人资料进行限流,所以推荐使用:

UPDATE_INTERVAL_SECONDS=60

或者更保守一点:

UPDATE_INTERVAL_SECONDS=300

也就是 5 分钟更新一次。

SESSION_FILE

Telegram 登录 Session 保存文件。

默认:

SESSION_FILE=.telegram-session

一般不需要修改。

如果删除这个文件,下次启动时需要重新输入手机号和验证码。

自定义显示样式

项目当前默认样式是:

BASE_NAME 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

其中:

  • BASE_NAME 完全由用户自己设置
  • 时间数字会转换成数学粗体数字
  • 温度数字会转换成数学粗体数字
  • C 会显示成 𝐂
  • 天气使用 emoji

自定义名字字体

名字不会由程序转换,建议自己生成好后填入 .env

例如:

BASE_NAME=𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸

可以使用在线字体转换工具,把普通英文转换成花体、粗体、斜体等 Unicode 字符。

例如:

John.Muyno

转换成:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸

自定义天气图标

代码中有一个天气代码映射表,大概类似:

const WEATHER_CODES = new Map([
  [0, '☀️'],
  [1, '🌤️'],
  [2, '⛅'],
  [3, '☁️'],
  [61, '🌦️'],
  [63, '🌧️'],
  [95, '⛈️']
]);

如果你不喜欢某个图标,可以直接修改对应 emoji。

例如把晴天从:

[0, '☀️']

改成:

[0, '🌞']

自定义拼接格式

当前拼接格式类似:

const nextName = `${config.baseName} ${time} ${weather.icon} ${temperature}°𝐂`;

如果你想改成:

名字 | 时间 | 天气 温度

可以改成:

const nextName = `${config.baseName} | ${time} | ${weather.icon} ${temperature}°𝐂`;

如果你不想显示天气,只想显示时间:

const nextName = `${config.baseName} ${time}`;

如果你想显示成温度在前:

const nextName = `${config.baseName} ${temperature}°𝐂 ${weather.icon} ${time}`;

注意事项

1. 这不是 Bot API

这个项目修改的是你自己的 Telegram 用户资料,所以使用的是 Telegram 用户 API。

不要去 BotFather 创建 Bot Token,因为 Bot Token 不能修改你的用户昵称。

你需要的是:

api_id
api_hash

获取地址:

https://my.telegram.org/apps

2. 不要频繁修改姓名

Telegram 可能会对频繁修改资料进行限制。

建议:

UPDATE_INTERVAL_SECONDS=60

或者:

UPDATE_INTERVAL_SECONDS=300

如果被限流,日志里可能会看到类似 FLOOD_WAIT 的错误。

遇到这种情况,应该停止脚本,等待一段时间后再运行,并把更新间隔调大。

3. 保护好 .env.telegram-session

这两个文件都不应该公开。

.env 里有:

TELEGRAM_API_ID
TELEGRAM_API_HASH

.telegram-session 里保存了 Telegram 登录 Session。

所以一定不要把它们公开。

4. 服务器需要能连接 Telegram

部分服务器地区可能无法直接连接 Telegram。

如果日志中出现连接超时,可能需要:

  • 换一个能直连 Telegram 的服务器
  • 给服务器配置代理
  • 给项目增加 SOCKS5 代理支持

5. Open-Meteo 天气可能和本地体感有差异

Open-Meteo 返回的是基于经纬度的天气数据,不一定和手机天气 App 完全一致。

如果天气不准确,可以稍微调整经纬度,或者换成更接近你所在位置的坐标。

6. Telegram 姓名长度有限制

Telegram 的姓名字段有长度限制。
如果你的基础姓名太长,再加上时间、天气和温度,可能会更新失败。

建议基础姓名不要太长。

例如:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸

这种长度通常没问题。

常见问题

my.telegram.org 创建 App 显示 error 怎么办?

这是 Telegram 官方页面很常见的问题。

解决方法:

  • App titleShort name 使用纯英文
  • Platform 选择 Desktop
  • 换浏览器
  • 使用无痕模式
  • 换网络
  • 使用手机流量
  • 等几个小时再试
  • 检查账号是否太新
  • @SpamBot 检查账号是否被限制

解决概率最大的是切换家庭宽带,百分之90都能解决!

推荐填写:

App title: NameTimeUpdater
Short name: nametimeupdater
Platform: Desktop
Description: Telegram name time updater

为什么不用当前 Telegram 名字自动追加?

因为这样容易重复追加。

例如脚本第一次把名字改成:

TTY 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

下次启动如果读取当前名字,再追加一次,就可能变成:

TTY 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂 𝟏𝟓:𝟎𝟏 🌦️ 𝟐𝟖°𝐂

所以项目采用固定 BASE_NAME 的方式,更可控。

为什么天气不用 API Key?

因为使用的是 Open-Meteo,它提供免费公开接口,不需要 API Key。

可以部署在 Windows 服务器吗?

可以。

Windows 上也可以安装 Node.js,然后运行:

npm install
npm start

如果要后台运行,可以使用:

pm2

或者 Windows 自带的任务计划程序。

不过如果是长期部署,Linux VPS 加 pm2 会更简单。

修改配置后为什么没变化?

如果你用的是 pm2,修改 .env 后需要重启进程:

pm2 restart telegram-name-show-time

如果是本地运行,需要停止后重新执行:

npm start

结语

这个项目本质上是一个很轻量的 Telegram 用户 API 自动化工具。

它做的事情可以总结为:

读取配置 -> 登录 Telegram -> 获取天气 -> 获取时间 -> 拼接姓名 -> 修改 Telegram 资料 -> 定时重复

虽然功能很小,但涉及到的内容挺完整:

  • Telegram 用户 API
  • Node.js 异步请求
  • 环境变量配置
  • 天气 API
  • Unicode 字体转换
  • 定时任务
  • Linux 服务器部署
  • pm2 后台运行

最终效果也比较有趣,可以让 Telegram 昵称实时显示当前时间和天气:

𝓙𝓸𝓱𝓷.𝓜𝓾𝔂𝓷𝓸 𝟏𝟓:𝟎𝟎 🌦️ 𝟐𝟖°𝐂

如果你也喜欢折腾 Telegram 小工具,可以试试看。