发送推文失败。错误是:{"name":"Exception"} - Google 应用程序脚本

Send tweet failure. Error was: {"name":"Exception"} - Google App Script

要收集从我的个人资料发送的 Telegram 消息,在电子表格中注册并根据这些消息创建一条推文,我设置了这个模型:

var token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var telegramUrl = "https://api.telegram.org/bot" + token;
var webAppUrl = "https://script.google.com/macros/s/UUUUUUUUUUUUUUUUUUUUUUUUUUU";

function setWebhook() {
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
  var response = UrlFetchApp.fetch(url);
}

function doPost(e) {
  var contents = JSON.parse(e.postData.contents);
  var dateNow = Utilities.formatDate(new Date(), "GMT-03:00", "yyyy-MM-dd' 'HH:mm:ss' '");
  var id = contents.message.from.id;

  if (id != 123456789) return;

  var username = contents.message.from.username;
  var name = contents.message.from.first_name + " " + contents.message.from.last_name;
  var text = contents.message.text;
  
  if (!text) return;
  
  var ssId = "ID TO SPREADSHEET";
  var sheet = SpreadsheetApp.openById(ssId).getSheetByName("SPREADSHEET NAME");
  
  sheet.appendRow([dateNow, id, username, name, text]);
  
  var twitterKeys= {
    TWITTER_CONSUMER_KEY: "<<consumer key>>",
    TWITTER_CONSUMER_SECRET: "<<consumer secret>>",
    TWITTER_ACCESS_TOKEN: "<<access token>>",
    TWITTER_ACCESS_SECRET: "<<access secret>>"
  };
  
  var props = PropertiesService.getScriptProperties();
  
  props.setProperties(twitterKeys);
  twit = new Twitter.OAuth(props);

  var service = new Twitter.OAuth(props);
  
  if ( service.hasAccess() ) {
    
    var response = twit.sendTweet(text);
    
    if (response) {
      
      Logger.log("Tweet ID " + response.id_str);
      
    } else {
      
      // Tweet could not be sent
      // Go to View -> Logs to see the error message
      
    }
  }
}

我用 Twitter 的名称标识的库是:

MKvHYYdYA4G5JJHj7hxIcoh8V4oX7X1M_

但是推文没有被发送,当我尝试单独使用推文的发送部分时,消息Send tweet failure. Error was: {"name": "Exception"}出现在日志记录中。

分开发送测试:

function sendTweet(status) {

  status = status || "Teste";

  var twitterKeys= {
    TWITTER_CONSUMER_KEY: "<<consumer key>>",
    TWITTER_CONSUMER_SECRET: "<<consumer secret>>",
    TWITTER_ACCESS_TOKEN: "<<access token>>",
    TWITTER_ACCESS_SECRET: "<<access secret>>"
  };

  var props = PropertiesService.getScriptProperties();

  props.setProperties(twitterKeys);
  twit = new Twitter.OAuth(props);
  
  var service = new Twitter.OAuth(props);

  if ( service.hasAccess() ) {

    var response = twit.sendTweet(status);

    if (response) {

      Logger.log("Tweet ID " + response.id_str);

    } else {

      // Tweet could not be sent
      // Go to View -> Logs to see the error message

    }
  }
}

我需要一些帮助,了解我需要在脚本中编辑什么,以便 Telegram 上收集的消息变成文本并作为新推文发送到 Twitter。

修改点:

当我使用以下示例脚本和您提供的令牌测试发布文本时,

const url = "https://api.twitter.com/1.1/statuses/update.json"
const params = {muteHttpExceptions: true, "method":"POST","payload":"status=test","headers":{"Authorization":"###"},"escaping":false};
const res = UrlFetchApp.fetch(url, params);
console.log(res.getContentText())

我确认了{"request":"\/1.1\/statuses\/update.json","error":"Read-only application cannot POST."}的错误信息。从这个错误消息来看,您当前问题的原因似乎是由于您的 twitter 帐户的应用程序端设置为使用 twitter API。 Ref Unfortunately, this error message is not shown in the library 您正在使用。至此,很遗憾,无法直接找到问题的原因。

为此,请将 twitter API 应用程序的权限从“读取”修改为“读取和写入”和“读取 + 写入 + 私信”。修改权限后,请获取新的 access token 和 secret。通过这个流程,当使用新的访问令牌和密码时,您的脚本就可以工作了。

参考: