引用:

最近做了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. Redis_jedis高版本的JedisPoolConfig没有maxActive和maxWait

    dbcp的修改日志显示:change "maxActive" -> "maxTotal" and "maxWait" -> &q ...

  2. 20145330第七周《Java学习笔记》

    20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...

  3. 8个主要的Velocity语法使用说明

    8个主要的Velocity语法使用说明,分别是:Velocity表达式,Velocity注释,Velocity循环,Velocity条件判断,Velocity赋值,Velocity调试,Velocit ...

  4. JAVA生成条形码

    1.下载生成条形码所需要的jar包barcode4j.jar: 2.java生成条形码代码 import java.awt.image.BufferedImage;import java.io.Fil ...

  5. 兼容所有浏览器的设为首页收藏本站js代码

    大家发现传统的收藏本站按钮在360浏览器下面没有效果了,但是360浏览器用户群却非常之大.所以我们在网上找到一个兼容所有浏览器的收藏本站解决方案,具体功能如下: 设为首页 和 收藏本站js代码 兼容I ...

  6. Odoo 动态设置树形视图列表中的字段

    依赖第三方模块实现,实现效果图如下: 原模块只有9.0版本 ,今改成了8.0版本. git地址见群内公告.

  7. 理解CSS3 transform中的Matrix(矩阵)

    一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵) ...

  8. ACM Steps 2.1.4

    Largest prime factor   Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  9. Hibernate SQLQuery简单实用,做链接查询

    工单里面可能有0个告警,一个或多个告警,当工单中没有告警的时候也需要将工单显示出来,所以就需要使用工单和告警的做链接查询,下面是具体实例 表: CREATE TABLE `alarm` ( `id` ...

  10. 对C++下struct 和 类默认继承的认识

    #include <iostream> using namespace std; struct struct1{ int data1 ; double data2 ; struct1(){ ...