Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
3 Pages V  1 2 3   
Reply to this topicStart new topic
> qq机器人原理, 投骰子的机器人
bx_bob
2010-05-27, 07:18
Post #1


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


出于qq群的群众需要,我编写了一个qq机器人,用于投骰等目的。
现在已经到了第4个主版本。
项目主页:
http://code.google.com/p/qqdicebot/
svn链接:(未稳定,随时更新)
https://qqdicebot.googlecode.com/svn/branches/qqdicebot4_xp
代码基于小虾的myqq,使用GPLv3协议。

向下翻到第3点,直接开始有意思的部分。
开发者注意!最近更新:这里
-------------------------------------------------
待完成的内容:

dnd的骰属性功能
wod骰
各种投骰结果的细节显示

This post has been edited by bx_bob: 2010-09-07, 11:16
TOP
bx_bob
2010-05-27, 20:48
Post #2


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


1.机器人的形式
一开始计划做这个机器人的时候,是想做一个qq的插件,抓取内容然后自动说话什么的。可惜腾讯不断加强qq的抗木马/病毒能力,又不开放任何api。
后来想到可以用一个独立开源的qq客户端(最初想的是gaim(pidgin)),在接受/发送消息函数后插入函数对内容进行分析。经过搜索,找到了小虾的myqq:
http://xiaoxia.org/home/read.do?id=1222
经过测试可以使用后就决定用它了。

这样做的优点是开发容易(原作者用的是gnu c呢……),缺点是需要单独占用一个qq号,而且随着qq更新,不知道哪一天就会用不了。
-------------------------------------------------

This post has been edited by bx_bob: 2010-05-31, 18:51
TOP
bx_bob
2010-05-31, 18:49
Post #3


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


2.机器人的结构
一开始各种投骰的函数是直接写在myqq.c中的,后来因为维护麻烦,引入了lua脚本。
再后来因为代码异常混乱,下定决心重写一遍,将更多的功能塞进lua里,就有了现在的第4版。
基本的结构如下
qq客户端宿主(myqq.exe)--lua脚本宿主(lua51.dll,lua5.1.dll)--lua脚本(main.lua……以及很多)
由myqq.exe加载main.lua,并且向这个脚本暴露say_qun(消息内容,群号),say_buddy(消息内容,qq号),to_gb(内容)三个函数。
具体代码如下

r90:myqq.c:699:
CODEBOX
L=lua_open();
luaL_openlibs(L);
luaL_dofile(L,"main.lua");
lua_pushcfunction(L, lua_say_qun);
lua_setglobal(L, "say_qun");
lua_pushcfunction(L, lua_say_buddy);
lua_setglobal(L, "say_buddy");
lua_pushcfunction(L, lua_to_gb_force);
lua_setglobal(L, "to_gb");
而main.lua则起了重要的承接作用,它首先会载入其他的lua文件(都在luascript文件夹下),
CODEBOX
loadfile("luascript\\dnddice.lua")()
loadfile("luascript\\woddice.lua")()
loadfile("luascript\\roll.lua")()
loadfile("luascript\\getlink.lua")()
loadfile("luascript\\dictionary.lua")()
loadfile("luascript\\wiki.lua")()
loadfile("luascript\\knight.lua")()
loadfile("luascript\\godmachine.lua")()
然后通过两个函数将来自myqq.exe的参数传递过去:
CODEBOX
function main(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
if msg==nil then return end
getlink(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
roll(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
dnddice(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
woddice(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
dictionary(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
wiki(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
knight(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
godmachine(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
end

function main_buddy(msg,msg_time,buddy_name,buddy_num)
dnddice(msg,msg_time,buddy_name,buddy_num)
wiki(msg,msg_time,buddy_name,buddy_num)
getlink(msg,msg_time,buddy_name,buddy_num)
dictionary(msg,msg_time,buddy_name,buddy_num)
end
唔,我觉得这已经足够清晰了。
然后,具体的功能都在各自的lua文件里了。

This post has been edited by bx_bob: 2010-05-31, 18:52
TOP
bx_bob
2010-05-31, 18:49
Post #4


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


3.机器人各功能的实现
这里举一个例子。

r90:roll.lua:
CODEBOX
n=1
function roll(msg,msg_time,buddy_name,buddy_num,qun_name,qun_num)
if string.match(msg, "^%.roll")==nil then return end
math.randomseed(os.time()+n)
math.random()
if n<10000 then n=n+1 end
max=string.match(msg, "^%.roll (%d+)")
if max==nil then return end
if tonumber(max)>10000 then return end
result=msg_time.."\n"..buddy_name.."进行投掷(最大"..max.."点):"..math.random(1,max)
say_qun(result,qun_num)
end

msg里放着一条消息的正文,msg_time是这个消息发出的时间。buddy_name和buddy_num对应发送者的名称和qq号。qun_name和qun_num对应所在的群和群号。
接下来就很容易了,对msg进行正则表达式匹配,并且进行相应的运算。

在这里要重点讲讲随机的问题。lua的随机其实是封装的c的math库里的随机,但是lua的时间却没有封装c的毫秒计时,只有一个以秒为单位的os.time()。这个时候就有一个问题,一般来说,作为随机数种子的都是系统时间,但是以秒为单位的话,可能会出现两人在同一秒内投骰的情况。于是只好加入一个全局变量n,每次投骰之后加一,让随机数种子不一样。
lua的随机还有一个……莫名的问题,就是第一个随出来的数字会有规律。所以这里加了一个math.random()但是没有获取,就是为了跳过第一个随机数。
-------------------------------------------------
-------------------------------------------------
最近更新,开发者注意
-------------------------------------------------
某月某日(忘了)
-------------------------------------------------
在自己编写的新模块开头要记得加上这么一句:
table.insert(main_help_table,".wiki 查询内容 查询维基")
后面引号内的内容就是这个模块的功能介绍。
这是因为新加入了.help功能,提供所有功能的列表。
-------------------------------------------------
6月10日
-------------------------------------------------
引入了luaJIT,据说能提升效率,有兴趣的人重新获取一下新版本吧。
-------------------------------------------------
9月1日
-------------------------------------------------
更新到luaJIT 2.0.0 beta 5!


This post has been edited by bx_bob: 2010-09-07, 11:17
TOP
bx_bob
2010-05-31, 18:51
Post #5


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


附:
-----------------------------------------
qqdicebot编译指引
首先,你需要一个svn,从svn链接下载最新版本的程序和源代码。在本项目中,一些必须的库和dll文件已经包含在里面了。
获取程序和源代码的命令是(如果你使用的是命令行工具的话)
svn checkout https://qqdicebot.googlecode.com/svn/branches/qqdicebot4_xp
这里可以用http协议代替
如果是gui工具,点checkout然后填入链接即可。
然后,必须得有一个mingw c编译环境。这里我推荐下载codeblocks,这是一个IDE,官方网站上有带了编译环境的版本下载。链接:
http://www.codeblocks.org/downloads/5
选这个:codeblocks-8.02mingw-setup.exe

如果你正常地获得了源代码,应该有一个.cbp文件,用codeblocks打开即可。
接着就可以修改源代码并编译啦。

如果想修改lua脚本部分,用记事本工具打开对应的.lua文件,修改后保存即可。记得重启机器人哦。

-----------------------------------------
qqdicebot运行指引
首先,你需要一个qq号(和它的密码)。在这里,邮箱形式的qq号是不行的,必须得是数字。
然后,打开setting.lua文件,修改里面对应的参数,填入账号密码。
最后运行myqq.exe,最小化并等待一会儿。

-----------------------------------------
TOP
bcatyan
2010-06-01, 06:21
Post #6


主物质者
Group Icon
 2
   0

Group: Primer
Posts: 8
Joined: 2010-04-17
Member No.: 37630


那个,我们也有个qq的bot,已经用过一段时间了~~

晚上我把做bot的家伙拉过来~~~

http://ddodnd.uueasy.com/read-htm-tid-85.html
这是最早的一个版本,最近那个家伙重新写了一个,有时间你们可以交流一下~
TOP
SakuraSinojun
2010-06-01, 14:30
Post #7


主物质者
Group Icon
 8
   0

Group: Primer
Posts: 2
Joined: 2010-05-07
Member No.: 38118


-.- 于是奉命前来报到-.-
TOP
bx_bob
2010-06-01, 18:49
Post #8


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


可以先下载一个玩玩?这个贴子没事总会更新一下。
写好的脚本可以以论坛附件的形式上传上来分享。
或者留下意见(我觉得最好能自己动手啦)。

如果想提交代码的话,留下一个google的账号,我会加进google code的开发者。

其实各种开源的聊天软件应该都能用上这个机器人的lua接口,只要把接口写好,嵌入一个luai就行了。这样的话各个机器人之间的脚本也能共享呢。真是一个好想法。

This post has been edited by bx_bob: 2010-06-01, 18:51
TOP
SakuraSinojun
2010-06-04, 11:57
Post #9


主物质者
Group Icon
 8
   0

Group: Primer
Posts: 2
Joined: 2010-05-07
Member No.: 38118


命令行QQ,还有lua脚本……真是有爱的东西 O.O
可是一直懒得看lua语法……嘛……希望加个插件DLL。。。

-.-或者需要自己动手?
SakuraSinojun@gmail.com

TOP
bx_bob
2010-06-06, 09:44
Post #10


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


QUOTE(SakuraSinojun @ 2010-06-04, 11:57) *

命令行QQ,还有lua脚本……真是有爱的东西 O.O
可是一直懒得看lua语法……嘛……希望加个插件DLL。。。

-.-或者需要自己动手?
SakuraSinojun@gmail.com

唔,插件dll的话我还不会……不如你添加了之后提交一个吧。不过那样的接口会不会太混乱?
已经把你加入代码提交者了。

This post has been edited by bx_bob: 2010-06-06, 09:45
TOP
shin
2010-06-07, 16:03
Post #11


主物质者
Group Icon
 9
   0

Group: Primer
Posts: 1
Joined: 2010-06-07
Member No.: 38824


很好的东西,而且还很适合我这种初学者学习,太感谢了 (IMG:style_emoticons/default/cool.gif)
TOP
pl02150363
2010-09-07, 08:12
Post #12


主物质者
Group Icon
 9
   0

Group: Primer
Posts: 1
Joined: 2010-09-06
Member No.: 40592


蛮有趣的 一定要学过来
TOP
游荡的坎德人
2010-10-18, 22:47
Post #13


主物质者
Group Icon
 8
   0

Group: Primer
Posts: 2
Joined: 2008-07-19
Member No.: 23013


好东西!第一次发现这里有这个分区…… 灰常感谢!
----------------------------------------------------------------------------
我的机器人 http://ellesime.anetcity.com/ellesime/bbs/?topic=32961.0
TOP
rk920223
2011-02-15, 00:02
Post #14


主物质者
Group Icon
 8
   0

Group: Primer
Posts: 2
Joined: 2011-01-14
Member No.: 42404


话说我觉得lua脚本还是不要总重启机器人比较好……注册小号当机器人……调试几次就要激活一下……

于是试着做了个重读lua的东西(但是没有技术不会测试,不知道有没有造成内存泄漏
TOP
bx_bob
2011-02-15, 12:11
Post #15


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 819
   15

Group: Avatar
Posts: 414
Joined: 2007-07-25
Member No.: 14794


理论上来说只要把L析构就不会有泄露问题,调用lua_close()估计就行了。
TOP
3 Pages V  1 2 3 
Fast ReplyReply to this topicStart new topic
 


Time is now: 2019-05-21, 19:23