PHP 套接字和 Whatsapp 代理

PHP Sockets and Whatsapp Proxy

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

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

<?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 on line 305

[10-May-2017 15:11:13 Africa/Johannesburg] PHP Warning: socket_set_option(): supplied resource is not a valid Socket resource in C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class.php on line 291

[10-May-2017 15:11:13 Africa/Johannesburg] PHP Warning: socket_set_option(): supplied resource is not a valid Socket resource in C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class.php on line 296

[10-May-2017 15:11:13 Africa/Johannesburg] PHP Warning: socket_read(): supplied resource is not a valid Socket resource in C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class.php on line 299

[10-May-2017 15:11:13 Africa/Johannesburg] PHP Fatal error: Uncaught FailedProxy: [0]: Failed proxy. Error 3

thrown in C:\MAMP\htdocs\WhatsappTestApp\whatsapp\src\whatsprot.class.php on line 301

在您的代码中,您将文件与套接字混合在一起,因此 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
));
?>