如何构建加密电报Telegram机器人(简单指南)
我们将介绍如何使用 Python 构建加密 Telegram 机器人,该机器人可提供加密货币的实时更新。该机器人的设计不仅可以为您提供任何选定加密货币的最新价格,还可以提供额外的数据。这包括但不限于 24 小时内的价格变化、市值、交易量,甚至历史加密货币价格数据。触手可及的大量信息可以让您在加密货币企业中做出明智的决策。
让我们深入了解吧!
功能级别
在本节中,我们将详细介绍加密 Telegram 机器人的关键功能,以及这些功能如何为用户提供加密市场全面、实时的概览。
- 获取和显示实时加密货币市场数据– 我们的机器人已经能够获取和显示各种加密货币的实时市场数据。这包括当前价格、市值、交易量和价格变化百分比等数据。我们通过向CoinGecko API 的/coins/markets端点发出 GET 请求来实现这一点 。
- 显示 24 小时最高和最低价格– 机器人可以获取并显示特定加密货币在过去 24 小时内的最高和最低价格。这些信息对于积极交易或监控特定加密货币的用户至关重要。我们从相同的/coins/markets端点获取这些数据。
- 获取和显示供应信息 – 我们的机器人可以获取并显示特定加密货币的循环供应和总供应。此信息对于想要了解特定加密货币稀缺性的用户非常有用。同样,此数据是从/coins/markets端点获取的。
- 获取并显示排名前列的加密货币 – 该机器人可以根据市值获取并显示排名前 10 的加密货币。此功能为用户提供了市场上领先的加密货币的快速概览。我们通过向相同的/coins/markets端点发出 GET 请求来获取此数据,但使用特定参数按市值对结果进行排序并限制结果数量。
- 获取和显示链上 DEX 池数据 – 我们的机器人还包括获取和显示链上 DEX 加密流动性池数据的功能。此功能允许用户搜索网络上的矿池,为去中心化交易所(DEX)市场提供有价值的见解。我们通过向/onchain/search/pools端点发出 GET 请求来实现这一点。
先决条件
在我们开始之前,请确保您具备以下条件:
- 您的系统上安装了Python 3.7或更高版本。 Python 是一种功能强大、易于学习的编程语言,我们将用它来构建我们的机器人。
- 一个电报帐户。 Telegram 是一个基于云的即时通讯应用程序,我们的机器人将驻留在其中。
- 对 Python 编程有基本的了解。虽然本指南将很详细,但对 Python 语法和编程概念有基本的了解将是有益的。
- 文本编辑器:您将需要一个文本编辑器或集成开发环境 (IDE) 来编写代码。一些流行的选项包括 Visual Studio Code、Sublime Text 和 Atom。
- CoinGecko API:我们将使用CoinGecko API获取加密货币的加密市场数据。 CoinGecko API 有一个免费的演示计划,可供所有用户访问,速率限制为 30 次/分钟,每月上限为 10,000 次调用。。
- 我们将使用 CoinGecko API 获取加密货币的市场图表数据。 CoinGecko API 有一个免费的演示计划,可供所有用户访问,速率限制为 30 次/分钟,每月上限为 10,000 次调用。
注意:本指南中使用的 API 密钥是占位符,而不是真正的 API 密钥。请将其替换为您自己的 CoinGecko API 密钥以使代码正常工作。
第 1 步:设置您的 Telegram 机器人
首先,您需要在 Telegram 上创建一个新的机器人。就是这样:
- 打开 Telegram 应用程序并搜索“BotFather”机器人。 BotFather 是唯一一个统治他们的机器人。它将帮助您创建新的机器人并更改现有机器人的设置。
- 开始聊天并按照提示创建新机器人。您需要提供机器人的名称和用户名。
- 创建机器人后,您将收到一个令牌。该令牌是您的机器人的“密码”,您需要它来向 Telegram API 发送请求。请妥善保管此令牌,因为我们稍后会使用它。
第 2 步:安装所需的 Python 库
我们将使用两个 Python 库:用于与 Telegram API 交互的 python-telegram-bot,以及用于向 CoinGecko API 发出 HTTP 请求的 requests。
使用 pip 安装它们:
pip install python-telegram-bot requests
python-telegram-bot
是一个为 Telegram Bot API 提供纯 Python 接口的库。它支持 API 4.8 的所有类型和方法,并可与 Python 3.7+ 配合使用。requests
是一个简单而优雅的 Python HTTP 库,专为人类构建。您将使用它向 CoinGecko API 发出请求以获取加密货币数据。
第 3 步:获取加密货币数据
我们将使用 CoinGecko API 来获取加密货币数据。 CoinGecko 提供了加密货币市场的基本面分析。除了跟踪价格、交易量和市值之外,CoinGecko 还跟踪社区发展、开源代码开发、重大事件和链上指标。
第 4 步:编写机器人代码
现在我们已经设置了机器人并安装了库,让我们开始为机器人编写代码。我们将使用 python-telegram-bot 库与 Telegram API 和 requests 库进行交互,以向 CoinGecko API 发出 HTTP 请求。
以下是我们机器人的完整 Python 代码:
from telegram import Update | |
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes | |
import requests | |
import json | |
# Define your CoinGecko API key | |
api_key = ‘YOUR_COINGECKO_API_KEY’ | |
# Function to fetch cryptocurrency data from CoinGecko | |
def get_crypto_data(crypto): | |
try: | |
response = requests.get(f’https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids={crypto}&api_key={api_key}’) | |
response.raise_for_status() | |
data = response.json()[0] | |
return data | |
except requests.exceptions.HTTPError as errh: | |
print (“Http Error:”,errh) | |
except requests.exceptions.ConnectionError as errc: | |
print (“Error Connecting:”,errc) | |
except requests.exceptions.Timeout as errt: | |
print (“Timeout Error:”,errt) | |
except requests.exceptions.RequestException as err: | |
print (“Something went wrong”,err) | |
# Function to fetch top 10 cryptocurrencies from CoinGecko | |
def get_top_cryptos(): | |
try: | |
response = requests.get(f’https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=10&page=1&sparkline=false&api_key={api_key}’) | |
response.raise_for_status() | |
data = response.json() | |
return data | |
except requests.exceptions.HTTPError as errh: | |
print (“Http Error:”,errh) | |
except requests.exceptions.ConnectionError as errc: | |
print (“Error Connecting:”,errc) | |
except requests.exceptions.Timeout as errt: | |
print (“Timeout Error:”,errt) | |
except requests.exceptions.RequestException as err: | |
print (“Something went wrong”,err) | |
# Function to fetch on-chain DEX pool data from CoinGecko | |
def get_dex_pools(query, network, include, page=1): | |
headers = {“x-cg-pro-api-key”: api_key} | |
try: | |
response = requests.get(f’https://pro-api.coingecko.com/api/v3/onchain/search/pools?query={query}&network={network}&include={include}&page={page}’, headers=headers) | |
response.raise_for_status() | |
data = response.json() | |
return data | |
except requests.exceptions.HTTPError as errh: | |
print (“Http Error:”,errh) | |
except requests.exceptions.ConnectionError as errc: | |
print (“Error Connecting:”,errc) | |
except requests.exceptions.Timeout as errt: | |
print (“Timeout Error:”,errt) | |
except requests.exceptions.RequestException as err: | |
print (“Something went wrong”,err) | |
# Telegram command to start the bot | |
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: | |
welcome_message = ‘Hello! I am your Crypto Bot. I can provide real-time data for any cryptocurrency. Use /data <crypto-name> to get started.’ | |
await update.message.reply_text(welcome_message) | |
# Telegram command to get the data of a cryptocurrency | |
async def data(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: | |
crypto = update.message.text.split()[1] # get the crypto name from the message | |
data = get_crypto_data(crypto) | |
if data: | |
await update.message.reply_text(f’The current price of {crypto} is ${data[“current_price”]}. The price change in the last 24 hours is {data[“price_change_percentage_24h”]}%.\nThe market cap is ${data[“market_cap”]}.\nThe total volume in the last 24 hours is ${data[“total_volume”]}.’) | |
else: | |
await update.message.reply_text(f’Sorry, I could not fetch the data for {crypto}. Please check the cryptocurrency name and try again.’) | |
# Telegram command to get the highest and lowest prices of a cryptocurrency in the last 24 hours | |
async def high_low(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: | |
crypto = update.message.text.split()[1] # get the crypto name from the message | |
data = get_crypto_data(crypto) | |
if data: | |
await update.message.reply_text(f’The highest price in the last 24 hours for {crypto} is ${data[“high_24h”]}, and the lowest price is ${data[“low_24h”]}.’) | |
else: | |
await update.message.reply_text(f’Sorry, I could not fetch the data for {crypto}. Please check the cryptocurrency name and try again.’) | |
# Telegram command to get the circulating supply and total supply of a cryptocurrency | |
async def supply(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: | |
crypto = update.message.text.split()[1] # get the crypto name from the message | |
data = get_crypto_data(crypto) | |
if data: | |
await update.message.reply_text(f’The circulating supply of {crypto} is {data[“circulating_supply”]}, and the total supply is {data[“total_supply”]}.’) | |
else: | |
await update.message.reply_text(f’Sorry, I could not fetch the data for {crypto}. Please check the cryptocurrency name and try again.’) | |
# Telegram command to get the top 10 cryptocurrencies | |
async def ranks(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: | |
data = get_top_cryptos() | |
if data: | |
message = “Here are the top 10 cryptocurrencies:\n” | |
for i, crypto in enumerate(data, start=1): | |
message += f'{i}. *{crypto[“name”]}* ({crypto[“symbol”].upper()}):\n- Current price is ${crypto[“current_price”]}\n- Market cap is ${crypto[“market_cap”]}\n- Total volume in the last 24 hours is ${crypto[“total_volume”]}\n\n’ | |
await update.message.reply_text(message, parse_mode=’Markdown’) | |
else: | |
await update.message.reply_text(‘Sorry, I could not fetch the data for the top 10 cryptocurrencies. Please try again later.’) | |
# Telegram command to get the on-chain DEX pool data | |
async def search_pools(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: | |
params = update.message.text.split()[1:] # get the parameters from the message | |
query = params[0] if len(params) > 0 else ‘weth’ | |
network = params[1] if len(params) > 1 else ‘eth’ | |
include = params[2] if len(params) > 2 else ‘dex’ | |
page = int(params[3]) if len(params) > 3 else 1 | |
data = get_dex_pools(query, network, include, page) | |
if data and “data” in data: | |
message = f”Here are the DEX pool data for the query {query} on the network {network}:\n” | |
for i, pool in enumerate(data[“data”], start=1): | |
message += f’\n{i}. Pool ID: *{pool[“id”]}*\n- Pool Name: {pool[“attributes”][“name”]}\n- Base Token Price (USD): ${pool[“attributes”][“base_token_price_usd”]}\n- Quote Token Price (USD): ${pool[“attributes”][“quote_token_price_usd”]}\n- Base Token Price (Quote Token): {pool[“attributes”][“base_token_price_quote_token”]}\n- Quote Token Price (Base Token): {pool[“attributes”][“quote_token_price_base_token”]}\n- Total Liquidity: ${pool[“attributes”][“reserve_in_usd”]}\n- Price Change Percentage in the last 5 minutes: {pool[“attributes”][“price_change_percentage”][“m5”]}%\n- Price Change Percentage in the last 1 hour: {pool[“attributes”][“price_change_percentage”][“h1”]}%\n- Price Change Percentage in the last 6 hours: {pool[“attributes”][“price_change_percentage”][“h6”]}%\n- Price Change Percentage in the last 24 hours: {pool[“attributes”][“price_change_percentage”][“h24”]}%\n’ | |
for i in range(0, len(message), 4096): | |
await update.message.reply_text(message[i:i+4096], parse_mode=’Markdown’) | |
else: | |
await update.message.reply_text(f’Sorry, I could not fetch the data for the query {query} on the network {network}. Please check the query and network and try again.’) | |
app = ApplicationBuilder().token(‘YOUR_TG_BOT_TOKEN’).build() | |
app.add_handler(CommandHandler(“start”, start)) | |
app.add_handler(CommandHandler(“data”, data)) | |
app.add_handler(CommandHandler(“high_low”, high_low)) | |
app.add_handler(CommandHandler(“supply”, supply)) | |
app.add_handler(CommandHandler(“ranks”, ranks)) | |
app.add_handler(CommandHandler(“search_pools”, search_pools)) | |
app.run_polling() |
第 5 步:了解机器人代码
在本节中,我们将分解 Telegram Crypto Bot 的 Python 代码,以了解每个部分及其在机器人整体功能中的作用:
- 导入必要的库和模块:我们代码的第一步是导入必要的库和模块。其中包括 telegram、telegram.ext 和 requests。这些库提供了我们与 Telegram API 交互并向 CoinGecko API 发出 HTTP 请求所需的工具。
- 定义 CoinGecko API 密钥:我们定义 CoinGecko API 密钥,用于验证我们对 CoinGecko API 的请求。该密钥对于访问我们的机器人将提供的加密货币数据至关重要。
- 定义 get_crypto_data 函数:该函数从 CoinGecko API 获取特定加密货币的数据。它向 CoinGecko API 的 /coins/markets 端点发出 GET 请求,并返回指定加密货币的数据。
- 定义 get_top_cryptos 函数:该函数从 CoinGecko API 获取前 10 名加密货币的数据。它使用特定参数向 CoinGecko API 的 /coins/markets 端点发出 GET 请求,以按市值对结果进行排序并限制结果数量。
- 定义 get_dex_pools:该函数负责从 CoinGecko API 获取链上去中心化交易所(DEX)池数据。它需要四个参数:query(池的名称)、network(其运行的网络)、include(要包含在响应中的特定属性)和 page(用于分页结果)。该函数使用这些参数向 CoinGecko API 发送 GET 请求并返回响应数据。如果请求期间出现错误,该函数将打印一条错误消息。
- 定义 search_pools:这是一个异步函数,用于处理 Telegram 机器人中的“/search_pools”命令。当用户触发此命令时,该函数会从用户输入中获取查询、网络和包含参数,使用这些参数调用 get_dex_pools 函数,并将返回的数据发送回用户。如果 get_dex_pools 函数没有返回任何数据,该函数将向用户发送错误消息。
- 定义机器人命令:我们定义了机器人可以响应的几个命令。每个命令都是一个以更新和上下文作为参数的函数。 update 参数包含有关传入消息的信息,而 context 参数包含有关机器人当前状态的信息。
- 创建 ApplicationBuilder 类的实例:我们创建 ApplicationBuilder 类的实例,并传入 Telegram 机器人令牌。该实例用于注册我们的命令处理程序并启动机器人。
- 为我们的命令添加处理程序:我们使用 ApplicationBuilder 实例的 add_handler 方法为我们的命令添加处理程序。每个处理程序都是 CommandHandler 类的一个实例,该类获取命令的名称以及接收命令时要调用的函数。
- 启动机器人:最后,我们调用 ApplicationBuilder 实例的 run_polling 方法来启动机器人。此方法启动一个长轮询过程,检查来自 Telegram 服务器的新更新。
第 6 步:测试机器人
要测试机器人,请按照下列步骤操作:
- 在本例中,使用 python <your_file>.py 在终端中运行 Python 脚本
python bot.py
- 打开 Telegram 应用程序并使用您在创建机器人时提供的用户名搜索您的机器人。在我们的例子中,它是加密壁虎机器人。
- 开始与您的机器人聊天并尝试命令。以下是您可以使用的命令:
- /
start:
启动机器人。 /data <crypto-name>
:获取特定加密货币的当前数据。例如,您可以输入 /data bitcoin 来获取比特币的当前数据。/high_low <crypto-name>
:获取特定加密货币在过去24小时内的最高和最低价格。/supply <crypto-name>:
获取特定加密货币的流通供应量和总供应量。/ranks:
获取排名前 10 的加密货币。/search_pools
:此命令获取并显示链上去中心化交易所(DEX)池数据。
- /
例如:让我们尝试 /data 比特币
一旦我们在 Telegram 机器人中输入 /data bitcoin,机器人就会使用 Python 程序中的 get_crypto_data 函数从 CoinGecko API 获取比特币数据。
然后,机器人会向您发送一条消息,其中包含比特币的当前价格、过去 24 小时的价格变化、市值以及过去 24 小时的总交易量。
现在让我们尝试一下/ranks
当您/ranks
在 Telegram 机器人中输入内容时,机器人将使用 Python 程序中的 get_top_cryptos 函数从 CoinGecko API 获取前 10 种加密货币的数据。
然后,机器人会向您发送一条消息,其中包含前 10 种加密货币的列表。
现在让我们尝试/search_pools weth eth base_token
命令
当我们运行该/search_pools weth eth dex
命令时,机器人会从 CoinGecko 获取指定查询、网络和属性的链上 DEX 池数据。在本例中,它会在“eth”网络上搜索与“weth”相关的池。然后,机器人将这些数据格式化为更易于人类阅读的格式,并将其显示在聊天中。其中包括矿池 ID、矿池名称、基础代币价格(美元)、报价代币价格(美元)和总流动性等详细信息。此外,它还提供最近 5 分钟、1 小时、6 小时和 24 小时内的价格变化百分比。此功能为用户提供了对去中心化交易所(DEX)市场的宝贵见解,增强了机器人的功能并提供了对加密货币市场格局的更全面的了解。
请注意,这是一个基本实现,不包括生产级机器人可能需要的错误处理或稳健性。在编写自己的机器人时,始终确保处理异常和边缘情况。
高级功能和有用的端点
虽然上面的指南涵盖了加密跟踪机器人的基本开发,但可能想要扩展机器人功能的开发人员可以考虑以下内容:
- 加密货币市场数据
使用 /global 和 /coins/markets 端点在仪表板上为用户提供各种市场数据,例如市值、交易量、流动性、主导地位和情绪。这些数据可以让用户全面了解加密货币市场的现状。 - 加密资产跟踪
实现跟踪更广泛的加密资产的功能。这可能涉及与 CoinGecko 的 /coins/list 端点集成,以获取所有可用加密货币的完整列表。此功能可以帮助用户跟踪多样化的加密资产组合。 - 实时价格更新
允许用户接收其指定加密资产的实时价格更新。这将涉及与 /simple/price 端点交互。实时价格更新可以帮助用户及时做出投资决策。 - 新闻、趋势和情绪
集成 /search/trending 和社交媒体分析以提供基于情绪的警报,并使用 /search/trending 和 /coins/categories 在仪表板上显示加密空间中的最新新闻、趋势硬币和流行类别/列出端点。及时了解最新新闻和趋势可以帮助用户做出明智的投资决策。 - 获取和显示投资组合详细信息
向您的机器人添加投资组合管理功能可以为用户提供其加密货币投资的实时概览。这包括投资组合总价值、单项资产价值以及随时间的变化。它还可以跟踪绩效、多元化和风险,帮助用户做出明智的决策。此功能需要与其他 API 或服务集成,以提供对用户组合数据的访问。
结论
现在你就拥有了!您刚刚构建了一个基本的 Telegram 机器人,它提供实时加密货币价格更新。对于想要了解最新加密货币价格的加密货币爱好者来说,该机器人可以成为一个方便的工具。您可以添加更多功能,例如重大价格变化提醒、投资组合跟踪等。
我们希望您发现本指南内容丰富且有帮助。请继续关注有关令人兴奋的技术主题的更多指南,祝您编码愉快!