轉載自:http://www.myexception.cn/program/1930025.htmlhtml
Java調用 新浪微博API 接口發微博,逐條講解,絕對清晰
最近要作個課程設計,使用微博控制樹莓派,樹莓派再控制發光二極管的亮和滅,主要設計分兩層,上層是用Java調用新浪微博API來實現對微博旳監聽,當個人微博被回覆時可以自動讀取評論內容,並根據評論的指令內容來決定樹莓派的控制動做。下層是用C語言調用操做系統底層接口來實現用樹莓派GPIO接口控制發光二極管的閃爍、亮滅。
因爲網上教程都很老了,最近微博接口發生了不少變化,因此我決定全新寫一篇詳細的博文,如若能對您起到幫助做用,那將是我莫大的榮幸。同時我很是但願能與您交流,有問題請在評論裏回覆我。
本文將終點講解怎麼樣申請微博接口,一步步用Java發佈本身的微博。【首先你要有微博帳號】
1、申請成爲開發者
http://open.weibo.com/到這裏申請。點擊「個人應用」就能看到 身份認證:未認證,本身把該作的作了,這裏不詳細講。審覈很快的,不到一天就經過。
以後應該是這樣的(哈哈,歡迎互粉哈):java
2、建立應用
這裏網上的教程存在誤導性,我按照那些教程來,結果把我拖到了坑裏,我已經爬出來了,但願大家不要再掉進去。
若是想用Java來控制微博,那麼在建立應用時就不能建立「站內應用」,要建立「移動應用」,注意這一點,否則到了權限驗證那一步會通不過的。
「微鏈接」——「移動應用」——「當即接入」——「繼續建立」
如今咱們來到了填寫信息的地方,本身隨便寫個應用名字(這名字後期改的話會很麻煩,請一次性填好),例如「手機控制樹莓派」,客戶端就選「手機」,應用平臺選Android就好了,其實無影響。而後「建立」。好了如今又進入了一個新的界面,咱們只是用來測試,因此不用審覈,除非你想讓你的應用上線。
3、重要信息設置與記錄
這步很重要,直接關係到之後能不能正確接入。
左側面板:「應用信息」——「高級信息」
看到「OAuth2.0 受權設置」,點擊「編輯」。「受權回調頁:」和「取消受權回調頁:」很重要,那些建立了「站內應用」的到這裏應該哭了,由於他們沒法修改「受權回調頁:」。。。
那麼怎麼改呢?兩個都改爲:https://api.weibo.com/oauth2/default.html,這是微博默認的,咱們測試夠用了。
如圖:node
再點擊「基本信息」,
如圖:git
記下:APP Key和App Secret,後面有用。
4、下載微博Java SDK
來這裏https://github.com/sunxiaowei2014/weibo4j-oauth2-beta3.1.1/github
下載zip壓縮包:weibo4j-oauth2-beta3.1.1.zipapi
5、將SDK導入Eclipse
什麼?你一直用文本編輯器寫Java?好吧,聽我一句勸,寫這玩意兒時仍是換成Eclipse吧,否則會累死的。
打開Eclipse,「File」——「Import」——「General下面Existing Projects into Workspace」——「Select archive File」——選擇剛纔的SDK壓縮包——「Finish」。
至此導入完成。
數組
6、修改配置信息瀏覽器
打開圖中這個config.properties文件,把「client_ID」和「client_SERCRET」後面的值分別改成你記下的「App Key」和「App Secret」。「redirect_URI」的值改成https://api.weibo.com/oauth2/default.html
保存。
7、應用受權
如圖:dom
編譯執行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文件,加入一行,
至於怎麼查看主機名,在報錯信息裏應該有,好比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 }