mirror of
https://github.com/MarSeventh/CloudFlare-ImgBed.git
synced 2026-01-31 09:03:19 +08:00
142 lines
4.6 KiB
JavaScript
142 lines
4.6 KiB
JavaScript
/**
|
||
* 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;
|
||
}
|
||
|
||
} |