挑战
这项挑战的目标是创建一个可以在Stack Exchange聊天室中运行的聊天机器人。您的漫游器需要能够检测用户何时发布特定命令并对其进行响应。这是命令列表,以及您的机器人应该做什么:
!!newest
:输出在此站点(codegolf.SE)上发布的最新问题的标题(无链接,但标题)。!!metanewest
:输出发布在元网站(meta.codegolf.SE)上的最新问题的标题。!!questioncount
:输出当前的问题计数。!!metaquestioncount
:在meta网站上输出当前问题计数。!!tag tagname
:输出作为第一个参数给出的标签的标签摘录(简短描述)。!!metatag tagname
:与上述相同,但用于元网站。!!featured
:输出当前有赏金的问题计数。!!metafeatured
:输出在Meta上带有[featured]标签的问题计数。
规则
- 您应该编写完整的程序,而不是代码段或函数。
- 如果有必要,您可以请求用户名和密码作为输入(提示输入,STDIN,命令行参数)。如果使用(例如)Python或Ruby,这将是必需的,但是如果使用JavaScript并在聊天室页面本身上运行脚本,则不需要。
- 您可以使用外部库来做WebSockets之类的事情。这些库不必计入您的字符数。
您可以使用外部聊天包装器(但不必这样做,建议您自己编写),然后必须计算字符数。您也不允许更改包装程序的代码。如果使用它,则无需修改即可使用它,并且必须计算所有字符(这是不编写自己的包装器的一种惩罚)。
仅包装器本身的代码必须计数。如果还有其他文件(例如示例),则不必计数。
- 不使用URL缩短器或其他可以缩短URL的方式:挑战是打高尔夫,而不是打URL。
- 除了聊天和获取响应命令所必需的信息之外,没有任何Web请求。
- 不允许使用标准的“漏洞”。
- 如果有人发布命令,则您需要使用以下格式的聊天消息进行响应:
@user response
。因此,如果我编写命令!!featured
并有5个有特色的问题,则您的机器人应该发布@ProgramFOX 5
。 - 如果我测试了您的机器人,那么我将通过我的chatbot帐户运行它,并在此聊天室中运行它。我将始终在该房间中测试机器人,因此不必提供房间ID作为输入,它始终为14697。不会提供此ID作为输入,它应该是硬编码的。
- 如果未找到命令,则输出
@user The command [command] does not exist
。替换[command]
为不存在的命令的名称。如果将参数提供给命令,则不输出参数,仅输出命令名称。 - 如果命令必须包含许多参数,请忽略不必要的参数。
- 如果命令的参数不足,则输出
@user You have not provided enough arguments
- 系统防止重复消息在短时间内发布。因此,在测试您的漫游器时,我永远不会运行两个连续提供相同输出的命令(这意味着您不必实现一个系统,该系统如果消息重复则通过添加一个点来使消息不同)。
- 系统会防止在短时间内发布太多消息,因此在测试时,我绝不会在短时间内发送太多命令,这意味着您的机器人不必为此担心(等待一段时间)例如,在发布之前)。
- 这是代码高尔夫,使用最少字节数的程序获胜。
入门
这是一些有关编写机器人的入门信息。您不必使用它,但是它可以作为指导。
- 要登录,请首先登录到OpenID提供程序。这将始终是Stack Exchange OpenID(
https://openid.stackexchange.com
)。登录表单位于https://openid.stackexchange.com/account/login
,并在此处提供用户名和密码。 - 然后,登录到
stackexchange.com
。登录表单位于https://stackexchange.com/users/login
。选择Stack Exchange作为OpenID提供程序。 - 完成后,登录聊天。的登录表单位于
http://stackexchange.com/users/chat-login
。选择Stack Exchange作为OpenID提供程序。 - 然后,您需要拿到您的
fkey
。为此,请转到隐藏的输入字段http://chat.stackexchange.com/chats/join/favorite
并从中获取fkey
。 - 要发布消息,请向发送请求
http://chat.stackexchange.com/chats/14697/messages/new
,并提供两个POST参数:一个text
包含消息文本的fkey
参数,一个包含的参数fkey
。 要查看何时发布新消息,可以使用WebSockets(但不必一定要使用,如果较短则可以使用其他方法)。请查看此Meta Stack Exchange答案:
聊天室
(wss://chat.sockets.stackexchange.com/events/<roomnumber>/<somehash>?l=<timethingy>)
可以通过发布房间ID和fkey到
http://chat.stackexchange.com/ws-auth
timethingy是所返回的json的时间键
/chats/<roomno>/events
。发布消息时的事件ID为
1
。- 查看现有的聊天包装器(如Doorknob的StackExchange -Chatty和Manishearth的ChatExchange)很有用,以了解其工作原理。
3
看到标题的那一刻,我立即想到了“啊,ProgramFOX”。
—
seequ 2014年
我希望
—
John Dvorak
metafeatured
对元数据有很多疑问,但是...谢谢:-)
@JanDvorak每个站点的meta没有赏金,所以我不能使用它。当我写这个挑战时,我忘记了Meta带有[featured]标签,所以谢谢您的建议!
—
ProgramFOX 2014年
我要查看是否发布了新消息,是每隔2秒钟通过JS检查一次,如果最后一条消息不是我(班上的最后一项)不是由我检查的
—
Cilan