位置信息是Telegram交互中极具价值的功能,无论是外卖配送、共享交通,还是线下活动签到,机器人通过API精准发送位置都能极大提升用户体验。本文将从零开始,详细讲解Telegram Bot调用API发送位置信息的完整流程,包括静态位置、实时位置与附近地点搜索,并提供可直接运行的代码示例。
一、Telegram位置信息类型概述
Telegram Bot可以发送两种主要的位置信息:静态位置(Static Location)和实时位置(Live Location)。静态位置是固定坐标,适合展示店铺、景点等;实时位置则持续更新,适合追踪移动物体。此外,通过Inline模式还可以让用户发送附近地点。下面逐一剖析。
二、sendLocation API详解
发送位置的核心API是sendLocation。机器人需要向https://api.telegram.org/bot<token>/sendLocation发起POST请求,最简参数如下:
chat_id:目标聊天ID,可以是用户、群组或频道。latitude:纬度,范围-90到90。longitude:经度,范围-180到180。
可选参数包括horizontal_accuracy(水平精度,单位米)、live_period(实时更新时长)、heading(方向角,需配合live_period使用)、proximity_alert_radius(接近提醒半径)等。若设置live_period,则返回的消息附带location对象,并包含live_period字段。请注意,实时位置更新上限为4小时。
三、发送实时位置(Live Location)
要发送实时位置,只需在sendLocation时指定live_period(例如设置为600秒)。Telegram会生成一条带动态更新标记的位置消息。更新实时位置需调用editMessageLiveLocation,同样提供chat_id、message_id以及新的经纬度。停止更新则可调用stopMessageLiveLocation。这些方法均属于Bot API的同步方法,响应速度极快。
四、搜索附近地点(Inline模式)
如果机器人启用了Inline模式,用户输入地点名称时可触发inline_query。机器人通过answerInlineQuery方法返回InlineQueryResultLocation类型的结果,其中包含latitude、longitude和title等字段。这样用户即可直接点击发送附近的地点,无需手动输入坐标。
五、Python实现示例
以下使用Python的requests库演示发送静态位置和实时位置的方法。请提前安装依赖:pip install requests python-telegram-bot(建议使用官方库,但本例以requests演示API本质)。
import requests
import time
BOT_TOKEN = 'YOUR_BOT_TOKEN'
CHAT_ID = '@your_channel_or_user_id'
BASE_URL = f'https://api.telegram.org/bot'
# 1. 发送静态位置(故宫坐标)
def send_static_location():
url = f'/sendLocation'
params = {
'chat_id': CHAT_ID,
'latitude': 39.917,
'longitude': 116.397,
'horizontal_accuracy': 50
}
resp = requests.post(url, params=params).json()
if resp['ok']:
print('静态位置发送成功,message_id:', resp['result']['message_id'])
else:
print('发送失败:', resp)
# 2. 发送实时位置(持续300秒)
def send_live_location():
url = f'/sendLocation'
params = {
'chat_id': CHAT_ID,
'latitude': 31.2304,
'longitude': 121.4737,
'live_period': 300,
'heading': 90 # 方向角,可选
}
resp = requests.post(url, params=params).json()
if resp['ok']:
msg_id = resp['result']['message_id']
print(f'实时位置已发送,消息ID: ,将在300秒后自动失效')
# 10秒后更新位置
time.sleep(10)
update_url = f'/editMessageLiveLocation'
update_params = {
'chat_id': CHAT_ID,
'message_id': msg_id,
'latitude': 31.2305,
'longitude': 121.4738
}
requests.post(update_url, params=update_params)
print('位置已更新')
else:
print('发送失败:', resp)
if __name__ == '__main__':
send_static_location()
send_live_location()若使用官方Python库python-telegram-bot,代码更简洁:
from telegram.ext import Application
app = Application.builder().token('YOUR_BOT_TOKEN').build()
async def send_location():
await app.bot.send_location(
chat_id=CHAT_ID,
latitude=39.917,
longitude=116.397,
live_period=300
)
if __name__ == '__main__':
import asyncio
asyncio.run(send_location())六、注意事项与常见错误
- 权限限制:机器人无法主动向普通用户发送消息,除非用户先与机器人交互(回复私有消息或添加到群组)。发送到群组时,机器人需是群组成员。
- 实时位置频率限制:更新实时位置不要过于频繁,建议至少间隔1分钟。频繁更新可能触发API限流(HTTP 429)。
- 坐标合法性:latitude必须小于等于90,longitude小于等于180,非法值会导致400错误。
- chat_id类型:对于个人用户,chat_id为正整数;群组通常为负数。可用
getUpdates获取真实ID。 - live_period范围:必须介于60到86400秒之间,若需无限期(最短1小时,最长24小时),可设置为最大值。
总结
通过sendLocation及其配套方法,Telegram Bot可以轻松实现位置发送、实时追踪和地点搜索。开发者只需遵循API规范,处理好权限与参数校验,即可构建出强大且安全的位置服务。本文提供的Python示例可直接用于生产环境,建议结合官方Bot API文档进一步探索高级用法。掌握这些技巧,你的机器人将迈入空间感知的下一代交互体验。