如何修改 Telegram 客户端源码屏蔽特定用户头像?

显示 Telegram 聊天界面中各种用户头像的截图,暗示某些头像可能影响阅读体验。

Telegram 聊天界面中的用户头像

平时用 Telegram 聊天,总有那么几个群友的头像让人看了头疼。要么是奇奇怪怪的图,要么是闪瞎眼的 GIF。有没有办法在客户端层面直接屏蔽某人的头像,让他变成默认的样子?

今天给大家分享一个硬核玩法:直接修改官方客户端(基于 TDesktop)或第三方 Fork 版(如 Forkgram)的源码,从根源上“掐断”特定头像的显示。

背景与原理

Telegram 的开源桌面客户端是基于 Qt 和 C++ 编写的。头像的加载和渲染流程都在源码里写得清清楚楚。我们要做的就是找到负责加载头像图片的那部分逻辑,加一个“拦截判断”。如果 UserID 是我们要屏蔽的那个,就直接返回一张默认图片,或者干脆不加载。

这种方式的好处是:不用依赖服务器端的设置,纯粹本地生效,且不会影响其他功能。

准备工作

开发者在 Qt Creator 中编辑 C++ 代码的场景。

使用 Qt Creator 修改源码

动手之前,你需要准备以下环境:

  1. 编译环境:推荐使用 Windows 或 Linux,安装好 Qt 开发库(版本需匹配 TDesktop 源码要求,通常是 Qt 5 或 Qt 6)、CMake、C++ 编译器(MSVC 或 GCC)。
  2. 源码获取
  3. IDE:Qt Creator 或 Visual Studio(VSCode 配合 CMake 插件也行,但 Qt Creator 调试更方便)。

修改步骤详解

第一步:定位头像加载逻辑

打开项目源码,使用 IDE 的全局搜索功能。我们要找的不是“Avatar”这个关键词,因为涉及的地方太多。核心在于存储用户信息的类。

通常,用户数据结构在 api/data/data_peer.h 或类似的文件中定义。我们需要关注的是 PeerData 类及其子类 UserData

在 TDesktop 的源码架构中,头像通常是 Image 类型的指针,用于存储头像的视图或图片数据。

第二步:找到头像获取函数

我们需要修改的是“获取头像”的接口,即当界面需要绘制头像时调用的函数。一般在 data/data_peer.cpp 的实现文件里,会有类似 createUserpicPeerData::userpic 相关的方法。

由于 TDesktop 代码更新较快,函数名可能变动,核心逻辑通常在 data/data_user.cppui/userpic_view 等文件里。我们要找的是“决定返回哪张图片”的地方。

假设我们找到了一个负责获取头像 Image 的函数 PeerData::getPeerUserpic()(函数名可能因版本而异)。

第三步:植入屏蔽代码(关键)

在获取头像的逻辑里,我们需要插入一个判断:如果当前用户 ID 是目标 ID,则替换为空或内置图标。

假设我们要屏蔽的用户 ID 是 123456789,代码逻辑伪代码如下:

// 原有逻辑可能是直接返回成员变量 _userpic

// ===== 开始魔改 =====

// 检查是不是我们要屏蔽的用户
if (id == 123456789) {
    // 直接返回一个单色图片或者系统默认头像
    // 比如返回一个全透明的图片,或者强制返回 Empty 用户图标
    return getCustomEmptyUserpic();
}

// ===== 结束魔改 =====

// 否则走原逻辑
return _userpic;

在 C++ 实体代码中,你需要注意处理常量性。如果该函数是 const 修饰的,你注入的逻辑不能修改成员变量,只能修改返回值。

如果找不到具体获取 Image 的函数,可以尝试在 ui/userpic_view.cpp 里。这里负责绘制头像。你可以在这里拦截 userId,如果是目标 ID,就修改绘制指令(比如不绘制圆角图片,只画一个纯色圆圈)。

第四步:编译与安装

修改保存后,打开 CMake GUI 配置项目,或者在 Qt Creator 里直接构建。

  • Debug 模式:编译快,体积大,适合测试。
  • Release 模式:编译慢,体积小,用于日常使用。

编译成功后,你会得到一个 Telegram.exe 或者 Forkgram.exe。关闭你正在运行的 Telegram,用新生成的可执行文件替换原文件(注意备份原文件),或者直接运行新的 exe 测试。

常见问题与解决方案

Q1: 代码太复杂,找不到具体的函数怎么办?

A: 不要只看头文件。尝试在 data/data_peer.cpp 中搜索关键字 Userpic。也可以在 Qt Designer 里查看界面文件(有些版本使用的是 .ui 文件绘制头像,但 TDesktop 大部分代码都是纯绘制)。如果实在难以定位,可以搜索 ImagePtr 相关的使用位置,头像通常是 HistoryView::paintUserpic 调用的源头。

Q2: 修改后编译报错怎么办?

A: 很可能是 Qt 版本不匹配。TDesktop 对 Qt 版本极其敏感。请务必阅读源码根目录下的 README.md,它明确指定了依赖的 Qt 版本号。不要用系统自带的新版本 Qt,很可能导致编译失败。

Q3: 我想屏蔽多人,或者动态添加屏蔽列表怎么办?

A: 上述代码只演示了写死 ID 的做法。如果你懂 C++,可以定义一个 std::vector<uint64> blockedIds;,然后通过读取本地配置文件(JSON 或 INI)来填充这个列表。这样每次启动程序时,自动读取需要屏蔽的头像列表,无需每次重新编译。

总结

修改客户端源码是折腾 Telegram 的最高境界。虽然过程有点繁琐,特别是配置编译环境,但一旦成功,那种“我的地盘我做主”的成就感是无与伦比的。

不仅限于头像,用同样的思路,你甚至可以修改聊天气泡样式、撤回消息的逻辑等等。Forkgram 作为一个活跃的 Fork 分支,其代码结构相对现代,包含了一些官方版没有的高级特性,非常适合作为魔改的起点。

如果你对 C++ 不熟,或者不想折腾编译环境,建议先去 Forkgram 的 Issue 区看看有没有类似的插件或设置项。如果你动手能力强,不妨赶紧把代码拉下来试试,把那些看着闹心的头像统统屏蔽掉!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭