【原创】手机通过微博远程控制电脑
现在微博用户越来越多啦,今天晚上看了一下新浪微博的开放API,写了一个小程序玩玩,主要是想通过手机发微博信息,反正现在大家都有流量包月,然后电脑的程序不断的获取微博列表,然后根据微博的内容进行相应的操作。如果俺的的手机是智能机,就直接写个客户端了。
要想获取微博的内容,就需要先登录。身份认证一般就分为两种1、传统的用户名密码方式,2、使用开放授权OAuth 模式。
用户名密码的方式是比较简单的,但是缺点也显而易见,就是需要告诉第三方应用程序你的用户名和密码。这样安全性就降低了。因此OAuth 认证方式应运而生。
OAuth 就相对安全多了,第三方应用程序不会获得你的用户名和密码信息,只需你对其进行授权,授权通过返后回给第三方App一个标识(token),app拿到这个token以后会到服务商那里换取一个Access Token (访问标识),这个其实就是相当于我们用户名和密码(但是不是),在以后的操作过程中,遇到需要身份认证的地方,App 就通过这个Access Token 进行身份认证。记得以前安装人人网的第三方应用的时候会有个授权的过程,现在明白了,原来是OAuth 方式获得我个人信息的授权。
下面的代码只是实现了简单的内容,基于新浪微博JAVA SDK。
/** * 通过新浪微博信息对电脑进行相关的操作(关机,重启,打开部分应用程序如QQ,音乐播放软件等) * @author mayonghua * */public class ComputerOperation implements Runnable{private String[] userInfo = {"username","password"};private String dateString = "";public String start() throws Exception{//设置应用的ID和对该ID的签名,每个应用都有个唯一的Id,该ID和签名会在应用程序注册的时候由新浪的认证中心自动生成System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY); System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET);//登录成功会返回该用户的相关信息User user = getWeibo(false,userInfo).verifyCredentials();//获得该用户最新发表的微博Status status = getWeiboStatus(user);System.out.println(status.getText());if(status==null){System.out.println("没有微博信息,请先发布微博……");return "";}//从本地文件读取最后一条微博的发布时间String createTime = readWeiboCreateTime();//如果createTime和刚刚获得的最新微博的时间不相等,就说明该微博是最新发布的,不是以前的,所以可以进行相关的操作if(dateComparison(createTime,status.getCreatedAt())){//首先将该微博的发布时间更新到本地文件saveWeiboCreateTime(status);//执行相关的操作execWeiboTask(status);}else {System.out.println("正在巡视,没有发现新指令…………");}return "";}/** * 判断两个日期大小 * @param oldDate * @param newDate * @return */public boolean dateComparison(String oldDate,Date newDate){System.out.println("系统正在比较两个日期大小");boolean flag = false;//如果为空说明是程序初始化if(oldDate==""){return true;}SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");String date = sdf.format(newDate);if(Double.parseDouble(oldDate)<Double.parseDouble(date)){flag = true;}return flag;}/** * 执行相应的微博任务 * @param status * @return */public String execWeiboTask(Status status) throws Exception{String stat= status.getText();System.out.println("发现新指令,正在进行执行初始化");if("关机".equals(stat)){System.out.println("系统正在进行【"+stat+"】任务");ComputerUtils.shutdown();}else if("重启".equals(stat)){System.out.println("系统正在进行【"+stat+"】任务");ComputerUtils.restart();}else if("上QQ".equals(stat)){System.out.println("系统正在进行【"+stat+"】任务");ComputerUtils.startApp(ComputerUtils.QQ);}else if("听音乐".equals(stat)){System.out.println("系统正在进行【"+stat+"】任务");ComputerUtils.startApp(ComputerUtils.TTPLAYER);}else if("关闭QQ".equals(stat)){System.out.println("系统正在进行【"+stat+"】任务");ComputerUtils.stopApp(ComputerUtils.killQQ);}else {System.out.println("错误指令,不进行任何操作……");}return "";}/** * 从本地读取最近一条微博的创建时间 * @return */public String readWeiboCreateTime() throws Exception{System.out.println("正在读取本地文件……");//读取本地保存的最新一条微博信息的发表时间File file = new File("c:/weibo.txt");if(!file.exists()){file.createNewFile();}BufferedReader br = new BufferedReader(new FileReader(file));dateString = br.readLine();return dateString == null ? "" : dateString;}/** * 将新的微博信息发布的时间更新到本地文件 */public void saveWeiboCreateTime(Status status) throws Exception{File file = new File("c:/weibo.txt");BufferedWriter bw = new BufferedWriter(new FileWriter(file));SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");String date = sdf.format(status.getCreatedAt());bw.write(date, 0,date.length());bw.close();System.out.println("正在更新本地文件……");}/** * 获得用户的微博列表 * @param user * @return * @throws Exception */public Status getWeiboStatus(User user) throws Exception{// 返回用户的微博列表,Paging的两个参数为:第几页,每次取几条数据List<Status> statuses = getWeibo(false,userInfo).getUserTimeline(user.getId()+"",new Paging(1,1));//返回的微博信息列表是按照发布时间正序排列,所以第0条既是最新发布的if(statuses!=null&&statuses.size()>0){return statuses.get(0);}else {return null;}}/** * 登录微博 * @param isOauth * @param args * @return */private Weibo getWeibo(boolean isOauth,String[] args) {Weibo weibo = new Weibo();if(isOauth) {//oauth验证方式 args[0]:访问的token;args[1]:访问的密匙weibo.setToken(args[0],args[1]);}else {//用户登录方式 weibo.setUserId(args[0]);//用户名/ID weibo.setPassword(args[1]);//密码}return weibo;}public void run(){try {while(true){start();//每隔一分钟请求一次Thread.sleep(60*1000);}} catch (Exception e) {e.printStackTrace();}}}/** * 和电脑相关的操作 * @author mayonghua * */public class ComputerUtils {public static final String QQ = "D:\\Program Files\\QQ\\Bin\\QQ.exe";public static final String TTPLAYER = "";public static final String killQQ = "taskkill /im QQ.exe /f";//关机public static void shutdown() throws Exception{//Runtime.getRuntime().exec("cmd /c Shutdown -s -t 300");}//重启public static void restart() throws Exception{//Runtime.getRuntime().exec("cmd /c Shutdown -r -t 300");}//打开相应的应用程序public static void startApp(String path) throws Exception{//根据路径打开应用程序Runtime.getRuntime().exec(path);}//关闭相应的应用程序public static void stopApp(String processId) throws Exception{//根据进程Id 结束进程Runtime.getRuntime().exec(processId);}测试代码
/** * * @author mayonghua * */public class Test {/** * @param args */public static void main(String[] args) {ComputerOperation co = new ComputerOperation(); co.run();}}ps: 为什么googlecode不让我创建新项目了呢
You have performed the requested action too many times in a 24-hour time period. Or, you have performed the requested action too many times since the creation of your account.