zoukankan      html  css  js  c++  java
  • google bookmarket api

    引用:

    最近做了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。

     

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

      

    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签名数据,才能在修改书签时成功修改。

     

    Java代码  收藏代码
    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被完全替换为传上去的标签)。

     

    Java代码  收藏代码
    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的后面)

     

    Java代码  收藏代码
    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.           
    8.         bnvps.add(new BasicNameValuePair("bm_1","X"));  
    9.         bnvps.add(new BasicNameValuePair("url_1","www.ceshi1.com"));  
    10.         bnvps.add(new BasicNameValuePair("ttl_1","ceshi1"));  
    11.         bnvps.add(new BasicNameValuePair("lbl_1","111"));  
    12.           
    13.         bnvps.add(new BasicNameValuePair("bm_2","X"));  
    14.         bnvps.add(new BasicNameValuePair("url_2","www.ceshi2.com"));  
    15.         bnvps.add(new BasicNameValuePair("ttl_2","ceshi2"));  
    16.         bnvps.add(new BasicNameValuePair("lbl_2","222"));  
    17.         try {  
    18.             post.setEntity(new UrlEncodedFormEntity(bnvps));  
    19.             mClient.execute(post);  
    20.         } catch (UnsupportedEncodingException e) {  
    21.             e.printStackTrace();  
    22.         } catch (ClientProtocolException e) {  
    23.             e.printStackTrace();  
    24.         } catch (IOException e) {  
    25.             e.printStackTrace();  
    26.         }  
    27.     }  

      

    5.删除书签GET

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

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

     

    Java代码  收藏代码
    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

  • 相关阅读:
    Servlet 处理HTTP请求
    Servlet基础知识
    JavaWeb基础知识点①请求响应②comcat③类和类的关系
    MySQL子查询
    聚合与分组
    表联接
    LVS+KEEPALIVED
    tar命令详解
    mysql 安装
    mysql两种备份方法总结:mysqldump 和 xtrabackup
  • 原文地址:https://www.cnblogs.com/sode/p/3152643.html
Copyright © 2011-2022 走看看