更新:
由于在网页获取到的图片链接也是临时链接,索性直接在 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.pe
、cdn5.telesco.pe
等,telesco.pe
可用 cdn-telegram.org
替代。第二个是网页访问到的图片压缩比客户端的更严重,质量是无法和 telegra.ph
图床相比的,但是 telegra.ph
的图片一旦上传就无法删除,毕竟频道可编辑可删除,优缺点看自己需求取舍了。
效果测试
mark
顶
虽然看不懂,但感觉很可以
虽然看不懂,但感觉很可以
会不会有封号风险
不敢用,怕杜叔叔把俺号给扬了
鸡腿+ 收藏
鸡腿+ 收藏
顶
非常好的项目,爱来自杜罗夫。
关于telegra.ph的内容再次编辑的问题。
可以通过官方机器人 @telegraph 获取登录链接转跳到浏览器登陆。登录后,再在浏览器编辑生成的文章可以在官方bot进行管理。如修改署名,标题,也可以在登录的浏览器中再次访问这个文章进行编辑。