有了上一篇的基础,在学习下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. 演示效果:
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
分享到:
相关推荐
skype群聊机器人自动发送消息报警先建一个聊天群,把标题改为 报警小精灵 程序启动之后会启动一个9999的端口,然后就可以向这个端口发送消息.群里就会刷新出来.注意因为skype有限制,尽量每分钟不要超过300条.
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版...
【Skype应答机器人】是一种基于Skype平台的自动化程序,它能够接收并回应用户的语音通话,同时还能播放预设的语音文件。这种技术在客服、教育、家庭自动化等多个领域有着广泛的应用前景,使得人与机器之间的交互变得...
Skype 4.0的Java版的示例源码,在Eclipse环境下开发,压缩包内的两个文件夹均是Eclipse的Java项目,分别导入这两个工程就可以了。值得注意的是,如何运行AP2APTest请查看包内的Skype4Java开发指南.doc文档。
用 Java 编写的有趣的小 Skype 机器人。 Sky[pe]Net 将很快接管 :O 安装 克隆 repo,然后运行 mvn clean install。 由于新的 Skype API 限制,SkypeNet 目前使用虚拟键盘来发送消息。 因此,您需要始终打开一个 ...
概述示例向您介绍使用Microsoft提供的各种服务开发的Skype机器人的功能。 每个示例都有一个链接,可以将该机器人添加为Skype联系人,这样您就可以在深入研究代码之前体验该机器人的功能。 准备好将机器人提交到Skype...
【标题】: "基于Java的Skype 4.0 Java版源码及开发文档" 【描述】: 这个压缩包包含的是Skype 4.0的Java版本源代码和相应的开发文档,这对于深入理解Skype的内部工作原理以及Java在即时通讯(IM)软件开发中的应用...
2. **版本兼容性**: Skype的更新可能导致API的变化,开发者需关注Skype4Java的版本更新,确保与最新版Skype兼容。 3. **性能与稳定性**: 长时间运行的应用程序需要注意资源管理和异常处理,以保证系统的稳定性和...
在“基于java的Skype 4.0 Java版源码及开发文档.zip”中,我们有机会深入探究Skype的Java实现,这对于理解网络通信、GUI设计以及Java编程实践具有极高的价值。 Skype是一款知名的即时通讯软件,它支持语音、视频...
《深入剖析Skype 4.0 Java版:源码与开发文档解读》 Skype,作为全球知名的即时通讯软件,以其高清音视频通话、文件分享等功能深受用户喜爱。而Skype 4.0 Java版的源码公开,为开发者提供了一个难得的学习和研究...
Java Skype 源码及文档,在Eclipse环境下开发,压缩包内的两个文件夹均是Eclipse的Java项目,分别导入这两个工程就可以了。值得注意的是,如何运行AP2APTest请查看包内的Skype4Java开发指南.doc文档。 Skype提供了...
"RW-Bot:使用Skype4J制作的Skype机器人" 这个标题揭示了我们要讨论的是一个名为"RW-Bot"的项目,该项目是基于Java编程语言构建的,目的是创建一个能够与Skype用户交互的自动化机器人。Skype4J是一个Java库,它为...
《深入剖析Java技术:以Skype 4.0 Java版源码为例》 在软件开发领域,源码分析是提升编程技能、理解复杂系统运作机制的重要途径。本篇将聚焦于"基于Java的实例源码-Skype 4.0 Java版源码及开发文档.zip",带领读者...
《深入剖析Skype 4.0 Java版源码与开发文档》 Skype,作为一款全球知名的即时通讯软件,以其高清语音、视频通话功能而深受用户喜爱。在技术层面上,Skype 4.0 Java版的源码揭示了其在移动平台上的实现原理和设计...
skype JAVA版本,支持多国语言(包含英、法、德、西班牙、葡萄牙等)
JAVA源码Skype4.0Java版源码及开发文档
【Java源码分析:Skype 4.0 Java版】 Skype是一款著名的即时通讯软件,以其高质量的语音和视频通话闻名。Skype 4.0的Java版本为开发者提供了深入理解其内部工作原理的机会,同时也为Java开发者提供了一个学习和研究...