telegram-dev
npx skills add https://github.com/2025emma/vibe-coding-cn --skill telegram-dev
Agent 安装分布
Skill 文档
Telegram çæå¼åæè½
å ¨é¢ç Telegram å¼åæåï¼æ¶µç Bot å¼åãMini Apps (Web Apps)ã客æ·ç«¯å¼åç宿´ææ¯æ ã
使¶ä½¿ç¨æ¤æè½
å½éè¦ä»¥ä¸å¸®å©æ¶ä½¿ç¨æ¤æè½ï¼
- å¼å Telegram Botï¼æ¶æ¯æºå¨äººï¼
- å建 Telegram Mini Appsï¼å°ç¨åºï¼
- æå»ºèªå®ä¹ Telegram 客æ·ç«¯
- éæ Telegram æ¯ä»åä¸å¡åè½
- å®ç° Webhook åé¿è½®è¯¢
- ä½¿ç¨ Telegram 认è¯ååå¨
- å¤çæ¶æ¯ãåªä½åæä»¶
- å®ç°å èæ¨¡å¼åé®ç
Telegram å¼åçææ¦è§
ä¸å¤§æ ¸å¿ API
-
Bot API – å建æºå¨äººç¨åº
- HTTP æ¥å£ï¼ç®åæç¨
- èªå¨å¤çå å¯åéä¿¡
- éåï¼è天æºå¨äººãèªå¨åå·¥å ·
-
Mini Apps API (Web Apps) – å建 Web åºç¨
- JavaScript æ¥å£
- å¨ Telegram å è¿è¡
- éåï¼å°ç¨åºã游æãçµå
-
Telegram API & TDLib – å建客æ·ç«¯
- 宿´ç Telegram åè®®å®ç°
- æ¯æææå¹³å°
- éåï¼èªå®ä¹å®¢æ·ç«¯ãä¼ä¸åºç¨
Bot API å¼å
å¿«éå¼å§
API 端ç¹ï¼
https://api.telegram.org/bot<TOKEN>/METHOD_NAME
è·å Bot Tokenï¼
- ä¸ @BotFather 对è¯
- åé
/newbot - ææç¤ºè®¾ç½®åç§°
- è·å token
第ä¸ä¸ª Bot (Python)ï¼
import requests
BOT_TOKEN = "your_bot_token_here"
API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}"
# åéæ¶æ¯
def send_message(chat_id, text):
url = f"{API_URL}/sendMessage"
data = {"chat_id": chat_id, "text": text}
return requests.post(url, json=data)
# è·åæ´æ°ï¼é¿è½®è¯¢ï¼
def get_updates(offset=None):
url = f"{API_URL}/getUpdates"
params = {"offset": offset, "timeout": 30}
return requests.get(url, params=params).json()
# 主循ç¯
offset = None
while True:
updates = get_updates(offset)
for update in updates.get("result", []):
chat_id = update["message"]["chat"]["id"]
text = update["message"]["text"]
# å夿¶æ¯
send_message(chat_id, f"ä½ è¯´äºï¼{text}")
offset = update["update_id"] + 1
æ ¸å¿ API æ¹æ³
æ´æ°ç®¡çï¼
getUpdates– é¿è½®è¯¢è·åæ´æ°setWebhook– 设置 WebhookdeleteWebhook– å é¤ WebhookgetWebhookInfo– æ¥è¯¢ Webhook ç¶æ
æ¶æ¯æä½ï¼
sendMessage– åéææ¬æ¶æ¯sendPhoto/sendVideo/sendDocument– åéåªä½sendAudio/sendVoice– åéé³é¢sendLocation/sendVenue– åéä½ç½®editMessageText– ç¼è¾æ¶æ¯deleteMessage– å 餿¶æ¯forwardMessage/copyMessage– 转å/å¤å¶æ¶æ¯
交äºå ç´ ï¼
sendPoll– åéæç¥¨ï¼æå¤ 12 个é项ï¼- å èé®ç (InlineKeyboardMarkup)
- åå¤é®ç (ReplyKeyboardMarkup)
answerCallbackQuery– ååºåè°æ¥è¯¢
æä»¶æä½ï¼
getFile– è·åæä»¶ä¿¡æ¯downloadFile– ä¸è½½æä»¶- æ¯ææå¤§ 2GB æä»¶ï¼æ¬å° Bot API 模å¼ï¼
æ¯ä»åè½ï¼
sendInvoice– åéå票answerPreCheckoutQuery– å¤çæ¯ä»- Telegram Stars æ¯ä»ï¼æé« 10,000 Starsï¼
Webhook é ç½®
设置 Webhookï¼
import requests
BOT_TOKEN = "your_token"
WEBHOOK_URL = "https://yourdomain.com/webhook"
requests.post(
f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook",
json={"url": WEBHOOK_URL}
)
Flask Webhook 示ä¾ï¼
from flask import Flask, request
import requests
app = Flask(__name__)
BOT_TOKEN = "your_token"
@app.route('/webhook', methods=['POST'])
def webhook():
update = request.get_json()
chat_id = update["message"]["chat"]["id"]
text = update["message"]["text"]
# åéåå¤
requests.post(
f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
json={"chat_id": chat_id, "text": f"æ¶å°: {text}"}
)
return "OK"
if __name__ == '__main__':
app.run(port=5000)
Webhook è¦æ±ï¼
- å¿ é¡»ä½¿ç¨ HTTPS
- æ¯æ TLS 1.2+
- 端å£ï¼443, 80, 88, 8443
- å ¬å ±å¯è®¿é®ç URL
å èé®ç
å建å èé®çï¼
def send_inline_keyboard(chat_id):
keyboard = {
"inline_keyboard": [
[
{"text": "æé® 1", "callback_data": "btn1"},
{"text": "æé® 2", "callback_data": "btn2"}
],
[
{"text": "æå¼é¾æ¥", "url": "https://example.com"}
]
]
}
requests.post(
f"{API_URL}/sendMessage",
json={
"chat_id": chat_id,
"text": "éæ©ä¸ä¸ªé项ï¼",
"reply_markup": keyboard
}
)
å¤çåè°ï¼
def handle_callback_query(callback_query):
query_id = callback_query["id"]
data = callback_query["data"]
chat_id = callback_query["message"]["chat"]["id"]
# ååºåè°
requests.post(
f"{API_URL}/answerCallbackQuery",
json={"callback_query_id": query_id, "text": f"ä½ ç¹å»äº {data}"}
)
# æ´æ°æ¶æ¯
requests.post(
f"{API_URL}/editMessageText",
json={
"chat_id": chat_id,
"message_id": callback_query["message"]["message_id"],
"text": f"ä½ éæ©äºï¼{data}"
}
)
å èæ¨¡å¼
é
ç½®å
èæ¨¡å¼ï¼
ä¸ @BotFather 对è¯ï¼åé /setinline
å¤çå èæ¥è¯¢ï¼
def handle_inline_query(inline_query):
query_id = inline_query["id"]
query_text = inline_query["query"]
# åå»ºç»æ
results = [
{
"type": "article",
"id": "1",
"title": "ç»æ 1",
"input_message_content": {
"message_text": f"ä½ æç´¢äºï¼{query_text}"
}
}
]
requests.post(
f"{API_URL}/answerInlineQuery",
json={"inline_query_id": query_id, "results": results}
)
Mini Apps (Web Apps) å¼å
åå§å Mini App
HTML 模æ¿ï¼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<title>My Mini App</title>
</head>
<body>
<h1>Telegram Mini App</h1>
<button id="mainBtn">主æé®</button>
<script>
// è·å Telegram WebApp 对象
const tg = window.Telegram.WebApp;
// éç¥ Telegram åºç¨å·²åå¤å¥½
tg.ready();
// å±å¼å°å
¨å±
tg.expand();
// æ¾ç¤ºç¨æ·ä¿¡æ¯
const user = tg.initDataUnsafe?.user;
if (user) {
console.log("ç¨æ·å:", user.first_name);
console.log("ç¨æ·ID:", user.id);
}
// é
置主æé®
tg.MainButton.text = "æäº¤";
tg.MainButton.show();
tg.MainButton.onClick(() => {
// åéæ°æ®å° Bot
tg.sendData(JSON.stringify({action: "submit"}));
});
// æ·»å è¿åæé®
tg.BackButton.show();
tg.BackButton.onClick(() => {
tg.close();
});
</script>
</body>
</html>
Mini App æ ¸å¿ API
WebApp 对象主è¦å±æ§ï¼
// åå§åæ°æ®
tg.initData // åå§åå§åå符串
tg.initDataUnsafe // è§£æåç对象
// ç¨æ·å主é¢
tg.initDataUnsafe.user // ç¨æ·ä¿¡æ¯
tg.themeParams // 主é¢é¢è²
tg.colorScheme // 'light' æ 'dark'
// ç¶æ
tg.isExpanded // æ¯å¦å
¨å±
tg.isFullscreen // æ¯å¦å
¨å±
tg.viewportHeight // è§å£é«åº¦
tg.platform // å¹³å°ç±»å
// çæ¬
tg.version // WebApp çæ¬
ä¸»è¦æ¹æ³ï¼
// çªå£æ§å¶
tg.ready() // æ è®°åºç¨åå¤å°±ç»ª
tg.expand() // å±å¼å°å
¨é«åº¦
tg.close() // å
³é Mini App
tg.requestFullscreen() // 请æ±å
¨å±
// æ°æ®åé
tg.sendData(data) // åéæ°æ®å° Bot
// 导èª
tg.openLink(url) // æå¼å¤é¨é¾æ¥
tg.openTelegramLink(url) // æå¼ Telegram 龿¥
// å¯¹è¯æ¡
tg.showPopup(params, callback) // æ¾ç¤ºå¼¹çª
tg.showAlert(message) // æ¾ç¤ºè¦å
tg.showConfirm(message) // æ¾ç¤ºç¡®è®¤
// å享
tg.shareMessage(message) // åäº«æ¶æ¯
tg.shareUrl(url) // åäº«é¾æ¥
UI æ§ä»¶
主æé® (MainButton)ï¼
tg.MainButton.setText("ç¹å»æ");
tg.MainButton.show();
tg.MainButton.enable();
tg.MainButton.showProgress(); // æ¾ç¤ºå è½½
tg.MainButton.hideProgress();
tg.MainButton.onClick(() => {
console.log("主æé®è¢«ç¹å»");
});
æ¬¡è¦æé® (SecondaryButton)ï¼
tg.SecondaryButton.setText("åæ¶");
tg.SecondaryButton.show();
tg.SecondaryButton.onClick(() => {
tg.close();
});
è¿åæé® (BackButton)ï¼
tg.BackButton.show();
tg.BackButton.onClick(() => {
// è¿åé»è¾
});
触è§åé¦ï¼
tg.HapticFeedback.impactOccurred('light'); // light, medium, heavy
tg.HapticFeedback.notificationOccurred('success'); // success, warning, error
tg.HapticFeedback.selectionChanged();
åå¨ API
äºåå¨ï¼
// ä¿åæ°æ®
tg.CloudStorage.setItem('key', 'value', (error, success) => {
if (success) console.log('ä¿åæå');
});
// è·åæ°æ®
tg.CloudStorage.getItem('key', (error, value) => {
console.log('å¼:', value);
});
// å 餿°æ®
tg.CloudStorage.removeItem('key');
// è·åææé®
tg.CloudStorage.getKeys((error, keys) => {
console.log('ææé®:', keys);
});
æ¬å°åå¨ï¼
// æ®éæ¬å°åå¨
localStorage.setItem('key', 'value');
const value = localStorage.getItem('key');
// å®å
¨åå¨ï¼éè¦çç©è¯å«ï¼
tg.SecureStorage.setItem('secret', 'value', callback);
tg.SecureStorage.getItem('secret', callback);
çç©è¯å«è®¤è¯
const bioManager = tg.BiometricManager;
// åå§å
bioManager.init(() => {
if (bioManager.isInited) {
console.log('æ¯æçç±»å:', bioManager.biometricType);
// 'finger', 'face', 'unknown'
if (bioManager.isAccessGranted) {
// å·²ææï¼å¯ä»¥ä½¿ç¨
} else {
// è¯·æ±ææ
bioManager.requestAccess({reason: 'éè¦éªè¯èº«ä»½'}, (success) => {
if (success) {
console.log('æææå');
}
});
}
}
});
// æ§è¡è®¤è¯
bioManager.authenticate({reason: '确认æä½'}, (success, token) => {
if (success) {
console.log('è®¤è¯æåï¼token:', token);
}
});
ä½ç½®åä¼ æå¨
è·åä½ç½®ï¼
tg.LocationManager.init(() => {
if (tg.LocationManager.isInited) {
tg.LocationManager.getLocation((location) => {
console.log('纬度:', location.latitude);
console.log('ç»åº¦:', location.longitude);
});
}
});
å é度计ï¼
tg.Accelerometer.start({refresh_rate: 100}, (started) => {
if (started) {
tg.Accelerometer.onEvent((event) => {
console.log('å é度:', event.x, event.y, event.z);
});
}
});
// 忢
tg.Accelerometer.stop();
éèºä»ªï¼
tg.Gyroscope.start({refresh_rate: 100}, callback);
tg.Gyroscope.onEvent((event) => {
console.log('æè½¬é度:', event.x, event.y, event.z);
});
è®¾å¤æ¹åï¼
tg.DeviceOrientation.start({refresh_rate: 100}, callback);
tg.DeviceOrientation.onEvent((event) => {
console.log('æ¹å:', event.absolute, event.alpha, event.beta, event.gamma);
});
æ¯ä»éæ
åèµ·æ¯ä» (Telegram Stars)ï¼
tg.openInvoice('https://t.me/$invoice_link', (status) => {
if (status === 'paid') {
console.log('æ¯ä»æå');
} else if (status === 'cancelled') {
console.log('æ¯ä»åæ¶');
} else if (status === 'failed') {
console.log('æ¯ä»å¤±è´¥');
}
});
æ°æ®éªè¯
æå¡å¨ç«¯éªè¯ initData (Python)ï¼
import hmac
import hashlib
from urllib.parse import parse_qs
def validate_init_data(init_data, bot_token):
# è§£ææ°æ®
parsed = parse_qs(init_data)
received_hash = parsed.get('hash', [''])[0]
# ç§»é¤ hash
data_check_arr = []
for key, value in parsed.items():
if key != 'hash':
data_check_arr.append(f"{key}={value[0]}")
# æåº
data_check_arr.sort()
data_check_string = '\n'.join(data_check_arr)
# 计ç®å¯é¥
secret_key = hmac.new(
b"WebAppData",
bot_token.encode(),
hashlib.sha256
).digest()
# 计ç®åå¸
calculated_hash = hmac.new(
secret_key,
data_check_string.encode(),
hashlib.sha256
).hexdigest()
return calculated_hash == received_hash
å¯å¨ Mini App
ä»é®çæé®ï¼
keyboard = {
"keyboard": [[
{
"text": "æå¼åºç¨",
"web_app": {"url": "https://yourdomain.com/app"}
}
]],
"resize_keyboard": True
}
requests.post(
f"{API_URL}/sendMessage",
json={
"chat_id": chat_id,
"text": "ç¹å»æé®æå¼åºç¨",
"reply_markup": keyboard
}
)
ä»å èæé®ï¼
keyboard = {
"inline_keyboard": [[
{
"text": "å¯å¨åºç¨",
"web_app": {"url": "https://yourdomain.com/app"}
}
]]
}
ä»èåæé®ï¼ ä¸ @BotFather 对è¯ï¼
/setmenubutton
â éæ©ä½ ç Bot
â æä¾ URL: https://yourdomain.com/app
客æ·ç«¯å¼å (TDLib)
ä½¿ç¨ TDLib
Python ç¤ºä¾ (python-telegram)ï¼
from telegram.client import Telegram
tg = Telegram(
api_id='your_api_id',
api_hash='your_api_hash',
phone='+1234567890',
database_encryption_key='changeme1234',
)
tg.login()
# åéæ¶æ¯
result = tg.send_message(
chat_id=123456789,
text='Hello from TDLib!'
)
# è·åè天å表
result = tg.get_chats()
result.wait()
chats = result.update
print(chats)
tg.stop()
MTProto åè®®
ç¹ç¹ï¼
- 端å°ç«¯å å¯
- 髿§è½
- æ¯æææ Telegram åè½
- éè¦ API ID/Hashï¼ä» https://my.telegram.org è·åï¼
æä½³å®è·µ
Bot å¼å
-
é误å¤ç
try: response = requests.post(url, json=data, timeout=10) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请æ±å¤±è´¥: {e}") -
éçéå¶
- ç¾¤ç»æ¶æ¯ï¼æå¤ 20 æ¡/åé
- ç§èæ¶æ¯ï¼æå¤ 30 æ¡/ç§
- å ¨å±éå¶ï¼é¿å è¿äºé¢ç¹
-
ä½¿ç¨ Webhook èéé¿è½®è¯¢
- æ´é«æ
- æ´ä½å»¶è¿
- æ´å¥½ç坿©å±æ§
-
æ°æ®éªè¯
- å§ç»éªè¯ initData
- ä¸è¦ä¿¡ä»»å®¢æ·ç«¯æ°æ®
- æå¡å¨ç«¯éªè¯æææä½
Mini Apps å¼å
-
ååºå¼è®¾è®¡
// çå¬ä¸»é¢åå tg.onEvent('themeChanged', () => { document.body.style.backgroundColor = tg.themeParams.bg_color; }); // çå¬è§å£åå tg.onEvent('viewportChanged', () => { console.log('æ°é«åº¦:', tg.viewportHeight); }); -
æ§è½ä¼å
- æå°å JavaScript å 大å°
- ä½¿ç¨æå è½½
- ä¼åå¾çåèµæº
-
ç¨æ·ä½éª
- éé æ·±è²/æµ è²ä¸»é¢
- 使ç¨åç UI æ§ä»¶ï¼MainButton çï¼
- æä¾è§¦è§åé¦
- å¿«éååºç¨æ·æä½
-
å®å ¨èè
- HTTPS 强å¶
- éªè¯ initData
- ä¸å¨å®¢æ·ç«¯å卿æä¿¡æ¯
- ä½¿ç¨ SecureStorage åå¨å¯é¥
常ç¨åºåå·¥å ·
Python
python-telegram-bot– åè½å¼ºå¤§ç Bot æ¡æ¶aiogram– 弿¥ Bot æ¡æ¶telethon/pyrogram– MTProto 客æ·ç«¯
Node.js
node-telegram-bot-api– Bot API å è£ å¨telegraf– ç°ä»£ Bot æ¡æ¶grammy– è½»éçº§æ¡æ¶
å ¶ä»è¯è¨
- PHP:
telegram-bot-sdk - Go:
telegram-bot-api - Java:
TelegramBots - C#:
Telegram.Bot
åèèµæº
宿¹ææ¡£
- Bot API: https://core.telegram.org/bots/api
- Mini Apps: https://core.telegram.org/bots/webapps
- Mini Apps Platform: https://docs.telegram-mini-apps.com
- Telegram API: https://core.telegram.org
GitHub ä»åº
- Bot API æå¡å¨: https://github.com/tdlib/telegram-bot-api
- Android 客æ·ç«¯: https://github.com/DrKLO/Telegram
- Desktop 客æ·ç«¯: https://github.com/telegramdesktop/tdesktop
- 宿¹ç»ç»: https://github.com/orgs/TelegramOfficial/repositories
å·¥å ·
- @BotFather – å建å管ç Bot
- https://my.telegram.org – è·å API ID/Hash
- Telegram Web App æµè¯ç¯å¢
åèæä»¶
æ¤æè½å å«è¯¦ç»ç Telegram å¼åèµæºç´¢å¼å宿´å®ç°æ¨¡æ¿ï¼
- index.md – 宿´çèµæºé¾æ¥åå¿«é导èª
- Telegram_Bot_æé®åé®çå®ç°æ¨¡æ¿.md – 交äºå¼æé®åé®çå®ç°æåï¼404 è¡ï¼12 KBï¼
- ä¸ç§æé®ç±»å详解ï¼Inline/Reply/Command Menuï¼
- python-telegram-bot å Telethon åå®ç°å¯¹æ¯
- 宿´çå³ç¨ä»£ç 示ä¾å项ç®ç»æ
- Handler ç³»ç»ãé误å¤çåé¨ç½²æ¹æ¡
- 卿è§å¾å¯¹é½å®ç°ææ¡£.md – Telegram æ°æ®å±ç¤ºæåï¼407 è¡ï¼12 KBï¼
- æºè½å¨æå¯¹é½ç®æ³ï¼ä¸æ¥æ³ï¼O(nÃm) å¤æåº¦ï¼
- ç宽åä½ç¯å¢çå®ç¾å¯¹é½æ¹æ¡
- æºè½æ°å¼æ ¼å¼åç³»ç»ï¼B/M/K èªå¨ç¼©åï¼
- æè¡æ¦åæ°æ®è¡¨æ ¼ä¸ä¸å±ç¤º
è¿äºç²¾ç®æåæä¾äºæ ¸å¿ç Telegram Bot å¼åè§£å³æ¹æ¡ï¼
- æé®åé®ç交äºçææå®ç°æ¹å¼
- æ¶æ¯åæ°æ®çä¸ä¸æ ¼å¼åå±ç¤º
- å®ç¨çæä½³å®è·µåå¿«éåè
ä½¿ç¨æ¤æè½ææ¡ Telegram çæçå ¨æ å¼åï¼