Whois работает с fsockopen, а не с curl

Это работает:

$connection = fsockopen("whois.iis.se", 43);
fputs($connection, "google.se\r\n");
while (!feof($connection)) {
    $data .= fgets($connection, 4096);
}
fclose($connection);
echo nl2br($data);

Но это не работает:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "whois.iis.se");
curl_setopt($ch, CURLOPT_PORT, 43);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "google.se\r\n");
$data = curl_exec($ch); 
curl_close($ch);
echo nl2br($data);

Что не так с этой функцией curl?


person cbm    schedule 16.05.2017    source источник


Ответы (1)


Я знаю, что этому год, но: принятый ответ неверен. cURL на самом деле имел функциональность для поддержки протокола Whois, но для этого требуется немного больше, чем простой запрос.

Я не знаю точного перевода на PHP, но я думаю, что для поддержки TELNET нужно просто изменить параметры, поскольку это то, что использует Whois:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_TELNET);

Наконец, как только вы получите ответ, вам, возможно, придется иметь дело с рефералами, если только вы не обращаетесь к прямому серверу Whois, на котором есть фактические данные WhoIs. Для сервера Whois в этом примере он должен возвращать адреса mot как ответ для google.se.

Эта поддержка была в нем уже давно, я думаю, еще до того, как был задан этот вопрос.


ОБНОВИТЬ:

Извините, на самом деле я мало работал с PHP и PHP CURL, но у меня получилось следующее. Это не идеально, но не лучший способ справиться со стандартным вводом данных.

$filename = "query.txt";
$fp = fopen($filename, "r");

function readFunc($ch, $fh, $length = false) {
  return fread($fh, $length);
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "telnet://whois.iis.se:43");
curl_setopt($ch, CURLOPT_PORT, 43);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_NOPROGRESS, TRUE);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_TELNET);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
curl_setopt($ch, CURLOPT_READFUNCTION, 'readFunc');
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);  // Can take this out

$data = curl_exec($ch);
curl_close($ch);
echo nl2br($data);

Затем это возвращает:

$ php query.php
* Rebuilt URL to: telnet://whois.iis.se:43/
*   Trying 91.226.37.83...
* TCP_NODELAY set
* Connected to whois.iis.se (91.226.37.83) port 43 (#0)
* Closing connection 0
# Copyright (c) 1997- IIS (The Internet Foundation In Sweden).<br />
# All rights reserved.<br />
# The information obtained through searches, or otherwise, is protected<br />
# by the Swedish Copyright Act (1960:729) and international conventions.<br />
# It is also subject to database protection according to the Swedish<br />
# Copyright Act.<br />
# Any use of this material to target advertising or<br />
# similar activities is forbidden and will be prosecuted.<br />
# If any of the information below is transferred to a third<br />
# party, it must be done in its entirety. This server must<br />
# not be used as a backend for a search engine.<br />
# Result of search for registered domain names under<br />
# the .se top level domain.<br />
# This whois printout is printed with UTF-8 encoding.<br />
#<br />
state:            active<br />
domain:           google.se<br />
holder:           mmr8008-53808<br />
admin-c:          -<br />
tech-c:           -<br />
billing-c:        -<br />
created:          2008-10-20<br />
modified:         2016-09-18<br />
expires:          2017-10-20<br />
transferred:      2009-03-06<br />
nserver:          ns1.google.com<br />
nserver:          ns2.google.com<br />
nserver:          ns3.google.com<br />
nserver:          ns4.google.com<br />
dnssec:           unsigned delegation<br />
status:           serverDeleteProhibited<br />
status:           serverTransferProhibited<br />
status:           serverUpdateProhibited<br />
registrar:        MarkMonitor Inc<br />

Если вам нужно, чтобы он работал со случайными строками, вы можете легко просто записать во временный файл и использовать его для передачи в функцию. К сожалению, у меня нет времени, чтобы продолжать копаться в параметрах PHP curl, чтобы определить, какой вариант лучше всего подходит для потоковой передачи данных на сервер WHOIS.

В файле query.txt есть только google.se.

person richardhsu    schedule 24.07.2017
comment
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_TELNET); Не работает на google.se - person cbm; 31.07.2017
comment
См. обновление вопроса о том, как заставить TELNET работать. - person richardhsu; 03.08.2017
comment
У меня есть +1 к вашему ответу за ваши подробные сведения, но я все еще думаю, что это неправильная идея использовать в основном HTTP-библиотеку для подключения к серверам whois, поскольку они очень просто доступны как TCP-сокет на порту 43, поэтому они не нужны все поделки в сложной библиотеке HTTP. Существуют также библиотеки PHP, предназначенные для выполнения запросов whois. - person Patrick Mevzek; 08.01.2018
comment
Просто заметка. Если это на сервере общего хостинга, этот подход не сработает. Большинству учетных записей виртуального хостинга не разрешено открывать порты из соображений безопасности. Для серверов общего хостинга вам следует попробовать WhoIs API, который будет возвращать данные поиска whois в формате XML или JSON. Подробнее см.... whois.arin.net/ui - person Epiphany; 09.08.2018