引用:

最近做了google书签同步的模块,发现google并没有公开bookmark相关的api接口,在网上也找了些资料,通过自己抓包分析,测试,总结下使用bookmark接口的心得,我是在android下测试的,应该不存在编程语言的问题。

1.登录google账户(POST)

    由于google bookmark没有公布api,测试google各种认证方式并通过抓包分析,发现想要获得bookmark服务,在请求时必须传递已登录后的Cookie信息。

请求:https://www.google.com/accounts/ServiceLoginAuth

头信息:Cookie="GALX=任意字符串" (此头信息必须有,其他头信息可根据需求添加,否则无法获取到Cookie,任意字符串也很重要,请求参数和此处应一致)

参数:GALX="字符串" (头信息中定义的GALX字符串,必须一致)

Email="用户名"

Passwd="密码"

Java代码可以用DefaultHttpClient方式测试,该类提供了获取和设置Cookie方法,通过验证Cookie中是否有SID,即可验证是否正确登录获得了Cookie。

  1. /**
  2. * 登录google账户
  3. */
  4. private boolean googleLogin() {
  5. HttpPost post = new HttpPost("https://www.google.com/accounts/ServiceLoginAuth");
  6. post.addHeader("Cookie", "GALX=zidangtou");
  7. List<NameValuePair> nvps = new ArrayList<NameValuePair>();
  8. nvps.add(new BasicNameValuePair("GALX", "zidangtou"));
  9. nvps.add(new BasicNameValuePair("Email", "******@gmail.com"));
  10. nvps.add(new BasicNameValuePair("Passwd", "*****"));
  11. try {
  12. post.setEntity(new UrlEncodedFormEntity(nvps));
  13. HttpResponse response = mClient.execute(post);
  14. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK && validateLogin()) {
  15. return true;
  16. }
  17. } catch (UnsupportedEncodingException e) {
  18. e.printStackTrace();
  19. } catch (ClientProtocolException e) {
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. return false;
  25. }

2..获取书签列表(GET)

请求:https://www.google.com/bookmarks/?output=xml&sort=title&num=1000

参数说明:output:导出的方式xml/rss

sort:排序方式,title 以标题排序,date 以建立该Bookmark日期排序

Num:书签数量

若要添加,修改或删除书签,必须要通过https://www.google.com/bookmarks/?output=rss方式,获取响应实体,从中拿到sig签名数据,才能在修改书签时成功修改。

  1. /**
  2. * 获取服务器书签数据,获取sig参数
  3. */
  4. private void getBookmarks() {
  5. HttpGet get = new HttpGet("https://www.google.com/bookmarks/lookup?output=rss");
  6. try {
  7. HttpResponse response = mClient.execute(get);
  8. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  9. //              Log.d("getBookmarks", EntityUtils.toString(response.getEntity()));
  10. mSig= getSignature(response.getEntity().getContent());
  11. Log.d("getSignature", "mSig = "+mSig);
  12. }
  13. } catch (ClientProtocolException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }

3.添加/修改书签(POST)

请求:https://www.google.com/bookmarks/mark

或https://www.google.com/bookmarks/mark?op=edited

或https://www.google.com/bookmarks/mark?op=updated

参数:sig=签名认证(获取书签列表时以https://www.google.com/bookmarks/lookup?output=rss获取时得到)

bkmk=URL
                  title=标题
                  labels=标签(可以为多个,以逗号隔开)
                  annotation=注解:

若书签已存在(URL相同),则修改服务器书签,完全覆盖(label被完全替换为传上去的标签)。

  1. <span style="white-space: pre;">    </span>/**
  2. * 添加单个书签
  3. */
  4. private void addBookmark() {
  5. HttpPost post = new HttpPost("https://www.google.com/bookmarks/mark");
  6. ArrayList<BasicNameValuePair> bnvps = new ArrayList<BasicNameValuePair>();
  7. bnvps.add(new BasicNameValuePair("bkmk","www.ceshi.com"));
  8. bnvps.add(new BasicNameValuePair("title","title_ceshi"));
  9. bnvps.add(new BasicNameValuePair("annotation","anno_ceshi"));
  10. bnvps.add(new BasicNameValuePair("labels","label_ceshi"));
  11. try {
  12. post.setEntity(new UrlEncodedFormEntity(bnvps));
  13. mClient.execute(post);
  14. } catch (UnsupportedEncodingException e) {
  15. e.printStackTrace();
  16. } catch (ClientProtocolException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }

4.批量添加/修改书签(POST)

请求:https://www.google.com/bookmarks/mark?op=upload_selection&sig=签名字符串

参数:bm_序号="X"

url_序号=URL

ttl_序号=标题

lbl_序号=标签

参数中可添加多个书签,以序号区别,例:

bm_1=X,url_1=www.shuqian1.com,ttl_1=书签1,lbl_1=标签1

bm_2=X,url_2=www.shuqian2.com,ttl_2=书签2,lbl_2=标签2

此接口特性:若书签已存在,则修改服务器书签,但并不覆盖(若服务器书签有label,则上传的label会被加载已有label的后面)

  1. /**
  2. * 批量添加多个书签
  3. */
  4. private void batchAddBookmarks() {
  5. HttpPost post = new HttpPost("https://www.google.com/bookmarks/mark?op=upload_selection&sig="+mSig);
  6. ArrayList<BasicNameValuePair> bnvps = new ArrayList<BasicNameValuePair>();
  7. bnvps.add(new BasicNameValuePair("bm_1","X"));
  8. bnvps.add(new BasicNameValuePair("url_1","www.ceshi1.com"));
  9. bnvps.add(new BasicNameValuePair("ttl_1","ceshi1"));
  10. bnvps.add(new BasicNameValuePair("lbl_1","111"));
  11. bnvps.add(new BasicNameValuePair("bm_2","X"));
  12. bnvps.add(new BasicNameValuePair("url_2","www.ceshi2.com"));
  13. bnvps.add(new BasicNameValuePair("ttl_2","ceshi2"));
  14. bnvps.add(new BasicNameValuePair("lbl_2","222"));
  15. try {
  16. post.setEntity(new UrlEncodedFormEntity(bnvps));
  17. mClient.execute(post);
  18. } catch (UnsupportedEncodingException e) {
  19. e.printStackTrace();
  20. } catch (ClientProtocolException e) {
  21. e.printStackTrace();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }

5.删除书签(GET)

请求:https://www.google.com/bookmarks/mark?dlq=书签Id&sig=签名字符串

获取书签时以output=xml请求到的数据里有书签id信息。

  1. /**
  2. * 删除书签
  3. */
  4. private void deleteBookmark() {
  5. HttpGet get = new HttpGet("https://www.google.com/bookmarks/mark?dlq=书签id&sig="+mSig);
  6. try {
  7. mClient.execute(get);
  8. } catch (UnsupportedEncodingException e) {
  9. e.printStackTrace();
  10. } catch (ClientProtocolException e) {
  11. e.printStackTrace();
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }

总结http://zidangtou.iteye.com/blog/748692

1.必须获取到cookie信息后才能正确调用bookmark接口(详见登录google账户)

2.上述接口调用时httpClient用的是同一个对象,里面有cookie信息

3.Sig签名的获取:详见获取书签列表

4.bookmark的接口必须为https类型

参考资料

1.http://www.bookmarked.mobi/bm/google_bookmarks_api/

2.http://chuiwenchiu.spaces.live.com/blog/cns!CA5D9227DF9E78E8!860.entry

3.http://www.codeproject.com/KB/IP/GoogleBookmarks.aspx

google bookmarket api的更多相关文章

  1. 使用google 语言 api 来实现整个网站的翻译

    ---恢复内容开始--- 使用google 语言 api 来实现整个网站的翻译,这时我们可以利用免费的google api来做处理来实现多语言的功能. 放在 HTML 文件中 <div id=& ...

  2. Google Map API Version3 :代码添加和删除marker标记

    转自:http://blog.sina.com.cn/s/blog_4cdc44df0100u80h.html Google Map API Version3 教程:在地图 通过代添加和删除mark标 ...

  3. Google Map API V3开发(1)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  4. Google Map API V3开发(2)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  5. Google Map API V3开发(3)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  6. Google Map API V3开发(4)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  7. Google Map API V3开发(5)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  8. Google Map API V3开发(6) 代码

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  9. Google 地图 API V3 使用入门

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

随机推荐

  1. XML参考 :XmlReader 详解、实例

    XML参考 :XmlReader 详解.实例-- 详解 转:http://www.cnblogs.com/Dlonghow/archive/2008/07/28/1252191.html XML参考 ...

  2. Odoo中的Javascript单元测试

    前端页面利用QUnit进行单元测试,本文参考官方文档:https://www.odoo.com/documentation/8.0/reference/javascript.html 访问/web/t ...

  3. UVA12532 线段树(单点更新,区间求乘积的正负)

    It’s normal to feel worried and tense the day before a programming contest. To relax, you went out f ...

  4. php+curl上传文件

    因为公司项目用java做的,需要我这边用php上传文件.只给了个接口,参数都不明确,然后这边不提交表单,在生成pdf之后就立马上传.用了php+curl,总是没上传成功,这里看到了篇文章http:// ...

  5. NeuSoft(2)添加系统调用

    1.下载内核 apt-get install linux-source 在/usr/src下 2.解压内核 cd /usr/src tar -jxvf linux-source-3.2.0.tar.b ...

  6. C++ STL

    1.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...

  7. YII2 blockui

    https://packagist.org/packages/ayrozjlc/yii2-blockui

  8. Eclipse new server : Cancnot create a server using the selected type

    1.退出 eclipse 2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runtime 3.把org.eclipse.wst.server.core.p ...

  9. eclipse创建web项目

    总结为3步: 必备环境: Eclipse jee Tomcat 1.创建services 2.创建dynamic web project项目 3.WebContent路径下创建index.jsp 运行 ...

  10. Thinking in Java——笔记(9)

    Polymorphism Abstract classes and methods If you have an abstract class, objects of that specific cl ...