从0到1:使用python-telegram开发聊天统计工具chat_stats.py详解
python-telegram是一个基于Telegram TDLib的Python客户端库,能够帮助开发者轻松构建与Telegram交互的应用程序。本文将详细介绍如何使用python-telegram开发一个实用的聊天统计工具chat_stats.py,通过分析聊天记录中的关键词频率,让你快速了解群聊热点话题和交流模式。
工具简介:chat_stats.py能做什么?
chat_stats.py是python-telegram项目中一个实用的示例程序,位于examples/chat_stats.py。它通过Telegram API获取指定聊天的历史消息,对消息文本进行分析,最终输出最常出现的关键词统计结果。这个工具不仅可以帮助群管理员了解群聊动态,还能为社交数据分析提供基础数据支持。
核心功能特点
- 支持自定义消息获取数量(默认1000条)
- 可配置显示最常见关键词的数量(默认30个)
- 自动过滤短词(小于3个字符)和标点符号
- 输出清晰的关键词频率统计结果
准备工作:环境搭建与依赖安装
在开始使用chat_stats.py之前,需要完成以下准备工作:
1. 克隆项目代码库
git clone https://gitcode.com/gh_mirrors/py/python-telegram
cd python-telegram
2. 安装必要依赖
项目根目录下提供了多种安装方式,推荐使用pip进行安装:
pip install .
如果需要开发环境,可安装额外依赖:
pip install -r tests/requirements.txt
3. 获取Telegram API凭证
要使用Telegram API,需要先获取api_id和api_hash:
- 访问 my.telegram.org/apps
- 登录你的Telegram账号
- 创建新应用,获取api_id和api_hash
代码解析:chat_stats.py的工作原理
让我们通过分析examples/chat_stats.py的核心代码,了解其工作原理。
主要代码结构
chat_stats.py主要包含三个部分:
- 消息获取函数(retreive_messages)
- 统计分析函数(print_stats)
- 主程序入口(main)
1. 消息获取:retreive_messages函数
def retreive_messages(telegram, chat_id, receive_limit):
receive = True
from_message_id = 0
stats_data = {}
while receive:
response = telegram.get_chat_history(
chat_id=chat_id,
limit=1000,
from_message_id=from_message_id,
)
response.wait()
for message in response.update["messages"]:
if message["content"]["@type"] == "messageText":
stats_data[message["id"]] = message["content"]["text"]["text"]
from_message_id = message["id"]
total_messages = len(stats_data)
if total_messages > receive_limit or not response.update["total_count"]:
receive = False
print(f"[{total_messages}/{receive_limit}] received")
return stats_data
这个函数通过调用telegram.client.Telegram类的get_chat_history方法(定义在telegram/client.py第465-493行),分页获取聊天历史消息。它会循环获取消息直到达到指定的接收限制或没有更多消息。
2. 统计分析:print_stats函数
def print_stats(stats_data, most_common_count):
words = Counter()
translator = str.maketrans("", "", string.punctuation)
for message in stats_data.values():
for word in message.split(" "):
word = word.translate(translator).lower()
if len(word) > 3:
words[word] += 1
for word, count in words.most_common(most_common_count):
print(f"{word}: {count}")
这个函数使用collections.Counter来统计单词频率,首先去除标点符号并转为小写,然后过滤掉长度小于3的单词,最后输出出现频率最高的词语。
3. 主程序入口
主程序负责解析命令行参数、初始化Telegram客户端、登录账号、调用消息获取和统计分析函数:
if __name__ == "__main__":
setup_logging(level=logging.INFO)
parser = argparse.ArgumentParser()
parser.add_argument("api_id", help="API id") # https://my.telegram.org/apps
parser.add_argument("api_hash", help="API hash")
parser.add_argument("phone", help="Phone")
parser.add_argument("chat_id", help="Chat ID")
parser.add_argument("--limit", help="Messages to retrieve", type=int, default=1000)
parser.add_argument("--most-common", help="Most common count", type=int, default=30)
args = parser.parse_args()
tg = Telegram(
api_id=args.api_id,
api_hash=args.api_hash,
phone=args.phone,
database_encryption_key="changeme1234",
)
tg.login()
stats_data = retreive_messages(
telegram=tg,
chat_id=args.chat_id,
receive_limit=args.limit,
)
print_stats(
stats_data=stats_data,
most_common_count=args.most_common,
)
tg.stop()
实战指南:运行chat_stats.py获取聊天统计
基本使用命令
python examples/chat_stats.py api_id api_hash phone chat_id --limit 500 --most-common 20
参数说明:
- api_id: 你的Telegram API ID
- api_hash: 你的Telegram API Hash
- phone: 你的手机号码(带国家代码,如+8613800138000)
- chat_id: 要分析的聊天ID
- --limit: 可选,要获取的消息数量,默认1000
- --most-common: 可选,要显示的最常见关键词数量,默认30
获取Chat ID的方法
要获取聊天ID,可以使用python-telegram提供的另一个示例程序get_me.py:
python examples/get_me.py api_id api_hash phone
运行后会列出你参与的聊天及其ID。
运行示例与输出解读
成功运行后,你将看到类似以下的输出:
[500/500] received
项目: 120
开发: 95
问题: 88
代码: 76
讨论: 65
...
这些数字表示对应关键词在聊天记录中出现的次数,帮助你快速了解群聊的主要话题。
高级技巧:自定义与扩展chat_stats.py
1. 修改过滤规则
如果你想调整过滤规则,可以修改print_stats函数中的过滤条件。例如,将最小单词长度从3改为2:
if len(word) > 2: # 原为 len(word) > 3
words[word] += 1
2. 添加停用词过滤
为了得到更有意义的统计结果,可以添加停用词过滤功能。修改print_stats函数:
def print_stats(stats_data, most_common_count):
words = Counter()
translator = str.maketrans("", "", string.punctuation)
stop_words = {"the", "and", "is", "in", "to", "you", "of", "for", "on", "with", "at"}
for message in stats_data.values():
for word in message.split(" "):
word = word.translate(translator).lower()
if len(word) > 3 and word not in stop_words:
words[word] += 1
for word, count in words.most_common(most_common_count):
print(f"{word}: {count}")
3. 保存结果到文件
要将统计结果保存到文件,可以修改print_stats函数,添加文件写入功能:
def print_stats(stats_data, most_common_count, output_file=None):
# ... 原有代码 ...
if output_file:
with open(output_file, 'w') as f:
for word, count in words.most_common(most_common_count):
f.write(f"{word}: {count}\n")
else:
for word, count in words.most_common(most_common_count):
print(f"{word}: {count}")
然后在main函数中添加一个命令行参数来指定输出文件。
常见问题与解决方案
Q1: 运行时提示"Authorization required"
A: 确保你已经正确调用了tg.login()方法,并且按照提示输入了Telegram发送的验证码。
Q2: 获取不到聊天历史消息
A: 检查chat_id是否正确,确保你的账号有权限访问该聊天。此外,Telegram API对获取历史消息有一定限制,可能无法获取非常早期的消息。
Q3: 程序运行缓慢
A: 尝试减少--limit参数的值,获取较少的消息进行分析。此外,第一次运行时会初始化数据库,可能较慢,后续运行会加快。
总结:利用python-telegram探索更多可能
通过本文的介绍,你已经了解了如何使用python-telegram开发一个简单但实用的聊天统计工具。这个工具只是python-telegram capabilities的冰山一角,基于这个强大的库,你还可以开发更多有趣的应用,如:
- 自动回复机器人
- 消息监控与过滤工具
- 聊天备份与导出工具
- 基于聊天内容的智能分析系统
如果你想深入了解python-telegram的更多功能,可以查阅项目文档docs/telegram.rst,或研究其他示例程序,如examples/echo_bot.py和examples/clear_group_messages.py。
现在就动手尝试使用chat_stats.py分析你的Telegram聊天记录,发现隐藏在消息中的有趣模式吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



