8

我正在尝试将我的 PHP 脚本连接到 IRC,但它一直超时。我服务器上,所以我知道它已经启动并正在运行,我不知道问题是什么。

这可能是我的代码中的错误吗?

<?php

/**
 * Configuration.
 * Pretty self-explanatory
 */

$ircServer = "hub.malvager.com";
$ircPort = "6667";
$ircChannel = "#hackforums";

set_time_limit(0);

$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS);

if ($ircSocket)
{

    fwrite($ircSocket, "USER Orgy orgy.test hfcoder :twBooter\n");
    fwrite($ircSocket, "NICK OrgyBot|" . rand() . "\n");
    fwrite($ircSocket, "JOIN " . $ircChannel . "\n");

    while(1)
    {
        while($data = fgets($ircSocket, 128))
        {
            echo nl2br($data);
            flush();

            // Separate all data
            $exData = explode(' ', $data);

            // Send PONG back to the server
            if($exData[0] == "PING")
            {
                fwrite($ircSocket, "PONG ".$exData[1]."\n");
            }
        }
    }
}
else
{
    echo $eS . ": " . $eN;
}

?>

更新:显然,它在某些服务器上成功运行,但在其他服务器上却没有。fsockopen 是允许的,set_time_limit 也是如此。我无法弄清楚问题是什么。

更新:这是一个跟踪路线:

traceroute to hub.malvager.com (69.164.201.185), 30 hops max, 40 byte packets
1  rtr-1.bluehost.com (69.89.16.1)  0.406 ms  0.418 ms  0.438 ms
2  ge-6-8.car2.SaltLakeCity1.Level3.net (4.53.42.5)  1.484 ms  1.515 ms  1.590 ms
3  ae-5-5.ebr1.Denver1.Level3.net (4.69.133.126)  35.117 ms  35.119 ms  35.270 ms
4  ae-2-2.ebr2.Dallas1.Level3.net (4.69.132.106)  39.978 ms  39.938 ms  39.939 ms
5  ae-3-80.edge4.Dallas3.Level3.net (4.69.145.141)  40.070 ms  40.046 ms ae-4-90.edge4.Dallas3.Level3.net (4.69.145.205)  40.040 ms
6  THE-PLANET.edge4.Dallas3.Level3.net (4.59.32.30)  40.171 ms  41.407 ms  40.698 ms
7  te7-2.dsr02.dllstx3.theplanet.com (70.87.253.26)  40.653 ms te9-2.dsr02.dllstx3.theplanet.com (70.87.253.30)  40.454 ms te7-2.dsr02.dllstx3.theplanet.com (70.87.253.26)  40.593 ms
8  * * 6e.ff.5746.static.theplanet.com (70.87.255.110)  40.537 ms
9  52.ff.5746.static.theplanet.com (70.87.255.82)  40.481 ms  40.472 ms  40.459 ms
10  li115-185.members.linode.com (69.164.201.185)  40.450 ms  40.171 ms  40.582 ms

和挖掘:

; <<>> DiG 9.6.2-RedHat-9.6.2-0.BH <<>> hub.malvager.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34815
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5

;; QUESTION SECTION:
;hub.malvager.com.      IN  A

;; ANSWER SECTION:
hub.malvager.com.   85419   IN  A   69.164.201.185

;; AUTHORITY SECTION:
malvager.com.       85419   IN  NS  ns1.linode.com.
malvager.com.       85419   IN  NS  ns3.linode.com.
malvager.com.       85419   IN  NS  ns2.linode.com.
malvager.com.       85419   IN  NS  ns4.linode.com.
malvager.com.       85419   IN  NS  ns5.linode.com.

;; ADDITIONAL SECTION:
ns1.linode.com.     54252   IN  A   69.93.127.10
ns2.linode.com.     51679   IN  A   65.19.178.10
ns3.linode.com.     41439   IN  A   75.127.96.10
ns4.linode.com.     26259   IN  A   207.192.70.10
ns5.linode.com.     54441   IN  A   109.74.194.10

;; Query time: 4 msec
;; SERVER: 74.220.195.27#53(74.220.195.27)
;; WHEN: Thu Sep 23 16:32:21 2010
;; MSG SIZE  rcvd: 227

网猫:

nc: connect to hub.malvager.com port 6667 (tcp) failed: Connection timed out

4

12 回答 12

2

你有一些错误。

是错误的,因为首先严格检查爆炸结果,您按空格字符爆炸,并且在 IRC 实现协议中,所有命令必须以换行符终止,然后服务器发送给您,"PING\n"然后"PING"您的$exData数组处于此状态。

array(1) {
  [0]=>
  string(5) "PING
"
}

那么你$exData[0] == "PING" 是假的,因为"PING"不等于"PING\n"。好的解决方案不是添加"\n"到解析器中的命令末尾,因为"\n"它不仅是换行标记(对于糟糕的 IRC 协议实现我推荐这个,你永远不知道 IRC 协议开发人员可能使用什么换行标记,想想Delphi INDY Buggy IRC Server Control),更好的解决方案是不检查她。

if (strstr(strtolower($exData[0]), "ping"))
{ 
    $cmd = "PONG";
    if (sizeof($exData) == 1)
    {
        $cmd .= "\n";
    }
    else for ($Index=1; $Index < sizeof($exData); $Index++)
    {
        $cmd .= " " . $exData[$Index];
    }
    /*
     * Not adding newline marker, because is.
     * already exists in last element of $exData
     * array at last position if for was executed
     */
    fwrite($ircSocket, $cmd);
}

我会将 , 更改为while($data = fgets($ircSocket, 128)),while ($data = fgets($ircSocket))因为在长服务器名称中您可以简单地溢出 128 个字节。


而且您的fwrite($ircSocket, "JOIN " . $ircChannel . "\n");行并没有完全按照您的意愿进行操作,因为您的JOIN命令是在USERandNICK命令之后发送的,然后服务器在用户注册之前解析您的请求,如果用户未注册,您可以JOIN进入频道,IRC 服务器不会排队失败命令,因为这没有任何意义。最好的做法是在从服务器接收到JOIN命令之后发送命令,如果你想实现一些功能,比如.MOTDAUTOJOIN

// End of /MOTD command.
if (sizeof($exData) > 1) if (strstr($exData[1], "376"))
{
    fwrite($ircSocket, "JOIN " . $ircChannel . "\n");
}

关于您的脚本设计,如果您编写简单的机器人,那么我在本主题中没有什么要说的,但是如果您打算编写一些大段代码,您应该以其他方式设计您的脚本。您必须分离一些层,例如 IRC 协议实现和您的 IRC Bot 操作。您应该使用一些类将 IRC 协议的责任转移到她身上,因为在更大的代码段中,将 IRC 协议控制与您的机器人操作代码混合是很好的技术债务

于 2010-09-21T11:59:05.997 回答
1
  1. 安装netcat
  2. 在同一设备上运行nc hub.malvager.com 6667
  3. 分析结果。

如果你的结果是:

sviss@sviss:~$ nc -v hub.malvager.com 6667
DNS fwd/rev mismatch: hub.malvager.com != li115-185.members.linode.com
hub.malvager.com [69.164.201.185] 6667 (ircd) open
:hub.malvager.com NOTICE AUTH :*** Looking up your hostname...
:hub.malvager.com NOTICE AUTH :*** Found your hostname (cached) 
  1. 从php.net安装PHP来自源文件的新版本(这很重要,因为在来自 apt 的二进制版本或不推荐使用的某些版本中)
  2. 然后,如果问题尚未解决,您可以修改默认PHP.ini文件以调整设置(我认为使用默认文件,您的脚本会运行良好)。fsockopen.ini

如果您的结果表示某些连接错误,有些人会像以下示例一样思考:

sviss@sviss:~$ nc -v hub.malvager.com 6668
DNS fwd/rev mismatch: hub.malvager.com != li115-185.members.linode.com
hub.malvager.com [69.164.201.185] 6668 (?) : Connection refused
  1. tracert hub.malvager.com并将结果发布到您的问题中,然后我必须阅读并更新我的答案。

  2. 如果您正在使用POSIXdig hub.malvager.com并将结果发布到您的问题中,那么我必须阅读此内容并更新我的答案。

  3. 如果您正在使用WINDOWSnslookup hub.malvager.com并将结果发布到您的问题中,那么我必须阅读此内容并更新我的答案。

  4. 如果你想单独分析这个结果,从你的角度来看,我的这个命令的结果很方便,然后我发布这个。

结果dig hub.malvager.com

; <<>> DiG 9.5.1-P3 <<>> hub.malvager.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33134
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;hub.malvager.com.              IN      A

;; ANSWER SECTION:
hub.malvager.com.       84935   IN      A       69.164.201.185

;; Query time: 17 msec
;; SERVER: 62.179.1.62#53(62.179.1.62)
;; WHEN: Wed Sep 22 18:28:57 2010
;; MSG SIZE  rcvd: 50

POSIXtracert hub.malvager.com上的结果:

traceroute to hub.malvager.com (69.164.201.185), 30 hops max, 40 byte packets
 1  10.10.10.1 (10.10.10.1)  1.428 ms  1.861 ms  2.287 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  *  (84.116.252.205)  145.057 ms  145.557 ms
 8  84.116.132.53 (84.116.132.53)  141.189 ms  142.263 ms  143.312 ms
 9  84.116.132.230 (84.116.132.230)  143.827 ms  169.115 ms *
10  us-nyc01b-rd1-pos-12-0.aorta.net (213.46.160.242)  141.656 ms  142.722 ms *
11  us-nyc01b-ri1-ge-0-1-0.aorta.net (213.46.190.178)  144.280 ms  146.999 ms  147.512 ms
12  be-20-203-pe01.111eighthave.ny.ibone.comcast.net (68.86.88.73)  148.066 ms  148.570 ms  133.769 ms
13  68.86.87.109 (68.86.87.109)  133.962 ms  137.222 ms  137.218 ms
14  pos-0-9-0-0-cr01.ashburn.va.ibone.comcast.net (68.86.87.61)  142.599 ms  142.608 ms  142.624 ms
15  pos-1-5-0-0-cr01.atlanta.ga.ibone.comcast.net (68.86.87.78)  144.131 ms  141.138 ms  144.306 ms
16  pos-1-10-0-0-cr01.dallas.tx.ibone.comcast.net (68.86.86.129)  165.506 ms  166.013 ms  169.184 ms
17  pos-0-3-0-0-pe01.1950stemmons.tx.ibone.comcast.net (68.86.86.154)  170.688 ms  171.203 ms  174.275 ms
18  theplanet-cr01.dallas.tx.ibone.comcast.net (75.149.228.2)  183.499 ms  184.011 ms  187.376 ms
19  te9-1.dsr02.dllstx3.theplanet.com (70.87.253.22)  187.883 ms  188.390 ms  174.093 ms
20  * * *
21  56.ff.5746.static.theplanet.com (70.87.255.86)  173.691 ms  174.396 ms  174.679 ms
22  li115-185.members.linode.com (69.164.201.185)  174.702 ms  175.541 ms  174.186 ms
于 2010-09-22T16:15:22.067 回答
0

这个

代码有一个完美的工作 IRC 服务器。我会走这条路。

PS:如果你不喜欢它,请保持友善,不要记下它。谢谢

于 2010-10-14T17:34:56.647 回答
0

您是否尝试过使用 telnet 来模拟您的机器人的行为并看看会发生什么?准确连接、键入(或复制粘贴)您的机器人将输出的内容并盯着屏幕几分钟。

于 2010-09-29T13:02:43.120 回答
0

服务器可能需要一个 ident 响应。另外,我运行了那个脚本,它连接得很好。也许它是一个防火墙问题。

于 2010-09-16T15:33:51.130 回答
-1

听起来你被阻止了,因为你没有设置 IDENT。

侦听端口 113 以查看是否有来自 IRC 服务器的 Ident 请求。

也是 Mirc 如何处理 ident 请求的好读物,因此您可以轻松地制作一些东西以使其工作。

于 2010-09-22T03:15:25.390 回答
-1

根据 rfc1459,IRC 协议中消息的结尾是 ¨\r\n¨ 不仅仅是 ¨\n¨。因此,某些服务器实现可能会拒绝您的消息。

于 2010-09-27T20:50:35.243 回答
-1

1) 如果服务器发送带有消息的 ping,您应该用 pong 回复,然后是相同的消息。
2)不时(每30秒左右)向服务器发送一个ping消息。如果您在几分钟内没有收到回复,您可能会认为客户端已从服务器超时,应该重新连接。

于 2010-09-27T20:38:05.703 回答
-1

Telnet 表示应该这样写 malvager.com,端口 6667

"PASS *\n"
"NICK OrgyBot|" . rand() . "\n"
"USER Orgy orgy.test hfcoder :twBooter\n"


if($exData[0] == "PING :hub.malvager.com")
{ 
 fwrite($ircSocket, "PONG :hub.malvager.com".$exData[1]."\n"); 
} 
于 2010-09-26T08:54:34.247 回答
-1

你是从本地机器还是网络服务器运行这个机器人?如果它来自您的网络服务器,则可能是 malvager.com 已阻止您的网络服务器,而其他 irc 服务器已解除阻止。

我在其他 IRC 网络上遇到过这个问题,事实证明,其他人使用了我用来托管僵尸网络的同一托管服务提供商,这需要 IRC 服务器阻止来自我的主机的 IP。

如果您连接的 IP 地址被阻止,我会询问 malvager.com 管理员。

也试试$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS, 30);

编辑:

我使用bluehost,看起来你也这样做。我的 irc 在他们的服务器上工作时遇到问题,我在 Live Chat 中与他们交谈。他们提到他们不允许在他们的网络上使用 irc 机器人,因此他们封锁了大部分网络。但是他们提到,如果有人滑倒并抓住它,他们将暂停您的帐户。

于 2010-09-27T16:55:07.780 回答
-1

bluehost.com托管阻止IRC连接到此IRC 服务器,这是检查信息。

于 2010-10-03T19:23:44.820 回答
-1

I remember doing some bots back in the mIRC era. The problem were always the line breaks i used to send after the message.

As far as i remember, the chars vere #30 and #32 or such. Why not try them instead of \n. Some servers are pretty sensitive to this issues.

Also the pong has to be replied with the text after the ping, thats very important.

Have fun!

于 2010-10-03T12:38:41.217 回答