使用API​​创建Google日历活动不会创建环聊链接

时间:2013-04-05 03:30:25

标签: node.js google-api google-calendar-api google-oauth hangout

到目前为止,我已经成功地将googleapisgapitoken个软件包混合在一起,通过API在Google日历上创建活动。所有这一切的目的是找到一种方法来以编程方式生成Google Hangout链接,据我所知,您无法通过API执行此操作。根据{{​​3}},您应该能够在创建活动时启用自动创建环聊链接,这是我为该帐户所做的。

我使用的代码只会从Node.js运行,因此没有面向用户的部分。我使用服务帐户技术通过OAuth2.0进行身份验证。除了创建的事件不包含名为“hangoutLink”的属性外,一切似乎都能正常工作。有什么想法吗?

var moment = require('moment');
var googleapis = require('googleapis');
var GoogleToken = require('gapitoken');
var OAuth2Client = googleapis.OAuth2Client;

var token = new GoogleToken({
    iss: '*******************@developer.gserviceaccount.com',
    scope: 'https://www.googleapis.com/auth/calendar',
    keyFile: './*****************.pem'
}, function (err) {
    if (err) {
        return console.log(err);
    }

    token.getToken(function (err, token) {
        if (err) {
            return console.log(err);
        }

        googleapis.load('calendar', 'v3', function (err, client) {
            var oauthClient = new OAuth2Client('', '', '', {}, {
                token_type: 'Bearer',
                access_token: token
            });

            var now = moment().format();

            client
                .calendar
                .events
                .insert({
                    calendarId: 'primary',
                    resource: {
                        summary: 'hangout',
                        description: 'hangout',
                        reminders: {
                            overrides: {
                                method: 'popup',
                                minutes: 0
                            }
                        },
                        start: {
                            dateTime: now
                        },
                        end: {
                            dateTime: now
                        },
                        attendees: [{
                            email: '****@**********.com'
                        }]
                    }
                })
                .withAuthClient(oauthClient)
                .execute(function (err, event) {
                    // event does not contain hangoutLink
                    console.log(event.hangoutLink);
                });
        });
    });
});

3 个答案:

答案 0 :(得分:2)

这不是一个完整的解决方案,但我通过稍微改变约束获得了部分成功。使用事件自动创建环聊链接似乎是特定于帐户的设置,而不是特定于日历的设置。这意味着使用服务帐户模型来创建事件不会触发环聊创建,因为我们没有(据我所知)有办法在创建的Google帐户中启用自动创建环聊服务帐户模型。

为了测试这个理论,我整理了一个基于OAuth的版本,该版本获得了传统的Google帐户令牌。它看起来像这样:https://gist.github.com/drewww/5665130

除了正在使用的令牌类型之外,它与您的示例大致相同。在回调中,可以可靠地填充hangoutLink。

显然,这不像你的例子那么干净。这取决于传统的oauth流,并且创建事件的用户必须在其个人帐户设置中启用自动创建环聊。从用户体验的角度来看,这显然非常不方便。我将尝试创建一个虚拟谷歌帐户并让它拥有我的所有环聊。

答案 1 :(得分:1)

一切都很好,除了必须分两部分添加视频群聊数据。首先,在要创建的事件中,还将其作为表示参数的版本的参数称为conferenceDataVersion

    const event = {
        "summary": "Google I/O 2015",
        "location": "800 Howard St., San Francisco, CA 94103",
        "description": "A chance to hear more about Google\"s developer products.",
        "start": {
            "dateTime": "2015-05-28T09:00:00-07:00",
            "timeZone": "America/Los_Angeles",
        },
        "end": {
            "dateTime": "2015-05-28T17:00:00-07:00",
            "timeZone": "America/Los_Angeles",
        },
        "conferenceData": {
            "createRequest": {
                "requestId": "someRandomKey"
            }
        }
    };

    calendar.events.insert({
        auth: yourAuth,
        calendarId: 'primary',
        resource: event,
        conferenceDataVersion: 1
    }, function (error, event) {
        if (error) {
            console.log("CALENDAR_ERROR", error);
        }
        console.log("CALENDAR_SUCCESS", event.data);
        console.log("HANGOUT_LINK", event.data.hangoutLink);
    });

const event主要是从文档中的示例复制而来。这里的关键是在两部分中添加与会议相关的数据。仅添加:

    "conferenceData": {
        "createRequest": {
            "requestId": "someRandomKey"
        }
    }

不起作用,您还必须在参数上使用conferenceDataVersion: int

答案 2 :(得分:0)

明确将凭据设置为auth客户端:

var oauthClient = new OAuth2Client('', '', '');
oauthClient.credentials = {
  token_type: 'Bearer',
  access_token: token
};