Files
CloudFlare-ImgBed/functions/utils/telegramAPI.js

142 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Telegram API 封装类
*/
export class TelegramAPI {
constructor(botToken, proxyUrl = '') {
this.botToken = botToken;
this.proxyUrl = proxyUrl;
// 如果设置了代理域名,使用代理域名,否则使用官方 API
const apiDomain = proxyUrl ? `https://${proxyUrl}` : 'https://api.telegram.org';
this.baseURL = `${apiDomain}/bot${this.botToken}`;
this.fileDomain = proxyUrl ? `https://${proxyUrl}` : 'https://api.telegram.org';
this.defaultHeaders = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
};
}
/**
* 发送文件到Telegram
* @param {File} file - 要发送的文件
* @param {string} chatId - 聊天ID
* @param {string} functionName - API方法名sendPhoto, sendDocument等
* @param {string} functionType - 文件类型参数名photo, document等
* @returns {Promise<Object>} API响应结果
*/
async sendFile(file, chatId, functionName, functionType, caption = '', fileName = '') {
const formData = new FormData();
formData.append('chat_id', chatId);
if (fileName) {
formData.append(functionType, file, fileName);
} else {
formData.append(functionType, file);
}
if (caption) {
formData.append('caption', caption);
}
const response = await fetch(`${this.baseURL}/${functionName}`, {
method: 'POST',
headers: this.defaultHeaders,
body: formData
});
console.log('Telegram API response:', response.status, response.statusText);
if (!response.ok) {
throw new Error(`Telegram API error: ${response.statusText}`);
}
// 解析响应数据
const responseData = await response.json();
return responseData;
}
/**
* 获取文件信息
* @param {Object} responseData - Telegram API响应数据
* @returns {Object|null} 文件信息对象或null
*/
getFileInfo(responseData) {
const getFileDetails = (file) => ({
file_id: file.file_id,
file_name: file.file_name || file.file_unique_id,
file_size: file.file_size,
});
try {
if (!responseData.ok) {
console.error('Telegram API error:', responseData.description);
return null;
}
if (responseData.result.photo) {
const largestPhoto = responseData.result.photo.reduce((prev, current) =>
(prev.file_size > current.file_size) ? prev : current
);
return getFileDetails(largestPhoto);
}
if (responseData.result.video) {
return getFileDetails(responseData.result.video);
}
if (responseData.result.audio) {
return getFileDetails(responseData.result.audio);
}
if (responseData.result.document) {
return getFileDetails(responseData.result.document);
}
return null;
} catch (error) {
console.error('Error parsing Telegram response:', error.message);
return null;
}
}
/**
* 获取文件路径
* @param {string} fileId - 文件ID
* @returns {Promise<string|null>} 文件路径或null
*/
async getFilePath(fileId) {
try {
const url = `${this.baseURL}/getFile?file_id=${fileId}`;
const response = await fetch(url, {
method: 'GET',
headers: this.defaultHeaders,
});
const responseData = await response.json();
if (responseData.ok) {
return responseData.result.file_path;
} else {
return null;
}
} catch (error) {
console.error('Error getting file path:', error.message);
return null;
}
}
/**
* 获取文件内容
* @param {string} fileId - 文件ID
* @returns {Promise<Response>} 文件响应
*/
async getFileContent(fileId) {
const filePath = await this.getFilePath(fileId);
if (!filePath) {
throw new Error(`File path not found for fileId: ${fileId}`);
}
const fullURL = `${this.fileDomain}/file/bot${this.botToken}/${filePath}`;
const response = await fetch(fullURL, {
headers: this.defaultHeaders
});
return response;
}
}