确定用户是不是在 IRC 上标识
Posted
技术标签:
【中文标题】确定用户是不是在 IRC 上标识【英文标题】:Determine If a User Is Idented On IRC确定用户是否在 IRC 上标识 【发布时间】:2010-12-13 13:35:00 【问题描述】:在我的 IRC Bot 中,有一些命令我希望只能由我使用,并且我想检查以确保使用我的名字的任何人都被识别为 nickserv (idented)。但是,我无法找到一种简单的方法来确定这一点,这就是我在这里的原因。
Freenode 和 Rizon 是主要目标网络,如果这很重要的话。
编辑:我实际上知道识别用户的各种用户模式(尽管我没有足够注意意识到它们不同!);很抱歉之前没有提到这一点。但是,我从用户那里得到的原始响应不包括他们的用户模式。它看起来像这样:
:liam_neeson!n=pearson@71-9-55-124.dhcp.snlo.ca.charter.com PRIVMSG #erasmus-testing :foo
然后,我想我正在尝试找到一种方法(使用各种 ircd,grr)来获取这些标志。如果正如有人提到的那样,Rizon 返回是否有人在 WHOIS 查询中被识别,那么这就是我正在寻找的东西。
【问题讨论】:
【参考方案1】:在 freenode 上,向 nickserv 发送带有消息ACC <nickname>
的私人消息将返回一个指示用户身份状态的数字:
答案格式为
<nickname> ACC <digit>
:0 - account or user does not exist 1 - account exists but user is not logged in 2 - user is not logged in but recognized (see ACCESS) 3 - user is logged in
STATUS <nickname>
命令在 Rizon 上给出了类似的结果:
响应格式如下:
<nickname> <digit>
0 - no such user online or nickname not registered 1 - user not recognized as nickname's owner 2 - user recognized as owner via access list only 3 - user recognized as owner via password identification
此方法相对于 WHOIS 的优势:
-
始终包含有关身份状态的信息。 使用 WHOIS,如果用户实际上不是,您将不会看到类似于“被 nickserv 识别为某某”的行, 确定。
返回的行数一致。由于我想在将控制权传递给程序的其余部分之前获取消息,因此我可以轻松地从缓冲区中读取一行(我看到您将来会出现同步问题! ),确定状态,然后照常继续。
【讨论】:
网络之间的调用输出略有不同,例如,在 Rizon,我得到STATUS nick #
,但在 OFTC 上,我得到类似 1 (online, not identified)
的信息。我能想到的最便携的方法是首先尝试ACC
命令并扫描输出以查找nick 之外的数字,如果没有尝试STATUS
命令(在某些ACC
using servers STATUS
用于不同的目的,所以最后尝试),并使用例外列表。 关键:不要扫描死板的格式,而是构建一个灵活的解析器来扫描数字。此外,并非所有网络都有NickServ
,因此请回退。
在某些网络上,模式 +r
给出(作为另一个答案提到)。认为这里应该更高。【参考方案2】:
在某些网络上,您可以启用名为“identify-msg”的功能。在 FreeNode 上,您可以在第一次连接到服务器时发送“CAP REQ identify-msg”和“CAP END”。服务器将回复确认该功能的回复。之后,所有消息(和 CTCP ACTION)都会以“+”(用户已使用 NickServ 标识)或“-”(用户尚未使用 NickServ 标识)开头,例如:
:liam_neeson!n=pearson@71-9-55-124.dhcp.snlo.ca.charter.com PRIVMSG #erasmus-testing :+foo
【讨论】:
【参考方案3】:昵称注册不是 IRC 标准的一部分。它总是由定制的 IRC 服务器和/或机器人提供。我认为您不会找到真正通用的解决方案,但 NickServ 是一种常见的可用实现,可以在许多网络上运行。***有more info。
您可能希望完全回避这个问题,让您的用户注册到您的机器人,而不是 nickserv。然后,您的机器人将进行密码检查,并在用户注销时使用户的凭据无效。这将是一个通用的解决方案。
【讨论】:
我认为这是另一个功能,但我在脑海中实现它的方式涉及用户名和密码的单独提示,并且冒着延迟所有功能的风险,除非我分离出另一个线程,我真的不这样做'不想做atm。现在不是凌晨 2 点 :),您建议的方法更有希望。虽然我宁愿不处理身份验证,但我最终可能会这样做。 有点遗憾——有人应该创建一个新的 RFC 来添加这些功能(就像他们已经更新了几次 FTP 一样)...尤其是可以更好地支持机器人的功能(例如使用 nickserv 在服务器上标准化 ACC 昵称或状态昵称 - 如果服务器不支持用户身份验证,他们应该无论如何创建一个“虚拟”nickserv,一个没有命令的,只是为了防止人们使用该名称并用它来欺骗他人) .【参考方案4】:由于您的用户名已注册,在您的机器人登录之前,您执行以下命令:
/ns ghost username password
这个命令会删除任何登录到你的用户的用户,记住我只在Freenode中使用过这个,不知道它是否会在另一个服务器上运行。
【讨论】:
两个目标网络都支持重影,是的,但我不希望我的机器人重影我!我正在尝试为我的机器人提供一种方式来识别我是真正的我所声称的自己,并避免冒充。【参考方案5】:使用 Freenode,如果用户被 NickServ 识别,那么他们的用户拥有+e mode set。不确定 Rizon 是否有类似的东西。
【讨论】:
【参考方案6】:UnrealIRCd 和 hybrd 将 +r 设置为注册用户,但我不确定是否所有 IRC 服务器都这样做,它非常不标准化。同样在 Rizon 上,您可以使用 whois,它会告诉您用户是否已注册。
【讨论】:
【参考方案7】:/NickServ INFO <username>
这将告诉您用户是否已注册。
我通过这个网站发现了这个命令:http://www.deepspace.org/nickserv.htm
【讨论】:
以上是关于确定用户是不是在 IRC 上标识的主要内容,如果未能解决你的问题,请参考以下文章