Добавление оригинального текста в вебмастер

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.527
Реакции
121
Раньше все добавлялось. После переноса сайта на https нужно было создать новое приложение. Внес параметры в конфиг и ничего не работает. Не могу понять, что в новом (v3) API изменилось по сравнению с v2.
js отправляет данные в php скрипт, там курлом формируется массив данных и отправляется яндексу. Но возвращается ошибка.
То, что передается в функцию getPage:
Код:
<pre>Array
(
    [10002] => https://webmaster.yandex.net/v3/user/22342406/https:site.ru:443/original-texts/

    [64] => 0
    [78] => 30
    [10023] => Array
        (
            [0] => POST https://webmaster.yandex.net/v3/user/22342406/https:site.ru:443/original-texts
/HTTPS/1.1
            [1] => Host: webmaster.yandex.net
            [2] => Authorization: OAuth AQFDSf3456ABUcJuAAPGSDGdgDq_3k8MreYd9pmV2lE
            [3] => Content-Length: 4245
        )

    [19913] => 1
    [10015] => <Data><content>закодированный текст</content></Data>
)
</pre>
Что не так передаю?
Код (не мой:(
PHP:
# Функция отправки текста
function sendTextToYandex($text) {
  $url = "/v3/user/".USER_ID."/" . WEBSITE_ID . "/original-texts/";
  $text = urlencode($text);
  $text = "<Data><content>{$text}</content></Data>";
  $additionalHeaders = array('Content-Length: ' . strlen($text));
  $curlOptions = array(CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_POSTFIELDS => $text);
  $response = performYandexWebmasterApiRequest($url, 'POST', $curlOptions, $additionalHeaders);
  return $response;
  }
# Функция непосредственной подготовки на выполнения запроса добавления уникального текста
function performYandexWebmasterApiRequest($url, $requestType = 'GET', $curlOptions = array(), $additionalHeaders = array()) {
  $headers = array(
  "{$requestType} https://" . YANDEX_WEBMASTER_HOST . $url ."HTTPS/1.1",
  'Host: webmaster.yandex.net',
  'Authorization: OAuth '.YANDEX_TOKEN
  //https://api.webmaster.yandex.net/v3/user/{user-id}/hosts/{host-id}/original-texts/
  );

  $headers = array_merge($headers, $additionalHeaders);
  $requestOptions = array(
  CURLOPT_URL => 'https://' . YANDEX_WEBMASTER_HOST . $url,
  CURLOPT_SSL_VERIFYPEER => 0,
  CURLOPT_CONNECTTIMEOUT => YANDEX_API_REQUEST_TIMEOUT,
  CURLOPT_HTTPHEADER => $headers,
  CURLOPT_RETURNTRANSFER => 1
  );
  if (count($curlOptions)) {
  foreach ($curlOptions as $curlOption => $curlOptionValue) {
  $requestOptions[$curlOption] = $curlOptionValue;
  }
  }
  $response = getPage($requestOptions);
  return $response;
  }
# Функция для курления
function getPage($curlOptions = array()) {
  $ch = curl_init();
  curl_setopt_array($ch, $curlOptions);
  $result = curl_exec($ch);
  $info = curl_getinfo($ch);
  return array('result' => $result, 'info' => $info);
  }
Что не так делаю?
 
USER_ID, WEBSITE_ID, YANDEX_TOKEN указали?
Какую ошибку получаете?
 
USER_ID, WEBSITE_ID, YANDEX_TOKEN указали?
Какую ошибку получаете?
да все указал. Ошибка 403. Меняю id сайта на новый вариант написания (https:site.ru:443 вместо 123456) и все, выдает ошибку
 
Для просмотра ссылки Войди или Зарегистрируйся - готовый класс от яндекса
Для работы переименовать config.example.php, предварительно настроив

Добавление хоста:
$wmApi = new webmasterApi($token);
$ret = $wmApi->addHost($url);
$hostID= $ret->host_id;

Отправка текста:
$postOTres = $wmApi->addOriginalText($hostID, $_POST['content']);
 
Для просмотра ссылки Войди или Зарегистрируйся - готовый класс от яндекса
Для работы переименовать config.example.php, предварительно настроив

Добавление хоста:
$wmApi = new webmasterApi($token);
$ret = $wmApi->addHost($url);
$hostID= $ret->host_id;

Отправка текста:
$postOTres = $wmApi->addOriginalText($hostID, $_POST['content']);
не могу понять, как запустить демку эту... /example/
указал в конфиге id приложения и пасс к нему. Меня перебрасывает на получение временного кода (который нужен для получения токена) Для просмотра ссылки Войди или Зарегистрируйся
Видио из-за callbackurl в настройках приложения.
Но куда его сохранять, не пойму.

Заменил в .auth.php код $_GET['code'] на $code, его указал в config.php. Все пошло дальше. Но в function getAccessToken возвращает ошибку: Unknown error in curl
Кусок кода получения токена:
PHP:
static function getAccessToken($code, $client_id, $client_secret)
    {
        $postData = array("grant_type" => "authorization_code", "code" => $code, "client_id" => $client_id, "client_secret" => $client_secret);
        // print_r($client_secret); die();
        $ch = curl_init('https://oauth.yandex.ru/token');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
        curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);


        $response = curl_exec($ch);
        curl_close($ch);
       
        if (!$response) die('Unknown error in curl');

        $response = json_decode($response);

        if (!is_object($response)) die('Unknown error in curl');


        return $response;
    }
 
Последнее редактирование:
Для начала надо сделать print_r($response); чтобы понять ответ приходит пустой или обьекта там нету.
И в начало скрипта прописать error_reporting(E_ALL);
 
Для начала надо сделать print_r($response); чтобы понять ответ приходит пустой или обьекта там нету.
И в начало скрипта прописать error_reporting(E_ALL);
а там пусто, ничего вообще не приходит.
Делаю так:
$response = curl_exec($ch);
curl_close($ch);
print_r( $response ); die();
белая страница
 
Последнее редактирование:
Ни один адрес через curl не открывает, никакие страницы. Что-то в этом методе (getAccessToken) не то
 
Вот ссылочка на пример callback
Для просмотра ссылки Войди или Зарегистрируйся
скорее всего параметр не передается этот, потому и ответа нету
 
Вот ссылочка на пример callback
Для просмотра ссылки Войди или Зарегистрируйся
скорее всего параметр не передается этот, потому и ответа нету
Нет, дело не в этом. Это уже пройденный путь... Это проблема, описанная ранее... Даже если и так сделать: указал в приложении обратный url для получения code. После чего меня все равно перекидывает на метод getAccessToken - получение токена по коду. Это и правильно. Но curl не хочет работать - пустая страница. Ни одна страница по curl не загружается.

Кстати, добавил строки в метод:

PHP:
$info = curl_getinfo($ch);
print_r($info); die();

Выводятся данные:
PHP:
Array
(
    [url] => https://oauth.yandex.ru/token
    [content_type] =>
    [http_code] => 0
    [header_size] => 0
    [request_size] => 0
    [filetime] => -1
    [ssl_verify_result] => 1
    [redirect_count] => 0
    [total_time] => 0.047
    [namelookup_time] => 0
    [connect_time] => 0.016
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0
    [redirect_time] => 0
    [certinfo] => Array
        (
        )

    [primary_ip] => 97.160.144.114
    [primary_port] => 453
    [local_ip] => 192.168.100.2
    [local_port] => 62067
    [redirect_url] =>
)
Проблемы в коде метода:
PHP:
$ch = curl_init('https://oauth.yandex.ru/token');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
        curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        $response = curl_exec($ch);
        curl_close($ch);
 
Последнее редактирование:
Назад
Сверху