微博API開發

來源:互聯網
上載者:User

標籤:one   add   例子程式   boa   error   host檔案   帳號   進入   2.0   

轉載自:http://www.myexception.cn/program/1930025.html

Java調用 新浪微博API 介面發微博,逐條講解,絕對清晰


最近要做個課程設計,使用微博控制樹莓派,樹莓派再控制發光二極體的亮和滅,主要設計分兩層,上層是用Java調用新浪微博API來實現對微博旳監聽,當我的微博被回複時能夠自動讀取評論內容,並根據評論的指令內容來決定樹莓派的控制動作。下層是用C語言叫用作業系統底層介面來實現用樹莓派GPIO介面控制發光二極體的閃爍、亮滅。
由於網上教程都很老了,最近微博介面發生了很多變化,所以我決定全新寫一篇詳細的博文,如若能對您起到協助作用,那將是我莫大的榮幸。同時我非常希望能與您交流,有問題請在評論裡回複我。
本文將終點講解怎麼樣申請微博介面,一步步用Java發布自己的微博。【首先你要有微博帳號】
?
一、申請成為開發人員
http://open.weibo.com/到這裡申請。點擊“我的應用程式”就能看到 身份認證:未認證,自己把該做的做了,這裡不詳細講。審核很快的,不到一天就通過。
之後應該是這樣的(哈哈,歡迎互粉哈):

二、建立應用
這裡網上的教程存在誤導性,我按照那些教程來,結果把我拖到了坑裡,我已經爬出來了,希望你們不要再掉進去。
如果想用Java來控制微博,那麼在建立應用時就不能建立“站內應用”,要建立“行動裝置 App”,注意這一點,不然到了許可權驗證那一步會通不過的。
“微串連”——“行動裝置 App”——“立即接入”——“繼續建立”
現在我們來到了填寫資訊的地方,自己隨便寫個應用程式名稱字(這名字後期改的話會很麻煩,請一次性填好),例如“手機控制樹莓派”,用戶端就選“手機”,應用平台選Android就行了,其實無影響。然後“建立”。好了現在又進入了一個新的介面,我們只是用來測試,所以不用審核,除非你想讓你的應用上線。


三、重要訊息設定與記錄
這步很重要,直接關係到以後能不能正確接入。
左側面板:“應用資訊”——“進階資訊”
看到“OAuth2.0 授權設定”,點擊“編輯”。“授權回調頁:”和“取消授權回調頁:”很重要,那些建立了“站內應用”的到這裡應該哭了,因為他們無法修改“授權回調頁:”。。。
那麼怎麼改呢?兩個都改成:https://api.weibo.com/oauth2/default.html,這是微博預設的,我們測試夠用了。

再點擊“基本資料”,

記下:APP Key和App Secret,後面有用。


四、下載微博Java SDK
來這裡https://github.com/sunxiaowei2014/weibo4j-oauth2-beta3.1.1/

下載zip壓縮包:weibo4j-oauth2-beta3.1.1.zip

 

五、將SDK匯入Eclipse
什嗎?你一直用文字編輯器寫Java?好吧,聽我一句勸,寫這玩意兒時還是換成Eclipse吧,不然會累死的。
開啟Eclipse,“File”——“Import”——“General下面Existing Projects into Workspace”——“Select archive File”——選擇剛才的SDK壓縮包——“Finish”。
至此匯入完成。

六、修改配置資訊

開啟圖中這個config.properties檔案,把“client_ID”和“client_SERCRET”後面的值分別改為你記下的“App Key”和“App Secret”。“redirect_URI”的值改為https://api.weibo.com/oauth2/default.html
儲存。


七、應用授權

編譯執行OAuth4Code.java檔案。
你的瀏覽器會被自動調用,開啟一個授權頁面。如:

 

點擊“授權”。

轉到如:

別急著關瀏覽器!請複製地址欄中code=後面的那一串字串。
回到Eclipse,下方Console中正等待你輸入什麼。Hit enter when it‘s done.[Enter]:
沒錯,就是他。粘貼你剛才複製的字串,斷行符號。
好了,等幾秒你的授權資訊就返回了。
AccessToken [accessToken=xxxxxxxxxxxxxxxx, expireIn=157679999, refreshToken=,uid=xxxxxxxxx]
"access_token"後面的一串字元和"uid"後面的數字很重要,記下來。
現在你可以關閉瀏覽器了。
這裡提醒下,如果當初建立應用是“站內應用”而不是“行動裝置 App”的話,那麼這一步不會成功,你看到的永遠是“error:redirect_uri_mismatch”的頁面。


八:發微博
微博SDK包裡面,你看看examples下面有很多程式,這些都是例子,涵蓋了該SDK所能做的任何事,你只需參照著寫。
weibo4j.examples.timeline這個包裡面的UpdateStatus.java是發微博的例子。
我們在src裡面建立一個新的package叫做myweibo,下面沒必要建立這些類,隨意了。

我示範下怎麼發微博。
在myweibo下建立新類SendWeibo.java
將examples——weibo4j.examples.timeline——UpdateStatus.java例子程式中的main方法體整個複製過來,粘貼後Eclipse會自動import需要引用的包。
把String access_token=後面換成你剛才的access_token的值。String statuses=後面是你的微博本文。
改完後就是:

然後運行這個Java代碼就行了,只要不報錯就成功了。去你的微博看看。

注意:如果你不知道一個函數(我還是習慣叫函數,不叫方法)是幹啥的, 不知道它的參數含義,請把游標移動到函數上。

SDK裡面提供的各種函數都很好用,什麼擷取微博,擷取評論,擷取評論ID,回複評論,擷取地理位置,擷取照片,發照片,擷取粉絲關係,擷取朋友圈微博等等,太多了,大家自己慢慢嘗試吧。


九:發布程式:
如果你要把該程式拿到其他地方運行,比如樹莓派Linux或者虛擬機器裡的Linux上,那麼有些地方需要注意。
我們先發布程式:
我們在weibo4j-oauth2這個項目上點右鍵選“Export”,然後

下一步:

哪個程式是入口,Launch configuration就選哪個,這裡我們是執行發微博的程式:SendWeibo。
選好路徑,下面的Library Handing選第二個保險一點。然後Finish,可能會彈出警告,不用管,點OK。
然後就產生了。然後你一雙擊jar包,程式一閃而過,留下了一個weibo.log檔案,這裡面是日誌。萬一出錯可以查看日誌找原因。現在程式被執行了,它又發布了一條微博。
你可以把這檔案拖到虛擬機器的Linux裡,我們見識下Java是如何到處啟動並執行,結果java -jar 1.jar運行後報錯了,怎麼回事呢?
仔細看看錯誤資訊,裡面寫著java.net.UnknownHostException,再看看錯誤資訊裡是不是寫著InetAddress.getLocalHost()這個方法呢,沒錯就是它造成的。
解決方案:
首先ifconfig看看你的IP,這個不在乎是區域網路IP還是外網IP,只要求是你看到的本機IP就行。
修改/etc/hosts這個host檔案,加入一行,

[plain] view plain copy 
  1. 你的ip     你的主機名稱   # KD.localdomain是我的主機名稱  


至於怎麼查看主機名稱,在報錯資訊裡應該有,比如localhost.localdomain之類的。KD.localdomain這個是我自己改的。你也可以查看/etc/hosts來確認你的主機名稱。
這麼修改完以後,再次運行1.jar試試,應該就成功了。我就不了。開虛擬機器挺麻煩的。
PS:發完微博試試就行了,別亂髮,這效果類似於刷屏,會被打的。


新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ這樣三部分.

第一部分(綠色部分)為新浪微博的網域名稱,第二部分(紅色部分)為博主Uid,第三部分(藍色)為一串貌似隨機的字串.

如果通過方法能計算出藍色字串與返回的數組裡的對應關係則好解決多了.

首先分組藍色字串 ,從後往前4個字元一組,得到以下三組字元:
z
8Elg
BLeQ

將它們分別轉換成62進位的數值則為 35, 2061702, 8999724  將它們組合起來就是一串 3520617028999724 類似這樣的字串

通過發現返回的二維數組裡有個 [mid]的欄位,其返回結果為 3520617028999724.剛好是對應的.

http://weibo.com/aj/v6/mblog/info/big?ajwvr=6&id=3919740416635598&page=1

 

  1 package step0;  2   3   4 /**  5  *   6     * @ClassName: Mid2IdUtil Java版  7     * @Description:  新浪uid轉url (id轉mid)  8     * @author zeze  9     * @date 2016年4月10日 上午10:49:40  10     * 11  */ 12 public class Id2MidUtil { 13     public static void main(String[] args) { 14         System.out.println(Uid2Mid("Aw8Wrzaes")); 15         System.out.println(Mid2Uid("3676608718380816"));//Mid2Id 16     } 17     private static String[] str62keys = { "0", "1", "2", "3", "4", "5", "6", 18             "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 19             "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", 20             "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 21             "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", 22             "X", "Y", "Z" }; 23  24     public static String IntToEnode62(Integer int10) { 25         String s62 = ""; 26         int r = 0; 27         while (int10 != 0) { 28             r = int10 % 62; 29             s62 = str62keys[r] + s62; 30             int10 = (int) Math.floor(int10 / 62.0); 31         } 32         return s62; 33     } 34      35      //62進位轉成10進位 36     public static String Str62toInt(String str62) 37     { 38         long i64 = 0; 39         for (int i = 0; i < str62.length(); i++) 40         { 41             long Vi = (long)Math.pow(62, (str62.length() - i - 1)); 42             String t = str62.substring(i,i+1); 43             44             i64 += Vi * findindex(t); 45         } 46        // System.out.println(i64); 47         return Long.toString(i64); 48     } 49      50     public static int findindex(String t) 51     { 52         int index=0; 53         for(int i=0;i<str62keys.length;i++) 54         { 55             if(str62keys[i].equals(t)){ 56                 index=i; 57                 break; 58             } 59         } 60         return index; 61     } 62   63      public static String Uid2Mid(String mid) 64         { 65             String id = ""; 66             for (int i = mid.length() - 4; i > -4; i = i - 4) //從最後往前以4位元組為一組讀取URL字元 67             { 68                 int offset1 = i < 0 ? 0 : i; 69                 int len = i < 0 ? mid.length() % 4 : 4; 70                  71                 String str = mid.substring(offset1, offset1+len); 72                // System.out.println(offset1+" "+len+" "+str); 73                  74                 str = Str62toInt(str); 75                  76                 if (offset1 > 0) //若不是第一組,則不足7位補0 77                 { 78                     while (str.length() < 7) 79                     { 80                         str = "0" + str; 81                     } 82                 } 83                 id = str + id; 84             } 85  86             return id; 87         } 88      89      90     public static String Mid2Uid(String str10) { 91         String mid = ""; 92         int count = 1 ; 93         for (int i = str10.length() - 7; i > -7; i = i - 7) // 從最後往前以7位元組為一組讀取字元 94         { 95             int offset = i < 0 ? 0 : i; 96             int len = i < 0 ? str10.length() % 7 : 7; 97             String temp = str10.substring(offset, offset + len); 98             String url =IntToEnode62(Integer.valueOf(temp)); 99             if(count!=3){//z xghm uXym 產生的連結從右往左的前2組,4位一組,不足4位的補0100                 for(int j=0;j<4-url.length();j++){101                     url = "0"+url;102                 }103             }104             mid = url+mid;                       105                       count++;106                }107         return mid;108     }109 }

 

微博API開發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.