12

我需要在我的 Java 应用程序(不在同一台机器上)中获取 Google Chrome 用户当前打开的选项卡。Chrome 同步已启用,因此当前标签页与 Google 服务器同步。

根据 Chrome 同步的文档,它是通过 XMPP 完成的。所以我想应该可以连接到 Google XMPP 服务器 (xmpp.google.com),例如通过 Smack(XMPP 的 Java 库),验证并监听指示选项卡会话更改的 protobuf 消息。当然,用户的登录凭据或 Chrome 用来识别客户端的“client_id”是可用的。

但是我很难理解用于连接到 XMPP 服务器的身份验证方法——我无法弄清楚它是如何在 Chromium源代码中完成的,并且除了非常低级的注释之外没有可用的文档编码。Google 用于其基于 XMPP 的服务的 libjingle 库仅适用于 C++,并且没有得到很好的维护/记录。

那么有没有人以前做过类似的事情并且可以就身份验证过程的工作方式提供任何建议/提示?

4

1 回答 1

9

我不确定 chrome 同步是否使用 xmpp,至少在它必须与客户端交换信息的级别上。它使用“协议缓冲区”谷歌技术。该协议是使用 .proto 协议描述文件给出的,您可以使用特殊的编译器将其转换为您的语言对象。同步服务器似乎停留在https://clients4.google.com/chrome-sync和客户端发送 POST 请求,其中包含放置键入的 ClientToServerMessage 消息的二进制正文。这是第一次连接到同步服务器时的输出。第一个输出 Python 对象是 'environ' WSGI 变量的 pprint,其中也放置了 HTTP 标头。第二个对象(在 '====' 之后)是实际的协议消息。

{'CONTENT_LENGTH': '54',
 'CONTENT_TYPE': 'application/octet-stream',
 'GATEWAY_INTERFACE': 'CGI/1.1',
 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
 'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
 'HTTP_AUTHORIZATION': 'GoogleLogin auth=MKhiqZsdz2RV4WrUJzPltxc2smTMcRnlfPALTOpf-Xdy9vsp6yUpS5cGuND0awqrYVUK4lhOJlh6OMsg093eBRghGGIgvWUTzU8PUvquy_c8Xn4sRiz_3tVJcke5eXi3q4qFDa6iVuEbT_0QhyPOjIQyeDOKRpZzMR3rpHsAs0ptFiTtUeTHsoIeUFT9nZPYzkET4-yHbDAp45_dxWdb-U6DPg24',
 'HTTP_CONNECTION': 'keep-alive',
 'HTTP_HOST': 'localhost:8080',
 'HTTP_USER_AGENT': 'Chrome MAC 0.4.21.6 (130497)-devel',
 'PATH_INFO': '/chrome-sync/dev/command/',
 'QUERY_STRING': 'client_id=SOME_SPECIAL_STRING',
 'REMOTE_ADDR': '127.0.0.1',
 'REMOTE_PORT': '59031',
 'REQUEST_METHOD': 'POST',
 'SCRIPT_NAME': '',
 'SERVER_NAME': 'vian-bizon.local',
 'SERVER_PORT': '8080',
 'SERVER_PROTOCOL': 'HTTP/1.0',
 'SERVER_SOFTWARE': 'gevent/1.0 Python/2.6',
 'wsgi.errors': <open file '<stderr>', mode 'w' at 0x100416140>,
 'wsgi.input': <gevent.pywsgi.Input object at 0x102a04250>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': False,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'https',
 'wsgi.version': (1, 0)}
'==================================='
share: "MY_EMAIL_WAS_HERE@gmail.com"
protocol_version: 30
message_contents: GET_UPDATES
get_updates {
  caller_info {
    source: NEW_CLIENT
    notifications_enabled: false
  }
  fetch_folders: true
  from_progress_marker {
    data_type_id: 47745
    token: ""
    notification_hint: ""
  }
}
debug_info {
  events {
    type: INITIALIZATION_COMPLETE
  }
  events_dropped: false
}

这发生在基于 OAuth 的身份验证中。您可以在 HTTP_AUTHORIZATION 字段中看到 OAuth 令牌。OAuth 令牌是在您与 HTML 对话框“Google 帐户登录”交互时提供给您的。我不确定,但似乎获取 Google 服务访问令牌的 API 是公开可用的。

如果您正在寻找 XMPP 身份验证,请在此处查看 X-GOOGLE-TOKEN 身份验证机制的描述: Authenticate to Google Talk (XMPP, Smack) using an authToken

对于 X-OAUTH2 授权,您可以在此处访问信息:https ://developers.google.com/talk/jep_extensions/oauth

这里有一个示例:http: //pits.googlecode.com/svn/trunk/xmpp.c

请注意,您可以将 XMPP 流添加到每次运行浏览器时填充的 Chrome 日志文件 - chrome_debug.log。要启用此功能,请使用以下选项运行 Chrome:--enable-logging --v=2

于 2012-07-30T14:08:44.650 回答