使用本地文件编辑 Telegram 频道中消息的图像

Using a local file to edit image of a message in the Telegram channel

我使用的方法是基于我在频道中创建新图像出版物所使用的模型,并进行了当前修改:

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
    }

image_file = 'jogos_de_hoje_na_tv_plus_watermark.png'
chat_telegram_channel = ['-XXXXXXXXXXXXXXXXX']
idmessage = 16967

textalert = f'AAAAAAAAAA'
botalert = 'BBBBBBBBBBBB'
urlalert = f'https://api.telegram.org/bot{botalert}/editMessageMedia'
photourl  = open(image_file, "rb")
params = {'caption':textalert, 'chat_id':chat_telegram_channel, 'message_id':idmessage, 'media':photourl, 'parse_mode':'HTML'}
requests.get(urlalert, headers=headers, params=params)

请求响应为:

<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

尝试使用 POST 而不是 GET:

data = {'caption':textalert, 'chat_id':chat_telegram_channel, 'message_id':idmessage, 'media':photourl, 'parse_mode':'HTML'}
requests.post(urlalert, headers=headers, data=data)

响应是:

{
    "ok":false,
    "error_code":400,
    "description":"Bad Request: can't parse input media JSON object"
}

根据这个回答(),需要对字符串进行序列化,嗯,我试过这样做:

photourl  = open(image_file, "rb")
data = {'caption':textalert, 'chat_id':chat_telegram_channel, 'message_id':idmessage, 'media':json.dumps(str(photourl)), 'parse_mode':'HTML'}
requests.post(urlalert, headers=headers, data=data)

但回复是:

{
    "ok":false,
    "error_code":400,
    "description":"Bad Request: can't parse InputMedia: expected an Object"
}

这个需求的API部分是:

https://core.telegram.org/bots/api#editmessagemedia

我应该怎么做才能解决这个问题?

从数据中删除 photourl 并将其放入请求 files 参数中,如下所示:

photourl = open(image_file, "rb")
data = {
'caption':textalert, 'chat_id':chat_telegram_channel, 'message_id':idmessage,
'parse_mode':'HTML'
}
files = {'media':photourl}
requests.post(urlalert, headers=headers, data=data, files=files)

经过多次尝试,我想出了如何继续序列化字符串然后编辑:

import requests
import json

BOT_TOKEN = 'AAAAAAAAAA'
chat_telegram_channel = 'BBBBBBBBBB'
idmessage = 16967

image_file = 'jogos_de_hoje_na_tv_plus_watermark.png'
urlalert = f'https://api.telegram.org/bot{BOT_TOKEN}/editMessageMedia'
textalert = f'Programação de jogos na TV\nPowered by:\n@mattosxperiences'

files = {
    'media': open(image_file, "rb")
}
media = json.dumps({
    'caption':textalert,
    'type': 'photo',
    'media': 'attach://media'
})
params = { 
    'chat_id':chat_telegram_channel, 
    'message_id':idmessage, 
    'media': media,
    'parse_mode':'HTML'
    }

requests.get(urlalert, params=params, files=files)

您应该使用 POST 请求上传文件。

这是如何完成的,使用 post 请求发送和编辑照片:

import requests
import json

botToken = 'REPLACE_TOKEN'
chatId = 0 # REPLACE CHAT ID


def send_photo():
    image = "image.jpg"
    address = f'https://api.telegram.org/bot{botToken}/sendPhoto'
    data = {"chat_id": chatId, "caption": "before edit"}
    with open(image, "rb") as imageFile:
        result = requests.post(address, files={"photo": imageFile}, data=data).json()
        if result["ok"]:
            return result["result"]["message_id"]
        else:
            raise Exception(result["description"])
    return


def edit_photo(message_id):
    image = "image2.jpg"
    address = f'https://api.telegram.org/bot{botToken}/editMessageMedia'
    media = {"type": "photo", "media": "attach://photo", "caption": "after edit"}
    data = {"chat_id": chatId, "message_id": message_id, "media": json.dumps(media)}
    with open(image, "rb") as imageFile:
        requests.post(address, files={"photo": imageFile}, data=data)
    return


edit_photo(send_photo())