【问题标题】:Telegram Bot API - public download urls for files contain bot tokenTelegram Bot API - 包含机器人令牌的文件的公共下载 url
【发布时间】:2020-06-10 06:13:25
【问题描述】:

我需要使用电报机器人 API 获取文件的公共 URL。 getFile 方法的问题是它以以下格式返回 url:https://api.telegram.org/file/bot<token>/<file_path> 意味着我不能真正公开分享它,因为它包含我的机器人令牌,分享这个 url 是不安全的。

是否可以获得其中没有我的机器人令牌的文件 ID 的公共 URL?有哪些替代方案?

【问题讨论】:

  • 我在机器人支持频道中提出了类似的问题,他们说您需要下载文件并再次提供/流式传输。您是否找到了其他解决方案或阅读此问题的任何人有更好的方法?

标签: telegram-bot


【解决方案1】:

我创建了以下解决方案作为概念证明。请检查: https://gist.github.com/gilpanal/099ff5fc94366fbaabd5e2fbedc7c86f

这个想法是你通过一个中间 API 访问你的文件的二进制数据,你的令牌是安全的。

/*** server.js ***/
/* TESTED WITH NODE VERSION 14+ */

const express = require('express')
const app = express()
const https = require('https')
const port = process.env.PORT || 3000

// Use an Environment Variable to Secure Token Value
const BOT_TOKEN = <BOT_SECRET_TOKEN>
// For better CORS: https://expressjs.com/en/resources/middleware/cors.html
app.use( (req, res, next)  => {
    res.header('Access-Control-Allow-Origin', '*')
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
    next()
})

app.get('/', (req, res) => {
    res.sendStatus(200)
})

// Inspired by: https://stackoverflow.com/a/21024737
app.get('/fileDownload', (req, res) => {
    let uploadResponse = { ok: false, result: null, error: 404, description: 'Not Found' }
    if (req._parsedUrl && req._parsedUrl.query) {        
        const tel_file_path = 'https://api.telegram.org/file/bot' + BOT_TOKEN + req._parsedUrl.query
        https.get(tel_file_path, (response) => {
            const data = []
            response.on('data', (chunk) => {
                data.push(chunk)
            }).on('end', () => {                
                const buffer = Buffer.concat(data)
                res.send(buffer)
            })
        })
    } else {
        res.sendStatus(uploadResponse)
    }
})

app.listen(port)

/*** app.js ***/
const TEL_PATH = '/music/file_352.mp3'
const API_FILEDONWLOAD = 'http://localhost:3000/fileDownload?'

const load = () => {

    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest()

        xhr.open('GET', API_FILEDONWLOAD + TEL_PATH, true)
        xhr.responseType = 'arraybuffer'
        xhr.send()

        xhr.addEventListener('progress', (e) => {
            console.log(`${e.type}: ${e.loaded} bytes transferred\n`)            
        })

        xhr.addEventListener('load', (e) => {            
            const audioData = e.target.response || e.target.result
            resolve(audioData)            
        })

        xhr.addEventListener('error', () => {
            reject(Error('Track ' + TEL_PATH + ' failed to load'))
        })
    })
}

load().then((audiData) => {
    console.log(audiData)
}).catch((err) =>{
    console.log(err)
})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    BODY
    <script src="app.js"></script>
</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 2022-10-18
    • 1970-01-01
    • 2016-01-10
    • 2020-02-28
    • 2020-04-04
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多