`

Skype字典机器人(Java版)

阅读更多

有了上一篇的基础,在学习下skype的api, 就可以实现skype字典机器人功能了:-)

 

1. 下载skype java 开发包

http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/skype.tar.gz?view=tar

 

2. 将tar包里release文件夹下的jar加入到build path

 

3. 将上一篇(读取StarDict里的字典文件)用到的jar也加到build path, 同时注意配置好config.properties

 

4. 使用。

用了3个类来实现,

StarDict    根据输入的单词返回翻译结果 

WitRobot   与skype交互的类,监听输入消息,返回结果

Start        开启一个后台线程监听skype消息

 

 

 

package com.msino.dict;

import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.msino.dict.StarDictReader;
import com.msino.dict.manager.DictsManager;
import com.msino.dict.service.IDictsManager;
import com.msino.dict.service.core.Word;

/**
 * Get word info by word name
 * 
 * @author XuDong.Su
 * @version 0.1, Apr 10, 2009
 * @see com.msino.dict.StarDictReader
 */
public class StarDict {
	public static final Logger LOGGER = Logger.getLogger(StarDict.class.getName());
	
	private StarDictReader instance;
    private IDictsManager dictsManager = new DictsManager();
    private String dictsProp = dictsManager.getDictProps();

    private String dictFileDir = "";
	private String dictName = "";
	
	private HashMap<String, String> wordMap = new HashMap<String, String>();	
	
    /**
     * Default constructor.
     */
    public StarDict() {
    	// Get dictionary file directory and name
    	dictFileDir = dictsProp.substring(0, dictsProp.indexOf("||"));
    	dictName = dictsProp.substring(dictsProp.indexOf("||") + 2, dictsProp.length());
    			
        try {
            instance =  new StarDictReader(dictFileDir, dictName);
        } catch (FileNotFoundException ex) {
        	LOGGER.log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Lookup method, of class DictEngine.
     * @throws java.lang.InterruptedException Thread.sleep(long)
     */
    public String lookup(String wordName) throws InterruptedException {
    	String result = dictMap(wordName);
    	
    	// if the word exists in map, no need to research
    	if (!"".equals(result) && result != null) {
    		return result;
    	}
    	
    	try {
            Word word = null;

            long start = System.currentTimeMillis();
                        
            word = instance.lookup(wordName);
            result = word.self + ": " + word.definition;
            
            // Add word info into map
            wordMap.put(wordName, result);
            
            // For reduce memory
            if (wordMap.size() >= 5000) {
            	wordMap.clear();
            }
                       
            long end = System.currentTimeMillis();
            
            LOGGER.log(Level.INFO, word.self + ": " + word.definition);
            LOGGER.log(Level.INFO, "Space Time: " + (end - start) + "ms");
            LOGGER.log(Level.INFO, "word map size : " + wordMap.size());
            
        } catch (Exception ex) {
        	result = ex.getMessage();
        	LOGGER.log(Level.INFO, ex.getMessage());
        }
        
        return result;
    }
    
    /**
     * A cache of store has searched word
     * @param key
     * @return value
     */
    private String dictMap(String key) {
    	String value = (String) wordMap.get(key);
    	return value;
    }
}

 

package com.msino.skype;

import java.util.logging.Level;
import java.util.logging.Logger;

import com.skype.ChatMessage;
import com.skype.ChatMessageAdapter;
import com.skype.Skype;
import com.skype.SkypeException;

import com.msino.dict.StarDict;

/**
 * Skype robot, start chat
 * 
 * @author XuDong.Su
 * @version 0.1, Apr 10, 2009
 */
public class WitRobot {
	public static final String FY = "/fy ";
	public static final String ERROR = "Sorry, you input command is not support yet, please use \"help\" or ? for more information!";
	public static final String HELP = "You can use blow command : \r\n1. Translate a word \r\n   /fy wordName \r\n2. Get help \r\n   ? or help";
	public static final String HELPCMD1 = "?";
	public static final String HELPCMD2 = "help";
	public static final String NOTFOUND = "Sorry, Not found the word.";
	
	public static final Logger LOGGER = Logger.getLogger(WitRobot.class.getName());
	
	private StarDict dict = null;
	
	public WitRobot() {
		// Initial class stardict
		dict = new StarDict();
	}
	
    public void startChat() throws Exception {
        Skype.addChatMessageListener(new ChatMessageAdapter() {
	        @Override	        
	        public void chatMessageReceived(ChatMessage receivedChatMessage) throws SkypeException {
	        	String content = "";
	        	String replyMsg = "";
	        	
	        	// Get input content
	        	content = receivedChatMessage.getContent().trim();
	            
	            if (!"".equals(content) && receivedChatMessage.getType().equals(ChatMessage.Type.SAID)) {
	            	// Get the word mean
	            	if(content.length() > 3 && FY.equals(content.substring(0, 4))) {
	            		content = content.substring(4, content.length());
	            		replyMsg = autoReplyMsg(content);
	            	} else if(HELPCMD1.equals(content) || HELPCMD2.equals(content)) {
	            		replyMsg = HELP;
	            	} else {
	            		replyMsg = ERROR;
	            	}
	            	
	            	if("".equals(replyMsg)) {
	            		replyMsg = NOTFOUND;
	            	}
	            	
	            	// reply the word's translate result
	            	receivedChatMessage.getSender().send(replyMsg);
	            	
	            }
	        }
	    });
	 }
     
    private String autoReplyMsg(String wordName) {
    	String replyMsg = "";
    	
		try {
			// Lookup word info by word name
			replyMsg = dict.lookup(wordName);
		} catch (InterruptedException e) {
			replyMsg = e.getMessage();
			LOGGER.log(Level.INFO, e.getMessage());
		}    	
		
    	return replyMsg;
    }
}

 

package com.msino.test;

import java.util.logging.Level;
import java.util.logging.Logger;

import com.msino.skype.WitRobot;

/**
 * Test class, start a thread to listen message 
 * 
 * @author XuDong.Su
 * @version 0.1, Apr 10, 2009
 */
public class Start extends Thread {
	public static final Logger LOGGER = Logger.getLogger(Start.class.getName());
	
	public Start() {
		setDaemon(true);
		super.start();
	}

	public void run() {
		// do nothing
	}

	public void noStop() {
		try {
			Thread t = new Thread();
			synchronized (t) {
				t.wait();
			}
		} catch (InterruptedException e) {
			LOGGER.log(Level.SEVERE, null, "Wait thread error!" + e);
		}
	}

	public static void main(String[] args) throws Exception {
		
        long freeMemory = Runtime.getRuntime().freeMemory() / 1024;
        LOGGER.log(Level.INFO, "Before Free memory : " + freeMemory);
                
		Start s = new Start();
		WitRobot chat = new WitRobot();
		
		// Start chat
		chat.startChat();
		
		freeMemory = Runtime.getRuntime().freeMemory() / 1024;
		LOGGER.log(Level.INFO, "After Free memory : " + freeMemory);

		s.noStop();
	}
}

 

 

5. 运行Start类, 然后尝试向本机的skype发送消息. 如果你启动中碰到下面的错误,请将release文件夹下的swt-win32-3232.dll放到你的jave/jre/bin目录下

 

java.lang.UnsatisfiedLinkError: no swt-win32-3232 in java.library.path

.....

 

6. 演示效果:

skypedict

 

7. 疑问:

以前用openfire可以整个google talk server, 因为gtalk基于japper协议. 但skype不基于这个协议,我现在实现的方式是在本地开启一个后台线程监听skype消息, 但不知如何部署在server上,哪位大虾知道的,还请指导下,非常感谢 :-)

 

If you have any query, please feel free to contact me -- m.msino##gmail.com

 

 

 

 

 

  • 大小: 28.8 KB
0
0
分享到:
评论
1 楼 msino 2009-04-11  
本人初学程序开发,大虾们看到代码哪有不爽的地方帮我指正出来,非常感谢 !!

相关推荐

    skype群聊机器人自动发送消息报警

    skype群聊机器人自动发送消息报警先建一个聊天群,把标题改为 报警小精灵 程序启动之后会启动一个9999的端口,然后就可以向这个端口发送消息.群里就会刷新出来.注意因为skype有限制,尽量每分钟不要超过300条.

    Skype4Java java语音聊天 语音即时通讯

    Skype4Java是Skype的Java版SDK,它提供了丰富的接口和类,使得Java开发者能够轻松地在应用程序中集成Skype的功能,如发起和接收语音通话、文字聊天、文件传输等。通过这个API,开发者可以创建定制化的Skype客户端,...

    基于java的开发源码-Skype 4.0 Java版源码及开发文档.zip

    基于java的开发源码-Skype 4.0 Java版源码及开发文档.zip 基于java的开发源码-Skype 4.0 Java版源码及开发文档.zip 基于java的开发源码-Skype 4.0 Java版源码及开发文档.zip 基于java的开发源码-Skype 4.0 Java版...

    skype 应答机器人

    【Skype应答机器人】是一种基于Skype平台的自动化程序,它能够接收并回应用户的语音通话,同时还能播放预设的语音文件。这种技术在客服、教育、家庭自动化等多个领域有着广泛的应用前景,使得人与机器之间的交互变得...

    Skype 4.0 Java版源码及开发文档

    Skype 4.0的Java版的示例源码,在Eclipse环境下开发,压缩包内的两个文件夹均是Eclipse的Java项目,分别导入这两个工程就可以了。值得注意的是,如何运行AP2APTest请查看包内的Skype4Java开发指南.doc文档。

    SkypeNet:用 Java 编写的有趣的小 Skype 机器人

    用 Java 编写的有趣的小 Skype 机器人。 Sky[pe]Net 将很快接管 :O 安装 克隆 repo,然后运行 ​​mvn clean install。 由于新的 Skype API 限制,SkypeNet 目前使用虚拟键盘来发送消息。 因此,您需要始终打开一个 ...

    skype-dev-bots:Skype机器人通过聊天,语音或视频进行娱乐,支持或商业化,在Skype中通过个人对话与用户进行交互。 Skype开发人员平台团队的任务是协助开发人员使用Microsoft Bot Framework构建具有高度吸引力的Skype机器人。 要了解更多信息,请访问https

    概述示例向您介绍使用Microsoft提供的各种服务开发的Skype机器人的功能。 每个示例都有一个链接,可以将该机器人添加为Skype联系人,这样您就可以在深入研究代码之前体验该机器人的功能。 准备好将机器人提交到Skype...

    基于Java的Skype 4.0 Java版源码及开发文档.zip

    【标题】: "基于Java的Skype 4.0 Java版源码及开发文档" 【描述】: 这个压缩包包含的是Skype 4.0的Java版本源代码和相应的开发文档,这对于深入理解Skype的内部工作原理以及Java在即时通讯(IM)软件开发中的应用...

    Skype4Java开发文档以及示例代码

    2. **版本兼容性**: Skype的更新可能导致API的变化,开发者需关注Skype4Java的版本更新,确保与最新版Skype兼容。 3. **性能与稳定性**: 长时间运行的应用程序需要注意资源管理和异常处理,以保证系统的稳定性和...

    基于java的Skype 4.0 Java版源码及开发文档.zip

    在“基于java的Skype 4.0 Java版源码及开发文档.zip”中,我们有机会深入探究Skype的Java实现,这对于理解网络通信、GUI设计以及Java编程实践具有极高的价值。 Skype是一款知名的即时通讯软件,它支持语音、视频...

    Skype 4.0 Java版源码及开发文档.zip

    《深入剖析Skype 4.0 Java版:源码与开发文档解读》 Skype,作为全球知名的即时通讯软件,以其高清音视频通话、文件分享等功能深受用户喜爱。而Skype 4.0 Java版的源码公开,为开发者提供了一个难得的学习和研究...

    Java Skype 源码及文档.rar

    Java Skype 源码及文档,在Eclipse环境下开发,压缩包内的两个文件夹均是Eclipse的Java项目,分别导入这两个工程就可以了。值得注意的是,如何运行AP2APTest请查看包内的Skype4Java开发指南.doc文档。  Skype提供了...

    RW-Bot:使用Skype4J制作的Skype机器人

    "RW-Bot:使用Skype4J制作的Skype机器人" 这个标题揭示了我们要讨论的是一个名为"RW-Bot"的项目,该项目是基于Java编程语言构建的,目的是创建一个能够与Skype用户交互的自动化机器人。Skype4J是一个Java库,它为...

    基于Java的实例源码-Skype 4.0 Java版源码及开发文档.zip

    《深入剖析Java技术:以Skype 4.0 Java版源码为例》 在软件开发领域,源码分析是提升编程技能、理解复杂系统运作机制的重要途径。本篇将聚焦于"基于Java的实例源码-Skype 4.0 Java版源码及开发文档.zip",带领读者...

    Skype 4.0 Java版源码及开发文档.7z

    《深入剖析Skype 4.0 Java版源码与开发文档》 Skype,作为一款全球知名的即时通讯软件,以其高清语音、视频通话功能而深受用户喜爱。在技术层面上,Skype 4.0 Java版的源码揭示了其在移动平台上的实现原理和设计...

    JAVA版skype(多国语言)

    skype JAVA版本,支持多国语言(包含英、法、德、西班牙、葡萄牙等)

    JAVA源码Skype4.0Java版源码及开发文档

    JAVA源码Skype4.0Java版源码及开发文档

    java源码:Skype 4.0 Java版源码及开发文档.rar

    【Java源码分析:Skype 4.0 Java版】 Skype是一款著名的即时通讯软件,以其高质量的语音和视频通话闻名。Skype 4.0的Java版本为开发者提供了深入理解其内部工作原理的机会,同时也为Java开发者提供了一个学习和研究...

Global site tag (gtag.js) - Google Analytics