将图像从 Google 张(Google 磁盘)发送到 Telegram 机器人

Send Image From Google Sheets (Google Disk) to Telegram bot

我正在尝试将 Google Sheets 中的图像图表发送到 Telegram。 我正在将图像图表保存到 Google 磁盘,然后将其发送到 Telegram 聊天室(帮助我的电报机器人)。

如果我以这种方式发送 Google Drive link 到电报: 第一次尝试:

file_id_0 = "https://drive.google.com/file/d/1kvitP05ofdyT4YtHgNBdjP-sxIFQlpo7/view?usp=drivesdk";

这是第一次尝试结果:First Try - 很糟糕:我只想在电报聊天中看到图像 - 没有 links。

在这个网站上我找到了解决这个问题的方法(抱歉我丢失了 link):使用 Google 文档和来自 Google Drive 的 file_id。 link 上的文件 ID 在“/d/file_id/view”之间。 为了确认这个决定,我获取了 Google 驱动器上的一些其他文件的 ID 并将其连接起来:

file_id_2 = "1bSSzt5S9SgafeAK7D6dfRiFGECxhSuXo";
sendImage(chatId, "https://docs.google.com/uc?id=" + file_id_2);

第二次尝试结果:Second Try - 完美 - 我需要的!

现在我正在尝试从 Google 驱动器文件中提取 file_id file.getId() 并将此 Id 连接到 google docs link.

第三次尝试结果:third try - 不成功。 如果我在调试程序中获取 link 并在浏览器中打开它 - 它正确打开(如第二次尝试)。在我看来 link 第二和第三 link 没有区别。至少它们可以在浏览器中正确打开。

我应该如何将这个 link 插入到我的函数中才不会出现问题?

P.S:我很抱歉我的英语不好。我准备好给出任何解释,我希望这些图片有助于理解我的问题。

完整代码:

function downloadChart2() {
  let chatId = "-xxx";
  var sheet = SpreadsheetApp.getActiveSheet();

  // Get chart and save it into your Drive
  var chart = sheet.getCharts()[0];
  var file = DriveApp.createFile(chart.getBlob());

  // Set url in one cell and resize the column 
  sheet.getRange(23, 1).setValue(file.getUrl())
  sheet.autoResizeColumn(1);
  file.setName("1234");

  // first try - successful, but bad view on Telegram
  var file_id_0 = file.getUrl();
  sendText(chatId, file_id_0);

  // second try - successful, but i grab this id on adress panel in my brouser
  var file_id_1 = "1cAdAMWFdzZFRgXiM9kbxkzrwVAGpoOIy";
  sendImage(chatId, "https://docs.google.com/uc?id=" + file_id_1);

  // third try - unsuccessful
  var file_id_2 = file.getId();
  var file_id_3 = "https://docs.google.com/uc?id=" + file_id_2; // this link correctly
  sendImage(chatId, file_id_3); // but this don't work
  }
  }

function sendImage(chatId, text, keyBoard) {

  let data = {
    method: 'post',
    payload: {
      method: 'sendMessage',
      chat_id: String(chatId),
      text: text,
      parse_mode: 'HTML',
      reply_markup: JSON.stringify(keyBoard)
    }
  }
  var caption = "Second";
   UrlFetchApp.fetch("https://api.telegram.org/bot" + token + "/sendPhoto?caption=" + encodeURIComponent(caption) + "&photo=" + encodeURIComponent(text) + "&chat_id=" 
   + chatId + "&parse_mode=HTML");
}

当我看到你的脚本时,我认为创建的图像文件可能不会公开共享。我认为这可能是您遇到问题的原因。那么下面的修改呢?

发件人:

var file = DriveApp.createFile(chart.getBlob());

收件人:

var file = DriveApp.createFile(chart.getBlob());
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);

参考: