我需要在我的Java应用程序中获取当前打开的Google Chrome用户标签(而不是在同一台计算机上)。 Chrome同步已启用,因此当前标签与Google服务器同步。
根据Chrome同步的documentation,它是通过XMPP完成的。所以我想应该可以连接到Google XMPP服务器(xmpp.google.com),例如通过Smack(XMPP的Java库),验证并监听指示标签会话更改的protobuf消息。 当然,用户的登录凭据或Chrome用于识别客户端的“client_id”可用。
但是我很难掌握用于连接XMPP服务器的身份验证方法 - 我无法弄清楚它是如何在Chromium source code中完成的,并且除了代码中的非常低级别的注释。 谷歌使用的libjingle库基于XMPP的服务仅适用于C ++,并且没有很好的维护/记录。
那么有没有人曾经做过类似的事情,谁可以提供有关身份验证过程如何运作的建议/提示?
答案 0 :(得分:9)
我不确定chrome sync是否使用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令牌。当您与HTML对话框“Google帐户登录”进行互动时,会向您提供OAuth令牌。我不确定,但似乎可以公开获取获取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