【问题标题】:PHP Sockets and Whatsapp ProxyPHP 套接字和 Whatsapp 代理
【发布时间】:2017-05-12 16:22:32
【问题描述】:

我正在构建一个关于 WhatsApp 的小项目,并且我正在使用 https://github.com/mgp25/Chat-API,即使 repo 不再支持。

我的问题与套接字有关,我正在使用它们登录。失败的代码部分是:

<?php
$socket = fsockopen("e" . rand(1, 16) . ".whatsapp.net:" . Constants::PORT);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(
    'sec' => Constants::TIMEOUT_SEC,
    'usec' => Constants::TIMEOUT_USEC
));

socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array(
    'sec' => Constants::TIMEOUT_SEC,
    'usec' => Constants::TIMEOUT_USEC
));

?>

我收到以下错误:

C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class.php 在第 305 行

[10-May-2017 15:11:13 Africa/Johannesburg] PHP 警告:socket_set_option():提供的资源不是 C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class 中的有效 Socket 资源.php 在第 291 行

[10-May-2017 15:11:13 Africa/Johannesburg] PHP 警告:socket_set_option():提供的资源不是 C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class 中的有效 Socket 资源.php 在第 296 行

[10-May-2017 15:11:13 Africa/Johannesburg] PHP 警告:socket_read():提供的资源不是 C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class 中的有效 Socket 资源.php 在第 299 行

[10-May-2017 15:11:13 Africa/Johannesburg] PHP 致命错误:未捕获的 FailedProxy:[0]:代理失败。错误 3

在第 301 行的 C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class.php 中抛出

【问题讨论】:

  • 不,我不这么认为,我见过那个,他们在本地主机上做套接字,而我正在为 Whatsapp 服务器使用套接字
  • 这无关紧要,你还在混资源
  • @t.m.adam 我检查了那个。之后我确实有一个socket_read: $socket_result = trim(socket_read($socket, 8192));
  • 这也是个问题。尝试用socket_create创建$socket

标签: php sockets whatsapp


【解决方案1】:

在您的代码中,您将文件与套接字混合,因此 PHP 会抛出错误。要解决此问题,您可以使用socket_create 创建一个套接字,或使用stream_set_timeout 设置超时并使用文件系统函数读取/写入套接字:

<?php
$protocol = "tcp";    /* or "ssl" for HTTPS */
$host = "e" . rand(1, 16) . ".whatsapp.net";
$fp = fsockopen("$protocol://$host", Constants::PORT, $errn, $errm);
stream_set_timeout($fp, Constants::TIMEOUT_SEC);

/* You can treat $fp the same way you would treat a file */
//$data = fread($fp, 8192); 
//fwrite($fp, "my data");   
//fclose($fp);
?>

如果你想使用套接字,那么$socket 应该是一个套接字资源:

<?php 
$host = "e" . rand(1, 16) . ".whatsapp.net";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, Constants::PORT);

socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(
    'sec' => Constants::TIMEOUT_SEC,
    'usec' => Constants::TIMEOUT_USEC
));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array(
    'sec' => Constants::TIMEOUT_SEC,
    'usec' => Constants::TIMEOUT_USEC
));
?>

【讨论】:

  • 我尝试了不同的方法,但我收到了 400 错误请求。我只是改变了我使用套接字连接的方式......但这就是我得到的。
  • 也尝试过其他人...但仍然遇到同样的错误。
  • 400 错误意味着您可能发送了一些错误的标头,您可以将您发送到 $host$data 包括在内。此外,如果$host 使用 ssl,您应该使用我发布的第一个示例。
  • 我不确定主机是否使用 SSL,但是当我将您的第二个代码与套接字用作资源时,我停止收到 400 Bad Request,因为我需要它作为资源。因此,在执行完您在那里所做的之后:我现在收到“连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应。”
  • 尝试连接什么端口?我无法连接到 e1 - e16 范围内的任何 .whatsapp.net 上的端口 80。
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多