1. 程式人生 > >微博API開發

微博API開發

嘗試 講解 3.1 記錄 val 變化 哈哈 取消 應用

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

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


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

技術分享

二、創建應用
這裏網上的教程存在誤導性,我按照那些教程來,結果把我拖到了坑裏,我已經爬出來了,希望你們不要再掉進去。
如果想用Java來控制微博,那麽在創建應用時就不能創建“站內應用”,要創建“移動應用”,註意這一點,不然到了權限驗證那一步會通不過的。
“微連接”——“移動應用”——“立即接入”——“繼續創建”
現在我們來到了填寫信息的地方,自己隨便寫個應用名字(這名字後期改的話會很麻煩,請一次性填好),例如“手機控制樹莓派”,客戶端就選“手機”,應用平臺選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"後面的數字很重要,記下來。
現在你可以關閉瀏覽器了。
這裏提醒下,如果當初創建應用是“站內應用”而不是“移動應用”的話,那麽這一步不會成功,你看到的永遠是“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位的補0
100                 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開發