4

我正在尝试使用“mirror-api-subscription”事件侦听器注册 TAKE_A_NOTE。我没有运气:我可以使用“我的应用程序”启动记事本,但是,没有控制台日志表明该事件已被识别。

我想识别 TAKE_A_NOTE 函数何时发生或完成,然后处理响应。我不知道订阅是否应该在流上,或者我是否以错误的方式实现 EventListener。您的帮助将不胜感激。

我正在使用的代码是:

// 参考
// http://www.recursiverobot.com/post/57348836217/getting-started-with-the-mirror-api-using-node-js
// https://www.npmjs.org/package/mirror-api-subscription

var express = require('express')
    , http = 要求('http')
    , https = 要求('https')
    , fs = 要求('fs')
    , googleapis = 要求('googleapis')
    , OAuth2Client = googleapis.OAuth2Client;
var app = express();
var oauth2Client = new OAuth2Client(process.env.MIRROR_DEMO_CLIENT_ID,
   process.env.MIRROR_DEMO_CLIENT_SECRET,process.env.MIRROR_DEMO_REDIRECT_URL);


// 所有环境
app.set('端口', 8888);
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);

var gotToken = 函数 () {
    谷歌API
        .discover('镜像', 'v1')
        .execute(函数(错误,客户端){
            如果(!!错误){
                失败();
                返回;
            }

            insertContact(客户端,失败,成功);
            insertSubscription(客户端,失败,成功);
        });
    };


var insertContact = function (client, errorCallback, successCallback) {
    客户
        .mirror.contacts.insert({
            “id”:“myapp”,
            "displayName": "myApp",
            “优先级”:100,
            “接受命令”:[
                {“类型”:“TAKE_A_NOTE”}
            ],
            "speakableName":"我的应用"
        })
        .withAuthClient(oauth2Client)
        .execute(函数(错误,数据){
            如果(!!错误)
                错误回调(错误);
            别的
                成功回调(数据);
        });
    };

var insertSubscription = function (client, errorCallback, successCallback) {
    client.mirror.subscriptions.insert({
        "callbackUrl":"https://localhost:7777/notification",
        "收藏":"时间线",
        "userToken":"001",
        “验证令牌”:“秘密”,
        “操作”:[“插入”]
        });
    }

    var subscription = require('mirror-api-subscription')(
    功能 () {
    })

    subscription.on('位置#UPDATE',
    功能(通知、用户、有效负载){
      console.log('更新用户 %s 的位置', user.id)
    })

    subscription.on('timeline#INSERT:LAUNCH',
    功能(通知、用户、有效负载){
      console.log('订阅时间线#INSERT:LAUNCH')
    })

    subscription.on('timeline#UPDATE:CUSTOM',
    功能(通知、用户、有效负载){
        console.log('订阅时间线#UPDATE:CUSTOM')
    })

    app.post('/notification', subscription.dispatcher())


    app.get('/', function (req, res) {
        如果(!oauth2Client.credentials){
            // 生成一个允许离线访问并请求权限的 url
            // 用于镜像 API 范围。
            var url = oauth2Client.generateAuthUrl({
                access_type: '离线',
                范围:'https://www.googleapis.com/auth/glass.timeline'
            });
            res.redirect(url);
        } 别的 {
            得到令牌();
        }
        res.write('带节点的玻璃镜 API');
        重发();

    });

    app.get('/oauth2callback', function (req, res) {
        // 如果我们能够获取令牌,则将用户重定向回主页面
        grabToken(req.query.code, 失败, function () {
            res.redirect('/');
        });
    });

    app.post('/reply', function(req, res){
        console.log('replied',req);
        重发();
    });

    变量选项 = {
        键:fs.readFileSync('./ssl/key.pem'),
        证书:fs.readFileSync('./ssl/cert.pem'),
    };

    https.createServer(options, app).listen(7777, function() {
        console.log('https 监听 7777');
    });

    http.createServer(app).listen(app.get('port'), function () {
        console.log('Express 服务器监听端口' + app.get('port'));
    });
4

2 回答 2

4

您的代码至少存在两个潜在问题:

  1. callbackUrl 必须是 Internet 可访问的 HTTPS 地址。“本地主机”还不够好,因为谷歌的服务器需要能够解决它。如果您有公共 IP 地址,您可以提供 IP 地址,或者使用隧道。

  2. 您不会对调用的结果做任何事情client.mirror.subscriptions.insert()。通常,您应该以与调用 相同的方式调用它client.mirror.contacts.insert(),即用withAuthClient()and链接它execute()execute()如果您希望它向 Mirror 服务注册,则需要致电。有关“googleapis”包和发现服务的文档,请参阅https://github.com/google/google-api-nodejs-client/

  3. 可能与 #2 有关,但我不熟悉您包含的包require('mirror-api-subscription'),它处理的事情似乎与它提供的“googleapis”包和发现服务不同。然而,从它的参考文档中,并不清楚它实际上在任何地方设置了回调,并且只是在那里验证回调并分派给完成工作的函数。

于 2014-03-03T14:54:15.357 回答
0
var insertSubscription = function (client, errorCallback, successCallback) {
client.mirror.subscriptions.insert({
    "callbackUrl":"https://mirrornotifications.appspot.com/forward?url=callbackURL",
    "collection":"timeline",
    "userToken":"001",
    "verifyToken":"secret",
    "operation":["INSERT"]
    }).withAuthClient(oauth2Client).execute(function (err, data) {
        if (!!err)
            errorCallback(err);
        else
            successCallback(data);
    });
};
于 2014-07-03T20:59:15.253 回答