logo NodeSeekbeta

基于 tg 频道的图床

更新:
由于在网页获取到的图片链接也是临时链接,索性直接在 cloudflare workers 里拿图片,这样就不会因为临时链接过期而导致不能访问了,具体内容见:反代 telegram 频道图片(频道图床)
+=======================================+
之前弄过基于 telegram bot 的图床,不过有个缺点是时效性短没多久就无法访问,然后不死心研究了下公开频道。公开频道是可以在 web 访问的,通过 https://post.tg.dev/<频道名称>/<消息 id> 可在网页看到该消息的内容,很容易从网页源代码中得到图片的链接。于是 ChatGPT 走起,就得到如下代码:

from pyrogram import Client
from pyrogram import filters

api_id = 12345
api_hash = "0123456789abcdef0123456789abcdef"

app = Client("my_account", api_id, api_hash)

chat = 'abcdefg'

@app.on_message(filters.chat(chat) & filters.photo)
def on_message(client, message):
    url = f'https://post.tg.dev/{chat}/{message.id}'
    try:
        response = requests.get(url)
        if response.status_code == 200:
            html_content = response.text
            pattern = r'https://cdn1\.telesco\.pe/file/[^\s)\'"]+'
            image_urls = re.findall(pattern, html_content)
            await message.reply('\n\n'.join([f'`{item.replace('cdn1.telesco.pe', 'example.com)}`' for item in image_urls]))
        else:
            await message.reply(f'无法获取页面。状态码:{response.status_code}')
    except Exception as e:
        await message.reply(f'出错:{e}')

@app.on_edited_message(filters.chat(chat) & filters.photo)
async def edited_message(client, message):
    url = f'https://post.tg.dev/{chat}/{message.id}'

    try:
        response = requests.get(url)
        if response.status_code == 200:
            html_content = response.text
            pattern = r'https://cdn1\.telesco\.pe/file/[^\s)\'"]+'
            image_urls = re.findall(pattern, html_content)
            await message.reply('\n\n'.join([f'`{item.replace('cdn1.telesco.pe', 'example.com')}`' for item in image_urls]))
        else:
            await message.reply(f'无法获取页面。状态码:{response.status_code}')
    except Exception as e:
        await message.reply(f'出错:{e}')

app.run()

这样我们在自己创建的频道(假设频道名为 abcdefg )中发送图片,就自动返回该图片的地址,如 https://cdn1.telesco.pe/file/abcd.....123.jpg

但又总所周知一些不明原因使得有时候不能直接访问到 telegram 的服务,于是用 Cloudflare Workers 反代一下,从 ChatGPT 中得到如下代码:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  // 构建目标 URL
  const url = new URL(request.url)
  //const targetURL = new URL('https://cdn1.cdn-telegram.org' + url.pathname + url.search)
  const targetURL = new URL('https://cdn1.telesco.pe' + url.pathname + url.search)

  // 检查路径是否指向图片
  const isImageRequest = /\.(jpg|jpeg|png|gif|webp)$/i.test(url.pathname)
  
  // 如果不是图片请求,则返回 404
  if (!isImageRequest) {
    return new Response('Not Found', { status: 404 })
  }

  // 从原始请求中创建新请求
  const newRequest = new Request(targetURL, {
    method: request.method,
    headers: request.headers,
    body: request.body,
    redirect: 'follow'
  })

  // 发送新请求并返回响应
  return fetch(newRequest)
}

给 woerker 上一下我们自己的域名,如 example.com,我们就可以从 example.com/file/abcd.....123.jpg 访问图片了。

但注意几个点,第一个是不同 dc 的链接不一样,如 cdn1.telesco.pecdn5.telesco.pe 等,telesco.pe 可用 cdn-telegram.org 替代。第二个是网页访问到的图片压缩比客户端的更严重,质量是无法和 telegra.ph 图床相比的,但是 telegra.ph 的图片一旦上传就无法删除,毕竟频道可编辑可删除,优缺点看自己需求取舍了。

效果测试

12
  • mark

  • xhj003

  • 虽然看不懂,但感觉很可以

  • 虽然看不懂,但感觉很可以

  • 会不会有封号风险 xhj001
    不敢用,怕杜叔叔把俺号给扬了

  • 鸡腿+ 收藏

  • 鸡腿+ 收藏

  • 非常好的项目,爱来自杜罗夫。

  • 关于telegra.ph的内容再次编辑的问题。
    可以通过官方机器人 @telegraph 获取登录链接转跳到浏览器登陆。登录后,再在浏览器编辑生成的文章可以在官方bot进行管理。如修改署名,标题,也可以在登录的浏览器中再次访问这个文章进行编辑。

12

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有15771位seeker

🎉欢迎新用户🎉