JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 程式分享區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
己加入精華區
by koji at 2009-12-31 17:44
本主題所含的標籤
作者 jPlurk - Plurk Official API Binding in Java [精華]
askeing





發文: 1
積分: 3
於 2009-12-31 15:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jPlurk - Plurk Official API Binding in Java

jPlurk 在 Plurk 官方釋出 API 之後,凍結了原來的 v 1.1 版。
著手開發基於 Plurk 官方 API 的新版本 jPlurk v 2.0。
目前正處於開發測試中的 beta 版本。

專案位置
http://jplurk.googlecode.com/
http://code.google.com/p/jplurk/wiki/Introduction

SVN
svn co http://jplurk.googlecode.com/svn/trunk/com.google.jplurk jplurkV2

註:您需使用 Maven 才可編譯本專案。
若使用新版的 NetBeans 無需額外安裝 Module。舊版 NetBeans 可加裝 maven Plugin 後開啟專案。
若使用 Eclipse 需加裝 m2eclipse。

快速上手
http://code.google.com/p/jplurk/wiki/jplurkV2

最新公開測試版本
jplurk v2 r361 with dependencies.zip (rev 361, 含原始碼及相依函式庫)

使用 jPlurk 三步驟
1. 設定 jplurk.properties
2. 建立 PlurkClient
3. 執行 PlurkClient 函式

設定 jplurk.properties

您需要準備 jplurk.properties 用來放置申請到的 Plurk API KEY,jPlurk 將在 PlurkSettings 使用這個檔案的資訊:
1
api_key=[your_api_key]


建立 PlurkClient

jPlurk 將所有功能包裝在 PlurkClient 類別,建立這個類別需要搭配 PlurkSettings 使用。在預設的情況,PlurkSettings 會至家目錄搜尋 jplurk.properties 檔:
1
PlurkClient client = new PlurkClient(new PlurkSettings());


如果您想指定別的設定檔名稱,也能在建立 PlurkSettings 時指定 File 物件:
1
PlurkClient client = new PlurkClient(new PlurkSettings(new File("myPlurk.properties")));


執行 PlurkClient 函式
一旦 PlurkClient 建立成功,您就可以能開始使用實作完成的 API 方法。
但是在 Plurk API 標示不需登入的方法相當稀少。
因此,在實作上我們並不為這寫特例區別哪些功能需要登入使用,哪些是不需登入使用。

在執行其它功能前,您需先做 login 的動作:
1
JSONObject ret = client.login(JOptionPane.showInputDialog("user_id"), JOptionPane.showInputDialog("password"));


完成登入後,您可以開始使用已經實作在 jPlurk 的功能,您可以參考 jPlurk wiki 上的實作狀態表:
http://code.google.com/p/jplurk/wiki/jplurkV2

設計慣例
0. 與 Plurk API 功能對應
1. 所有 PlurkClient 實作的 API 方法都回傳 JSONObject 或 JSONArrayObject
2. 當發生例外,或 Http 回傳狀態不為 200 OK 時,會傳回 null

完整範例程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Example Code using jPlurk v2 beta
 */
package plurkit;
 
import com.google.jplurk.PlurkClient;
import com.google.jplurk.PlurkSettings;
import com.google.jplurk.Qualifier;
import com.google.jplurk.exception.PlurkException;
import javax.swing.JOptionPane;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.json.JSONException;
import org.json.JSONObject;
 
/**
 * This PlurkIt just for testing.
 * @author askeing_yen
 */
public class PlurkIt {
 
    private void gracefulWait() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException ignored) {
        }
    }
 
    public void testJPlurk() throws Exception {
        PlurkSettings config = null;
        try {
            config = new PlurkSettings();
        } catch (PlurkException e) {
            System.out.println(e.getMessage());
        }
        PlurkClient client = new PlurkClient(config);
 
        // do login
        System.out.println("Do Login");
        JSONObject ret = client.login(JOptionPane.showInputDialog("id"), JOptionPane.showInputDialog("password"));
        System.out.println(ret);
        gracefulWait();
 
        // do plurk add
        System.out.println("Do Plurk Add");
        String content = RandomStringUtils.random(100, "1234567890abcdef");
        ret = client.plurkAdd(content, Qualifier.LOVES);
        int plurkId = 0;
        String responsedContent = "";
        try {
            plurkId = NumberUtils.toInt("" + ret.get("plurk_id"));
            responsedContent = ret.getString("content_raw");
            System.out.println("Content Input: " + content);
            System.out.println(" After Add It: " + responsedContent);
        } catch (JSONException e) {
            System.out.println(e.getMessage());
        }
        gracefulWait();
 
        // do plurk edit
        System.out.println("Do Plurk Edit");
        ret = client.plurkEdit("" + plurkId, StringUtils.reverse(responsedContent));
        System.out.println(ret);
        System.out.println("Content Input: " + StringUtils.reverse(responsedContent));
        System.out.println("After Edit It: " + ret.getString("content_raw"));
        gracefulWait();
 
        // do mute plurk
        System.out.println("Do Mute Plurk");
        ret = client.mutePlurks(new String[]{"" + plurkId});
        System.out.println(ret);
        gracefulWait();
 
        // do unmute plurk
        System.out.println("Do Unmute Plurk");
        ret = client.unmutePlurks(new String[]{"" + plurkId});
        System.out.println(ret);
        gracefulWait();
 
        // do response
        System.out.println("Do Add Response");
        int rPlurkId = 0;
        String rContent = "response_" + RandomStringUtils.random(20, "abcdef");
        ret = client.responseAdd("" + plurkId, rContent, Qualifier.SAYS);
        rPlurkId = NumberUtils.toInt("" + ret.get("id"));
        System.out.println("Plurk ID: " + rPlurkId);
        System.out.println(ret);
        System.out.println("Content Raw: " + ret.getString("content_raw"));
        gracefulWait();
 
        // do get response
        System.out.println("Do Get Response");
        ret = client.responseGet("" + plurkId);
        // TODO: 雖然正常回傳,但是無法得到結果。需要待 plurk api service team 回覆
        System.out.println(ret);
        gracefulWait();
 
        // do delete response
        System.out.println("Do Delete Response");
        ret = client.responseDelete("" + plurkId, "" + rPlurkId);
        System.out.println(ret);
        gracefulWait();
 
        // do plurk delete
        System.out.println("Do Plurk Delete");
        ret = client.plurkDelete("" + plurkId);
        System.out.println(ret);
    }
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        PlurkIt myApp = new PlurkIt();
        try {
            myApp.testJPlurk();
        } catch (Exception ex) {
            System.out.println("Fail: " + ex.getMessage());
        }
    }
}


Happy New Year!! Big Smile


askeing edited on 2009-12-31 15:20
reply to postreply to post
Blog http://askeing.blogspot.com/
Plurk http://www.plurk.com/Askeing/invite
作者 Re:jPlurk - Plurk Official API Binding in Java [Re:askeing]
qrtt1





發文: 1746
積分: 31
於 2010-01-09 16:49 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jPlurk rev405

趁假日偷閒一下,修正了一點小 bug 與整理 Library 相依關係。

現在最新發佈版本為 rev 405
http://code.google.com/p/jplurk/downloads/list

* 修正 response get 沒有回應的問題
* 在 Android 上使用僅需要 jPlurk 本身,無需引用其他 Library

jPlurk in Pluroium

我們嘗試將 ericsk[1] 開發的 Pluroium[2] 專案,改用 jPlurk 實作與 Plurk 互動的部分:
http://sites.google.com/site/readerqty/jplurk-note/jplurkinpluroium
頁面的附件為 Pluroium 專案的 Zip 打包,同時它含有 hg repository 您可以利用它來版本控制。
亦可由 Pluroium 專案頁面取得原始的版本。

[1] http://www.google.com/profiles/ericsk
[2] http://code.google.com/p/pluroium/


qrtt1 edited on 2010-01-09 16:51
reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
作者 Re:jPlurk - Plurk Official API Binding in Java [Re:qrtt1]
qrtt1





發文: 1746
積分: 31
於 2010-12-25 13:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
趁著今天日子好,修改了一下 jPlurk
把被黑掉的 Exception 找回來了

http://code.google.com/p/jplurk/downloads/list

在 jplurk v2.1-preview r501 版本中,我們改掉了過去用 null 作為錯誤發生時的回傳方式。
將 Exception 留給 api client 決定是否要處理之。


reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
作者 Re:jPlurk - Plurk Official API Binding in Java [Re:askeing]
qrtt1





發文: 1746
積分: 31
於 2011-09-17 09:33 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
隨著 Plurk API 昇級到 2.0 版,我們 fork 了另一個專案 JPlurk-OAuth Big Smile

https://github.com/qrtt1/jplurk-oauth/wiki

用法很簡單:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.google.jplurk_oauth.example;
 
import java.util.Properties;
 
import com.google.jplurk_oauth.Qualifier;
import com.google.jplurk_oauth.module.Timeline;
import com.google.jplurk_oauth.skeleton.PlurkOAuth;
import com.google.jplurk_oauth.skeleton.RequestException;
 
public class Example {
    public static void main(String[] args) throws RequestException {
        Properties prop = System.getProperties();
        
        /* create oauth config */
        PlurkOAuth auth = new PlurkOAuth(
                prop.getProperty("appkey"), prop.getProperty("appsecret"), 
                prop.getProperty("token"), prop.getProperty("tokensecret"));
        
        auth.using(Timeline.class).plurkAdd("Hello JPlurk-OAuth", Qualifier.SAYS);
    }
}


如果你想加入新的功能(部分我們還沒實作的功能),那也是很容易的。
以 Profile 模組為例,要新增一個模組就只是繼承 AbstractModule 並提供 getModulePath() 的實作。
這個路徑是由 API 手冊上抄寫下來的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.google.jplurk_oauth.module;
 
import org.json.JSONObject;
 
import com.google.jplurk_oauth.skeleton.AbstractModule;
import com.google.jplurk_oauth.skeleton.Args;
import com.google.jplurk_oauth.skeleton.HttpMethod;
import com.google.jplurk_oauth.skeleton.RequestException;
 
public class Profile extends AbstractModule {
 
    @Override
    protected String getModulePath() {
        return "/APP/Profile";
    }
 
    public JSONObject getOwnProfile() throws RequestException {
        return requestBy("getOwnProfile").withoutArgs()
            .in(HttpMethod.GET).thenJsonObject();
    }
    
    public JSONObject getPublicProfile(Long userId) throws RequestException {
        return requestBy("getPublicProfile")
            .with(new Args().add("user_id", userId))
            .in(HttpMethod.GET).thenJsonObject();
    }
    
    public JSONObject getPublicProfile(String userId) throws RequestException {
        return requestBy("getPublicProfile")
            .with(new Args().add("user_id", userId))
            .in(HttpMethod.GET).thenJsonObject();
    }
 
}
 


而單一的 action 實作,利過父類別提供的方法,我們能組合出 OAuth request,
這其實是個簡單的 Request Builder,最後別忘了呼叫 thenJsonObject()
1
2
3
4
5
    public JSONObject getPublicProfile(Long userId) throws RequestException {
        return requestBy("getPublicProfile")
            .with(new Args().add("user_id", userId))
            .in(HttpMethod.GET).thenJsonObject();
    }


reply to postreply to post
蝸牛角上爭何事?石火光中寄此身,隨富隨貧且歡樂,不開口笑是癡人。
my notes
» JWorld@TW »  Java 程式分享區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8