Форум программистов, компьютерный форум, киберфорум
PHP: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
vz
2 / 2 / 0
Регистрация: 08.10.2012
Сообщений: 23

API yandex "Оригинальные тексты" добавление

03.07.2013, 10:35. Показов 6164. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь настроить автоматизированное добавление текстов в Яндекс.
Зарегистрировал приложение, получил токен.
Написал такой скрипт:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
error_reporting( E_ALL & E_STRICT );
 
ini_set('display_errors', 1);
 
$token = '712e3bfb00044fa3a0de4df3988ef487';
 
 
 
$headers= array(
 
         'POST' => '/api/v2/hosts/09dc1cfa829438cb649bb74639d4577/original-texts/ HTTP/1.1',
 
        'Host'=> 'webmaster.yandex.ru', 
 
        'Authorization'=> 'OAuth '.$token, 
 
        'Content-Length'=> '1000',
 
'Content-type'=> 'application/x-www-form-urlencoded');
 
 
 
$url = "https://oauth.yandex.ru/";
 
 
 
$text = ' Мой новый текст....';
 
 
 
$data = urlencode('<original-text><content>'.$text.'</content></original-text>');
 
 
 
    $handle=curl_init() ;
 
    curl_setopt($handle, CURLOPT_URL, $url);
 
    curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
 
    curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
 
    curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
 
    curl_setopt($handle, CURLOPT_POST, true);
 
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
 
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
 
    curl_setopt($handle, CURLOPT_USERAGENT, 'mysite.my');
 
    $response=curl_exec($handle);
 
    $code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
 
    return array("code"=>$code,"response"=>$response);
 
   // var_dump($response);
При обращение получаю белый экран...
Что делаю не так, подскажите пожалуйста.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2013, 10:35
Ответы с готовыми решениями:

"Оригинальные тексты" удаление - PHP
Здравствуйте, возникла проблема с удалением определенного оригинального текста по ID Добавлено через 10 минут # Функция для курления...

Yandex api.directory.yandex.net создание почтового ящика
Добрый день. Пишу скрипт для создания почтовых ящиков на Яндекс.Коннект с использованием API...

Yandex API
Добрый день форумчанам! Просьба откликнуться имеющим опыт в написании Яндекс API приложений. Ну или другим гуру =) Итак, необходимо...

3
 Аватар для AndreyDyakonov
122 / 120 / 7
Регистрация: 21.04.2013
Сообщений: 615
03.07.2013, 13:01
у вас нигде нет вывода... узер агент несколько странновато выглядит, может как-то так:
PHP
1
curl_setopt($handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11');
для установки других опций вы используете true-false.. привычнее вместо них видеть числа

Добавлено через 1 минуту
curl_close не мешало бы вызвать
1
vz
2 / 2 / 0
Регистрация: 08.10.2012
Сообщений: 23
19.08.2014, 09:49  [ТС]
Спустя год. Снова вернулся к данной теме.
Решил задачу и хочу поделится наработкой...
Так как простых и готовых решений на просторах интернета не нашел.

Идеи позаимствованы с данного поста, код по большому счету взят поправлен и доработан из плагина для WordPress плагин распространяется под свободной лицензией GNU General Public License, version 2, поэтому права не нарушены

Но вот и сам код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
    # Включаем ошибки
    error_reporting( E_ALL & E_STRICT );
    ini_set('display_errors', 1);
 
    # Определяем константы
    define('CLIENT_ID', '??????');
    define('CLIENT_SECRET', '???????');
    define('YANDEX_TOKEN', '??????');
    define('WEBSITE_ID', '????');
    define('YANDEX_WEBMASTER_HOST', 'webmaster.yandex.ru');
    define('YANDEX_API_REQUEST_TIMEOUT', 30);
    
    # Функция для курления
    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);
        }
    # Функция отправки текста
    function sendTextToYandex($text) {
        $url = "/api/v2/hosts/" . WEBSITE_ID . "/original-texts/";
        $text = urlencode($text);
        $text = "<original-text><content>{$text}</content></original-text>";
        $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} {$url} HTTP/1.1",
            'Host: webmaster.yandex.ru',
            'Authorization: OAuth '.YANDEX_TOKEN
        );
 
        $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;
        }
 
 
    if(YANDEX_TOKEN == '')
    {   
        # Когда у нас нет токена, получаем проверочный код, Далее забираем параметр code="XXXX" и передаем его в гет /script.php?code="XXXX"
        if (!isset($_GET["code"])) {
            Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".CLIENT_ID);
            die();
            }
 
        $url = 'https://oauth.yandex.ru/token';
        
        $postData = 'grant_type=authorization_code&code='.$_GET["code"].'&client_id='.CLIENT_ID.'&client_secret='.CLIENT_SECRET;
        # Загаловки
        $headers = array(
            'POST /token HTTP/1.1',
            'Host: oauth.yandex.ru',
            'Content-type: application/x-www-form-urlencoded',
            'Content-Length: ' . strlen($postData),
        );
        # Создаем массив для курления
        $curlOptions = array(
            CURLOPT_POST            => 1,
            CURLOPT_HEADER          => 0,
            CURLOPT_URL             => $url,
            CURLOPT_CONNECTTIMEOUT  => 1,
            CURLOPT_FRESH_CONNECT   => 1,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_FORBID_REUSE    => 1,
            CURLOPT_TIMEOUT         => 5,
            CURLOPT_SSL_VERIFYPEER  => false,
            CURLOPT_POSTFIELDS      => $postData,
            CURLOPT_HTTPHEADER      => $headers
        );
        # Получаем результат запроса
        $response = getPage($curlOptions);
        # Если все отлично и вернулся токен, то вывожу его на экран
        if ($response['info']['http_code'] == 200) {
            $liveToken = json_decode($response['result']);
 
            echo 'Token: '.$liveToken->access_token.'<br> Will live up to: '.(date('F j, Y, g:i a', time()+$liveToken->expires_in));
            
        }
        # Если время жизни проверочного кода иссяк (он живет очень коротко, я так понял несколько секунд...), то вывожу сообщение об ошибке на экран
        elseif($response['info']['http_code'] == 400){
            $error = json_decode($response['result']);
            echo 'Error:  '.$response['info']['http_code'].', '.$error->error_description;
        }
    }
    # Если токен получен, можно приступить к добавлению "Оригинального текста"
    else
    {
        # Minimum length is 500
        $text = 'Здесь передаем наш текст...';
        # Стартуем добавление текста
        $response = sendTextToYandex($text);
        # Выводим на монитор результат выполненного запроса (вернется либо ошибка, либо уведомление о добавленном тексте)
        print "<pre>";
        print "\nHTTP CODE: " . $response['info']['http_code'];
        print "\nURL:" . $response['info']['url'];
        print "\n ------------------ Response from Yandex: ---------------------\n\n";
        var_dump($response['result']);
        print "</pre>";
        # Удачи :)
    }
Думаю поможет кому-то, кто как я обломался об документацию яндекс...

Добавлено через 23 часа 50 минут
Еще нюанс...
Если текст забираем из БД, как правило он там в html-виде хранится, надо его почистить от тегов но это пол дела
самое поганое что спецсимволы заменяющие пробелы ковычки и тп... могут ломать xml и яндекс вернет ошибку.
лекарство
PHP
1
2
3
4
# Удяляем теги
$text = strip_tags($text);
# Преобразуем спецсимволы в человеческие
$text = html_entity_decode($text);
Получаем чистый удобоваримый API yandex текст.

Добавлено через 21 час 5 минут
Еще нюанс
yandex также возвращает
XML
1
2
3
------------------ Response from Yandex: ---------------------
                <?xml version="1.0" encoding="UTF-8"?>
<error code="ILLEGAL_PARAM_VALUE"><message>Incorrect xml</message></error>
Если в тексте встречается амперсанд
Нужно его заменять на удобоворимый в xml спецсимвол
PHP
1
$text = str_replace('&', '&amp;', $text);
Думаю не зря выкладываю эти фиксы, кому-то да поможет без гемора все собрать
1
Di89
07.10.2014, 15:23
vz, Возникки проблемы с добавлением оригинальных текстов ( Как можно с вами связаться может подскажите в каком направлении двигаться?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2014, 15:23
Помогаю со студенческими работами здесь

Yandex api 1 --> 2.0
Здравствуйте. Мой вопрос касается яндекс карт, для затоков явы думаю он труда не составит. Имеется вполне рабочий код, применяю в 1с для...

Yandex api
Приветствую, скажите пожалуйста что я в запросе не правильно строю, что мне при отправке запроса нечего не приходит void...

Yandex API
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; &lt;head&gt; &lt;title&gt;Untitled Page&lt;/title&gt; &lt;SCRIPT type=&quot;text/javascript&quot;&gt; ...

API Yandex.Money
Здравствуйте недавно начал изучать php и Yandex money SDK для php (https://github.com/yandex-money/yandex-money-sdk-php) и столкнулся с...

API Yandex Погода
Добрый день Ребята подскажите как сделать get запрос апи яндекс погоды https://api.weather.yandex.ru/v1/forecast? Имеется апи ключ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru