我也是現在才知道~原來在粉絲團按讚就等於加入粉絲團了!!
粉絲團內容+按讚使用like_box,
如果要跟網路上一樣精簡只有讚按紐可以用like_button
官網上這些被列入plugin, 還有預覽跟gen code很貼心!!
http://developers.facebook.com/docs/reference/plugins/like-box/
在送出page前check有沒有加入粉絲團一樣用FB.api...
此頁是接在之前登入APP後做的~ 所以能來到這的user是都已經登入過囉!!
---html/jsp include
<script src="http://connect.facebook.net/zh_TW/all.js"></script>
<div id="like_box" style="margin-top:5px;display:none">
<div class="fb-like-box" data-href="http://www.facebook.com/tyepb" data-width="300" data-show-faces="true" data-stream="false" data-header="false"></div>
</div>
---script/js file
FB.init({
appId: '{APP_ID}', // App ID
//channelURL: '....................', // Channel File
status: true, // check login status
cookie: true, // enable cookies to allow the server to access the session
oauth: false, // enable OAuth 2.0
xfbml: true // parse XFBML
});
function fan2() {
var pid = '{PAGE_ID}';
var isFan = false;
FB.api('/me/likes/'+pid,function(response) {
//console.log(response);
if( response.data ) {
if(response.data) {
for(var i = 0 ; i < response.data.length ; i++) {
if(pid == response.data[i].id) {
isFan = true;
//console.log('??it is fan!!');
//return true;
}
}
}
if(isFan) {
//do something when user like fans page
} else {
//do something when user unlike fans page
return false;
}
} else {
//user not login/or not connect FB APP
return false;
}
});
return false;
}
2012年6月15日 星期五
FB JS SDK-使用者登入FB APP
不知道是不是閏月的關係~ 最近真是太血淚了Orz..
在Java Base, FB沒有特製的SDK, 就只能用JS SDK
主要有Issue要判斷~ facebook的user是不是某某粉絲團的粉絲~
所以要先弄一個FB APP去access使用者資訊..
而如何讓使用者登入FB APP並同意隱私權授權..
不換頁~ 直接在同一頁登入..
在官網的範例有很不錯的範例~ 我只是把另開改成在原本頁面處理...
FB.api + oauth dialogs
http://developers.facebook.com/docs/reference/dialogs/oauth/
---html/jsp include FB js lib
<script src="http://connect.facebook.net/zh_TW/all.js"></script>
---js script/file
FB.init({
appId: '{APP_ID}', // App ID
//channelURL: '....................', // Channel File
status: true, // check login status
cookie: true, // enable cookies to allow the server to access the session
oauth: false, // enable OAuth 2.0
xfbml: true // parse XFBML
});
function loginUser() {
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
//login and permit APP access before
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
//do something when user login FB APP ok
$('#like_box').css('display', 'block');
} else if (response.status === 'not_authorized') {
//login but not access app
doLoginApp2();
} else {
// the user isn't logged in to Facebook.
doLoginApp2();
}
}, true);
}
function doLoginApp2() {
var appID = '{APP_ID}';
var path = 'https://www.facebook.com/dialog/oauth?';
//on moblie, display=touch
var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token', 'display=touch'];
//on PC web
//var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token'];
var query = queryParams.join('&');
var url = path + query;
window.location = url;
}
在Java Base, FB沒有特製的SDK, 就只能用JS SDK
主要有Issue要判斷~ facebook的user是不是某某粉絲團的粉絲~
所以要先弄一個FB APP去access使用者資訊..
而如何讓使用者登入FB APP並同意隱私權授權..
不換頁~ 直接在同一頁登入..
在官網的範例有很不錯的範例~ 我只是把另開改成在原本頁面處理...
FB.api + oauth dialogs
http://developers.facebook.com/docs/reference/dialogs/oauth/
---html/jsp include FB js lib
<script src="http://connect.facebook.net/zh_TW/all.js"></script>
---js script/file
FB.init({
appId: '{APP_ID}', // App ID
//channelURL: '....................', // Channel File
status: true, // check login status
cookie: true, // enable cookies to allow the server to access the session
oauth: false, // enable OAuth 2.0
xfbml: true // parse XFBML
});
function loginUser() {
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
//login and permit APP access before
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
//do something when user login FB APP ok
$('#like_box').css('display', 'block');
} else if (response.status === 'not_authorized') {
//login but not access app
doLoginApp2();
} else {
// the user isn't logged in to Facebook.
doLoginApp2();
}
}, true);
}
function doLoginApp2() {
var appID = '{APP_ID}';
var path = 'https://www.facebook.com/dialog/oauth?';
//on moblie, display=touch
var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token', 'display=touch'];
//on PC web
//var queryParams = ['client_id=' + appID, 'redirect_uri=' + window.location, 'response_type=token'];
var query = queryParams.join('&');
var url = path + query;
window.location = url;
}
2012年6月14日 星期四
NetBeans yWork UML
因應有人要求說程式也要出個物件圖..Class Diagram..
痛恨一力噗死的我就只能用NetBeans..
還好還有個方便的解決方式..yWork..
首先先到yWork官網~ 下載(速度有點慢要有耐心~ 還好等待是有價值的!!)
http://www.yworks.com/en/index.html
選擇UML Doclet, 免費的就有物件圖了..
Step 1. 下載zip包
Step 2. 解壓縮~整個copy到喜歡的地方..
Step 3. 打開NetBeans(我用7.1, 其他IDE或版本設定是不一樣的~可以參照zip裡的usersguide.pdf)
Step 4. NetBeans專案右鍵Properties->Build->Documenting
Addtional Javadoc Options填入
-docletpath "{yWorks包絕對路徑}\lib\ydoc.jar" -resourcepath "{yWorks包絕對路徑}\resources" -doclet ydoc.doclets.YStandard -umlautogen
按下OK儲存
Step 5. NetBeans專案右鍵Generate JavaDoc..
如果沒有出錯~ 完成後跳出瀏覽器直接link..就含有圖的javadoc了
之後就可以去NetBeans專案下找javadoc打包帶走^_^b~
痛恨一力噗死的我就只能用NetBeans..
還好還有個方便的解決方式..yWork..
首先先到yWork官網~ 下載(速度有點慢要有耐心~ 還好等待是有價值的!!)
http://www.yworks.com/en/index.html
選擇UML Doclet, 免費的就有物件圖了..
Step 1. 下載zip包
Step 2. 解壓縮~整個copy到喜歡的地方..
Step 3. 打開NetBeans(我用7.1, 其他IDE或版本設定是不一樣的~可以參照zip裡的usersguide.pdf)
Step 4. NetBeans專案右鍵Properties->Build->Documenting
Addtional Javadoc Options填入
-docletpath "{yWorks包絕對路徑}\lib\ydoc.jar" -resourcepath "{yWorks包絕對路徑}\resources" -doclet ydoc.doclets.YStandard -umlautogen
按下OK儲存
Step 5. NetBeans專案右鍵Generate JavaDoc..
如果沒有出錯~ 完成後跳出瀏覽器直接link..就含有圖的javadoc了
之後就可以去NetBeans專案下找javadoc打包帶走^_^b~
2012年6月6日 星期三
Axis client for .Net web service
這次真是太雖小了Orz..居然用到貌似有bug的前期版本~
問題是~~
SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
發生的原因應該是在client invoke預設axis他去check 參數傳遞時~ 對於不需要傳參數的判斷會有問題..(明明就是不用~ 但他堅持一定要讀一個來用Orz)
不過因為OOXX機車的原因..所以也不能換lib..
網路上大家好像也沒特別講這個問題要怎麼解...
終於試到一個invoke的方式可以繞過那一段了T_T..要是繞不過去~就要硬刻一個http request了Orz..簡單的說就是用Message來發..這樣子他就不會去check參數了~ 還可以刻一個美美的xml不會有ns:前綴..
使用method如下~
Call client = new Call(url);
client.setUseSOAPAction(true);
String uri = namespace;
if(uri.endsWith("/")) {
uri += op;
} else {
uri += "/"+op;
}
client.setSOAPActionURI(uri);
if(timeout > 0) {
client.setTimeout(timeout);
}
client.setOperationName(new QName(namespace,op));
String xml ="";
xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
xml += "<soap:Body>";
if(params == null || params.size() == 0) {
xml += "<"+op+" xmlns=\""+namespace+"\" />";
} else {
xml += "<"+op+" xmlns=\""+namespace+"\" >";
for(int i = 0 ; i < params.size() ; i++) {
String[] pair = params.get(i);
xml +="<"+pair[0]+">"+pair[1]+"</"+pair[0]+">";
}
xml += "</"+op+">";
}
xml += "</soap:Body>";
xml += "</soap:Envelope>";
Message msg = new Message(xml);
SOAPEnvelope res = client.invoke(msg);
若是使用RPCElement(之前的寫法)~ 則只能處理有帶參數的~節錄如下當參考
在axis裡~好像前綴是拿不掉的(不過至少.net那邊的web service看得懂就好..)~axis2可以偷做手腳拿掉就是..
Call client = new Call(url);
client.setUseSOAPAction(true);
String uri = namespace;
if(uri.endsWith("/")) {
uri += op;
} else {
uri += "/"+op;
}
client.setSOAPActionURI(uri);
if(timeout > 0) {
client.setTimeout(timeout);
}
RPCElement req = new RPCElement(op);
req.setNamespaceURI(namespace);
req.setAttribute("xmlns", namespace);
for(int i = 0 ; i < params.size() ; i++) {
String[] input = params.get(i);
if(input.length == 2 && input[0] != null && input[0].length() > 0) {
RPCElement ele = new RPCElement(input[0]);
if(input[1] != null) {
ele.addTextNode(input[1]);
}
req.addChildElement(ele);
}
}
re = (String)client.invoke( req );
問題是~~
SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
發生的原因應該是在client invoke預設axis他去check 參數傳遞時~ 對於不需要傳參數的判斷會有問題..(明明就是不用~ 但他堅持一定要讀一個來用Orz)
不過因為OOXX機車的原因..所以也不能換lib..
網路上大家好像也沒特別講這個問題要怎麼解...
終於試到一個invoke的方式可以繞過那一段了T_T..要是繞不過去~就要硬刻一個http request了Orz..簡單的說就是用Message來發..這樣子他就不會去check參數了~ 還可以刻一個美美的xml不會有ns:前綴..
使用method如下~
Call client = new Call(url);
client.setUseSOAPAction(true);
String uri = namespace;
if(uri.endsWith("/")) {
uri += op;
} else {
uri += "/"+op;
}
client.setSOAPActionURI(uri);
if(timeout > 0) {
client.setTimeout(timeout);
}
client.setOperationName(new QName(namespace,op));
String xml ="";
xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
xml += "<soap:Body>";
if(params == null || params.size() == 0) {
xml += "<"+op+" xmlns=\""+namespace+"\" />";
} else {
xml += "<"+op+" xmlns=\""+namespace+"\" >";
for(int i = 0 ; i < params.size() ; i++) {
String[] pair = params.get(i);
xml +="<"+pair[0]+">"+pair[1]+"</"+pair[0]+">";
}
xml += "</"+op+">";
}
xml += "</soap:Body>";
xml += "</soap:Envelope>";
Message msg = new Message(xml);
SOAPEnvelope res = client.invoke(msg);
若是使用RPCElement(之前的寫法)~ 則只能處理有帶參數的~節錄如下當參考
在axis裡~好像前綴是拿不掉的(不過至少.net那邊的web service看得懂就好..)~axis2可以偷做手腳拿掉就是..
Call client = new Call(url);
client.setUseSOAPAction(true);
String uri = namespace;
if(uri.endsWith("/")) {
uri += op;
} else {
uri += "/"+op;
}
client.setSOAPActionURI(uri);
if(timeout > 0) {
client.setTimeout(timeout);
}
RPCElement req = new RPCElement(op);
req.setNamespaceURI(namespace);
req.setAttribute("xmlns", namespace);
for(int i = 0 ; i < params.size() ; i++) {
String[] input = params.get(i);
if(input.length == 2 && input[0] != null && input[0].length() > 0) {
RPCElement ele = new RPCElement(input[0]);
if(input[1] != null) {
ele.addTextNode(input[1]);
}
req.addChildElement(ele);
}
}
re = (String)client.invoke( req );
2012年6月5日 星期二
unicode to string..\\u
本來看到unicode(\u)字也沒啥好怕的~ 不過突然發現有人做了一件奇怪的事情~ 為了讓網頁json上可以看到unicode的原型..他就把他寫成了\\u的碗糕|||Orz..
想說怎麼讀他的資料一直都是出\uxxxx真是超頭痛的..只好手動做了String parse..
//str is origin string (\\uXXXX\\uXXXX)
String str = (String)mpRow.get(converts[a]);
if(str != null && str.trim().length() > 0 ) {
String un = str.trim();
StringBuffer sb = new StringBuffer();
int idx = un.indexOf("\\u");
while(idx >=0 ) {
if(idx > 0) {
sb.append(un.substring(0, idx));
}
String hex = un.substring(idx+2, idx+2+4);
sb.append( (char)Integer.parseInt(hex, 16) );
un = un.substring(idx+2+4);
idx = un.indexOf("\\u");
}
sb.append(un);
//convert result of the str
String uf8=sb.toString();
}
想說怎麼讀他的資料一直都是出\uxxxx真是超頭痛的..只好手動做了String parse..
//str is origin string (\\uXXXX\\uXXXX)
String str = (String)mpRow.get(converts[a]);
if(str != null && str.trim().length() > 0 ) {
String un = str.trim();
StringBuffer sb = new StringBuffer();
int idx = un.indexOf("\\u");
while(idx >=0 ) {
if(idx > 0) {
sb.append(un.substring(0, idx));
}
String hex = un.substring(idx+2, idx+2+4);
sb.append( (char)Integer.parseInt(hex, 16) );
un = un.substring(idx+2+4);
idx = un.indexOf("\\u");
}
sb.append(un);
//convert result of the str
String uf8=sb.toString();
}
訂閱:
文章 (Atom)