За последние 24 часа нас посетили 26558 программистов и 1510 роботов. Сейчас ищут 849 программистов ...

How to Winsocket for dummies

Тема в разделе "PHP для новичков", создана пользователем NerdRage, 8 фев 2017.

  1. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    У друга на компе крутится бот, который принимает запросы по winsocket. Помогите приконектиться, я уже кучу вариантов из гугла перепробовал, пишет практически всегда одно и тоже:
    Код (Text):
    1. fsockopen(): unable to connect to 79.164.127.227:3337
    Сейчас функцию коннекта я скопипастил такую:
    PHP:
    1. function connect() {
    2.         $key1 = generateRandomString(32);
    3.         $key2 = generateRandomString(32);
    4.         $key3 = generateRandomString(8, false, true);
    5.  
    6.         $header = "GET /echo HTTP/1.1\r\n";
    7.         $header.= "Upgrade: WebSocket\r\n";
    8.         $header.= "Connection: Upgrade\r\n";
    9.         $header.= "Host: 79.164.127.227:3337\r\n";
    10.         $header.= "Origin: http://79.164.127.227\r\n";
    11.         $header.= "Sec-WebSocket-Key1: " . $key1 . "\r\n";
    12.         $header.= "Sec-WebSocket-Key2: " . $key2 . "\r\n";
    13.         $header.= "\r\n";
    14.         $header.= $key3;
    15.  
    16.  
    17.         $socket = fsockopen(79.164.127.227, 3337, $errno, $errstr, 2);
    18.         fwrite($socket, $header) or die('Error: ' . $errno . ':' . $errstr);
    19.         $response = fread($socket, 2000);
    20.  
    21.         /**
    22.          * @todo: check response here. Currently not implemented cause "2 key handshake" is already deprecated.
    23.          * See: http://en.wikipedia.org/wiki/WebSocket#WebSocket_Protocol_Handshake
    24.          */
    25.         return true;
    26. }
    27.  
    28. function generateRandomString($length = 10, $addSpaces = true, $addNumbers = true) {
    29.    $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}';
    30.    $useChars = array();
    31.    // select some random chars:
    32.    for ($i = 0; $i < $length; $i++) {
    33.       $useChars[] = $characters[mt_rand(0, strlen($characters) - 1)];
    34.    }
    35.    // add spaces and numbers:
    36.    if ($addSpaces === true) {
    37.       array_push($useChars, ' ', ' ', ' ', ' ', ' ', ' ');
    38.    }
    39.    if ($addNumbers === true) {
    40.       array_push($useChars, rand(0, 9), rand(0, 9), rand(0, 9));
    41.    }
    42.    shuffle($useChars);
    43.    $randomString = trim(implode('', $useChars));
    44.    $randomString = substr($randomString, 0, $length);
    45.    return $randomString;
    46. }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    а что это такое?
     
  3. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    А я сам хз. Вот API бота. И я без понятия как с этим работать.
    Коннект удался, у друга просто был закрыт порт. Но при попытке что-то отправить, приходит хрень какая-то.

    Код (Text):
    1. 'O��s���V�]�Y)I�'
    Можете сами попробовать. Вот полный код, с которым я работаю.
    PHP:
    1. <?php
    2. class DeepBot {
    3.     public $deep_ip = '79.164.127.227';
    4.     public $deep_port = 3337;
    5.     private $socket = null;
    6.  
    7.     public function __construct() {
    8.         $this->ws_connect();
    9.     }
    10.  
    11.     public function __destruct() {
    12.         $this->ws_disconnect();
    13.     }
    14.  
    15.     public function sendData($data) {
    16.         // send actual data:
    17.         fwrite($this->socket, "\x00" . $data . "\xff") or die('Error:' . $errno . ':' . $errstr);
    18.         $wsData = fread($this->socket, 2000);
    19.         $retData = trim($wsData, "\x00\xff");
    20.         return $retData;
    21.     }
    22.  
    23.     private function ws_connect() {
    24.         $key1 = $this->generateRandomString(32);
    25.         $key2 = $this->generateRandomString(32);
    26.         $key3 = $this->generateRandomString(8, false, true);
    27.  
    28.         $header = "GET /echo HTTP/1.1\r\n";
    29.         $header.= "Upgrade: WebSocket\r\n";
    30.         $header.= "Connection: Upgrade\r\n";
    31.         $header.= "Host: " . $this->deep_ip . ":" . $this->deep_port . "\r\n";
    32.         $header.= "Origin: http://".$this->deep_ip."\r\n";
    33.         $header.= "Sec-WebSocket-Key1: " . $key1 . "\r\n";
    34.         $header.= "Sec-WebSocket-Key2: " . $key2 . "\r\n";
    35.         $header.= "\r\n";
    36.         $header.= $key3;
    37.  
    38.  
    39.         $this->socket = fsockopen($this->deep_ip, $this->deep_port, $errno, $errstr, 2);
    40.         fwrite($this->socket, $header) or die('Error: ' . $errno . ':' . $errstr);
    41.         $response = fread($this->socket, 2000);
    42.  
    43.         /**
    44.          * @todo: check response here. Currently not implemented cause "2 key handshake" is already deprecated.
    45.          * See: http://en.wikipedia.org/wiki/WebSocket#WebSocket_Protocol_Handshake
    46.          */
    47.         return true;
    48.     }
    49.  
    50.     private function ws_disconnect() {
    51.         fclose($this->socket);
    52.     }
    53.  
    54.     private function generateRandomString($length = 10, $addSpaces = true, $addNumbers = true) {
    55.         $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}';
    56.         $useChars = array();
    57.         // select some random chars:
    58.         for ($i = 0; $i < $length; $i++) {
    59.             $useChars[] = $characters[mt_rand(0, strlen($characters) - 1)];
    60.         }
    61.         // add spaces and numbers:
    62.         if ($addSpaces === true) {
    63.             array_push($useChars, ' ', ' ', ' ', ' ', ' ', ' ');
    64.         }
    65.         if ($addNumbers === true) {
    66.             array_push($useChars, rand(0, 9), rand(0, 9), rand(0, 9));
    67.         }
    68.         shuffle($useChars);
    69.         $randomString = trim(implode('', $useChars));
    70.         $randomString = substr($randomString, 0, $length);
    71.         return $randomString;
    72.     }
    73.  
    74.  
    75. }
    76.  
    77. $deep = new DeepBot();
    78. $response = $deep->sendData("test");
    79. echo '<pre>'; var_export($response); echo '</pre>'; // отладка
    80.  
    81. unset($deep);
    82. ?>
     
    #3 NerdRage, 8 фев 2017
    Последнее редактирование: 8 фев 2017
  4. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Лооооол... Websocket конечно же.
     
  5. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Я бы подробно глянул, если бы у меня был secret
    "api|register|{secret}"
     
  6. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    B42FDUYPNfYJUHYVcTOONOIcLXAfDcCdSHXKD
    @alexblack, я правильно понимаю, что поддержка Websocket из коробки в PHP такая себе, и надо ставить это или это? Мне ещё для этого композером учиться пользоваться, чтобы сделать автолоудер... :( Или можно обойтись без всего этого?
     
  7. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Ну у меня все работает.Касательно твоего вопроса я не писал сам под это дело либу,но если ключ останется валидным несколько дней - могу попробовать написать.Я не стал особо заморачиваться и опробовал готовое решение,все отработало отлично:
    Код (Text):
    1. getUsers($offset, $limit)
    2.  
    3. array(15) {
    4.   [0]=>
    5.   array(8) {
    6.     ["user"]=>
    7.     string(6) "moobot"
    8.     ["points"]=>
    9.     float(9101)
    10.     ["watch_time"]=>
    11.     float(43200)
    12.     ["vip"]=>
    13.     int(10)
    14.     ["mod"]=>
    15.     int(1)
    16.     ["join_date"]=>
    17.     string(27) "2015-02-21T12:51:44.1045925"
    18.     ["last_seen"]=>
    19.     string(27) "2015-09-26T10:26:12.5576299"
    20.     ["vip_expiry"]=>
    21.     string(27) "2015-02-21T12:51:44.1045925"
    22.   }
    23.   [1]=>
    24.   array(8) {
    25.     ["user"]=>
    26.     string(9) "rider_god"
    27.     ["points"]=>
    28.     float(5994.5)
    29.     ["watch_time"]=>
    30.     float(7180)
    31.     ["vip"]=>
    32.     int(10)
    33.     ["mod"]=>
    34.     int(0)
    35.     ["join_date"]=>
    36.     string(27) "2015-02-21T12:51:44.1045925"
    37.     ["last_seen"]=>
    38.     string(27) "2016-08-28T19:31:05.9470592"
    39.     ["vip_expiry"]=>
    40.     string(27) "2015-12-22T02:54:02.7970875"
    41.   }
    42.   [2]=>
    43.   array(8) {
    44.     ["user"]=>
    45.     string(8) "humstree"
    46.     ["points"]=>
    47.     float(96275)
    48.     ["watch_time"]=>
    49.     float(53951)
    50.     ["vip"]=>
    51.     int(10)
    52.     ["mod"]=>
    53.     int(2)
    54.     ["join_date"]=>
    55.     string(27) "2015-02-21T12:51:44.1045925"
    56.     ["last_seen"]=>
    57.     string(26) "2017-02-08T17:51:05.419409"
    58.     ["vip_expiry"]=>
    59.     string(27) "2017-01-22T02:51:47.1697578"
    60.   }
    61. #####################################
    Композер реально упрощает жизнь и он очень удобен. Ну я тебе кину архив,тебе останется распаковать его в нужную папку и можешь протестировать нужные тебе функции.
    https://yadi.sk/d/tKGRItOS3DaNGt
     
    NerdRage нравится это.
  8. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Жееееесть сколько там всего. Это реально всё нужно?
    [​IMG]

    Спасибо за готовый вариант, в любом случае.) Оно работает, я только одной вещи не пойму. Допустим, я вызвал
    PHP:
    1. $bot->getUserPoints('humstree')
    После выполнения команды соединение разрывается? В браузере оно как бы разрывается, но в функции makeRequest чот не разберу что происходит. Сложный код для меня.)
     
  9. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Мне и без него просто, ЧЯДНТ ?
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @Abyss и как ты реализуешь установку/обновление дерева зависимостей?
     
    alexblack и denis01 нравится это.
  11. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    @Ganzal у тебя сейчас будет срыв шаблона, но у меня нет зависимостей. Всё что нужно для проекта написано вручную и работает как часы.
     
  12. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Ох уж этот абис. Борец с системой.
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @Abyss о ну типа крут. Такого комментария ожидал? А не будет. Ты собственно всё что мне нужно уже сказал - "всё что нужно для ПРОЕКТА". То есть, проект всего один, не несколько. И нет репозитория готовых библиотек. Конечно композитор тут нафиг не нужен.
     
  14. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Да, а сколько нужно ?
    Шта ?
    Репа есть, не переживай, но не готовых библиотек, а самого проекта.
    Не нужен, нужен дирижёр.
     
  15. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Ну видимо ты не работаешь с фреймворками,такими например как Slim3 или Zend Framework 3.Там без композера никуда
     
  16. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    [​IMG]