Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
10 / 9 / 5
Регистрация: 17.02.2016
Сообщений: 377

Исправить погрешность в коде

16.09.2020, 14:29. Показов 4043. Ответов 26

Студворк — интернет-сервис помощи студентам
Есть вот такой код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php 
echo get_subscriber("UCOshmVNmGce3iwozz55hpww");
 
function get_subscriber($channel,$use = "user") {
    (int) $subs = 0;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,            "https://www.youtube.com/".$use."/".$channel."/about?disable_polymer=1");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($ch, CURLOPT_POST,           0 ); 
    curl_setopt($ch, CURLOPT_REFERER, 'https://www.youtube.com/');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0');
    $result = curl_exec($ch);
    $R = curl_getinfo($ch);
    if($R["http_code"] == 200) {
        $pattern = '/yt-uix-tooltip" title="(.*)" tabindex/';
        preg_match($pattern, $result, $matches, PREG_OFFSET_CAPTURE);
        $subs = intval(str_replace(',','',$matches[1][0]));
    }
    if($subs == 0 && $use == "user") return get_subscriber($channel,"channel");
    return $subs;
}
Данный код выводит количество подписчиков ютуб канала, но выводит только трёх значное число, допустим если будет 000 и более количество, то он просто обрежет как "100", помогите это исправить пожалуйста.

Заранее большое спасибо за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2020, 14:29
Ответы с готовыми решениями:

Погрешность при вычислениях - исправить ошибку в коде
Program C1; Label 222; var d,U,V,y,R:real; begin write('Введите V,d,U'); readln(V,d,U); R:=(U*d)/V; if R&gt;9.2E5 then begin ...

Как добавить погрешность в коде VBA?
Люди знающие помогите пожалуйста с VBA очень плохо разбираюсь.... В общем сейчас программа считает только в том случает если сум всех...

Как исправить погрешность, чтобы результаты суммы и синуса были равны
Как можно исправить погрешность, чтобы результаты суммы и синуса были равны. Вот сам код: program primer; var x,u,E,s:real; ...

26
 Аватар для MouseZver
58 / 15 / 3
Регистрация: 03.08.2019
Сообщений: 82
03.01.2021, 17:49
Студворк — интернет-сервис помощи студентам
Да, у меня все прекрасно работает. Дергаю json

Добавлено через 2 минуты
Цитата Сообщение от evikza Посмотреть сообщение
Структуру JSON они, врядли, будут менять ближайшее время.
более полгода не меняют пока. только переменную туда-сюда крутят.
Миниатюры
Исправить погрешность в коде  
0
 Аватар для evikza
968 / 530 / 244
Регистрация: 20.05.2015
Сообщений: 776
03.01.2021, 22:00
Fruit, ну, примерно так:

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
<?php
 
function getChannelSubscribers($channelId)
{
  $baseUri = 'https://www.youtube.com/';
 
  $curl = curl_init();
 
  curl_setopt_array($curl, [
    CURLOPT_URL => $baseUri . 'channel/' . $channelId . '/about',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => [
      'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
    ],
  ]);
 
  $response = curl_exec($curl);
  curl_close($curl);
 
  $regexPattern = '/var ytInitialData = (\{.*\:\{.*\:.*\}\})/m';
  preg_match_all($regexPattern, $response, $matches, PREG_SET_ORDER, 0);
 
  return json_decode(
    $matches[0][1],
    true
  )['header']['c4TabbedHeaderRenderer']['subscriberCountText']['simpleText'];
}
 
echo getChannelSubscribers('UCOshmVNmGce3iwozz55hpww');
Code
1
317 подписчиков
1
10 / 9 / 5
Регистрация: 17.02.2016
Сообщений: 377
04.01.2021, 16:54  [ТС]
evikza, спасибо большое, всё работает.
Миниатюры
Исправить погрешность в коде   Исправить погрешность в коде  
0
 Аватар для MouseZver
58 / 15 / 3
Регистрация: 03.08.2019
Сообщений: 82
04.01.2021, 17:17
Вот личный инструмент, который собирает основную информацию о канале.
Рабочий код со множествами проверками для PHP 7.0 и выше.
Приятного аппетита.

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
<?php
 
declare ( strict_types = 1 );
 
// класс для парсинга данных с ютюб канала
final class YoubeChannel
{
    public static $messages = [
        1001 => 'Invalid link',
        1002 => 'Сhannel prefix not found',
        1003 => 'Invalid user id',
        1004 => 'No data received from the stream',
        1005 => 'YouTube api not detected',
    ];
    
    private $code = 0;
    
    private $url;
    
    private $regex_api_parsing = '/var ytInitialData = {(.+)};/';
    
    private $api = [];
    
    private $dataChannel = [];
    
    public function __construct ( string $url, array $msgs = null )
    {
        self :: $messages = $msgs ?? self :: $messages;
        
        $this -> validUrl( $url )
        &&
        $this -> stream()
        &&
        $this -> setData();
    }
    
    protected function validUrl( string $url ): bool
    {
        $path = trim ( parse_url ( $url, PHP_URL_PATH ), '/' );
        
        if ( empty ( $path ) || strpos ( $path, '/' ) === false )
        {
            $this -> code = 1001;
            
            return false;
        }
        
        list ( $prefix, $name ) = explode ( '/', $path );
        
        $this -> url = "https://www.youtube.com/{$prefix}/{$name}/about";
        
        switch ( $prefix )
        {
            case 'channel':
            {
                if ( preg_match ( '/^[\w+-]{24}$/', $name ) )
                {
                    return true;
                }
                
                $this -> code = 1003;
                
                return false;
            }
            case 'user':
            case 'c':
            {
                if ( preg_match ( '/^[\w+]{3,24}$/', $name ) )
                {
                    return true;
                }
                
                $this -> code = 1003;
                
                return false;
            }
            default:
            {
                $this -> code = 1002;
                
                return false;
            }
        }
    }
    
    protected function stream(): bool
    {
        // Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
        // error:14095126:SSL routines:ssl3_read_n:unexpected eof while reading
        
        /* $opts = [
            'ssl' => [
                'verify_peer' => false,
                'verify_perr_name' => false,
            ],
            'https' => [
                'method' => 'GET',
                'header' => 
                    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n" .
                    "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0\r\n"
            ],
        ];
        
        $contents = file_get_contents ( $this -> url, false, stream_context_create ( $opts ) ); */
        
        $curl = curl_init ();
        
        curl_setopt_array ( $curl, 
        [
            CURLOPT_URL             => $this -> url,
            CURLOPT_RETURNTRANSFER  => true,
            CURLOPT_ENCODING        => '',
            CURLOPT_MAXREDIRS       => 10,
            CURLOPT_TIMEOUT         => 0,
            CURLOPT_FOLLOWLOCATION  => true,
            CURLOPT_HTTP_VERSION    => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST   => 'GET',
            CURLOPT_HTTPHEADER      => [
                'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
                'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
            ],
        ] );
        
        $contents = curl_exec ( $curl );
        
        $code = curl_getinfo ( $curl, CURLINFO_HTTP_CODE );
        
        curl_close ( $curl );
        
        if ( empty ( $contents ) || $code != 200 )
        {
            $this -> code = 1004;
            
            return false;
        }
        
        if ( preg_match ( $this -> regex_api_parsing, $contents, $matches ) )
        {
            $this -> api = json_decode ( "{{$matches[1]}}", true );
            
            return true;
        }
        
        $this -> code = 1005;
        
        return false;
    }
    
    protected function map2api( string $map, string $delimiter = '.' )
    {
        $a = $this -> api;
        
        foreach ( explode ( $delimiter, $map ) AS $name )
        {
            $a = &$a[$name];
        }
        
        return $a;
    }
    
    protected function replaceCount( string $str ): int
    {
        if ( strstr ( $str, 'млн' ) )
        {
            return ( int ) floatval ( str_replace ( ',', '.', $str ) ) * 1000000;
        }
        
        if ( strstr ( $str, 'тыс' ) )
        {
            return ( int ) floatval ( str_replace ( ',', '.', $str ) ) * 1000;
        }
        
        return ( int ) preg_replace ( '/[^\d]/', '', $str );
    }
    
    protected function setData()
    {
        $this -> dataChannel['title'] = $this -> map2api( 'microformat.microformatDataRenderer.title' );
        
        $this -> dataChannel['description'] = $this -> map2api( 'metadata.channelMetadataRenderer.description' ) ?: 'Описание отсутствует';
        
        $subscriberCount = $this -> map2api( 'header.c4TabbedHeaderRenderer.subscriberCountText.simpleText' ) ?: '0';
        
        $this -> dataChannel['subscriberCount'] = $this -> replaceCount( $subscriberCount );
        
        $viewCount = $this -> map2api( 'contents.twoColumnBrowseResultsRenderer.tabs.5.tabRenderer.content.sectionListRenderer.contents.0.itemSectionRenderer.contents.0.channelAboutFullMetadataRenderer.viewCountText.simpleText' ) ?: '0';
        
        $this -> dataChannel['viewCount'] = $this -> replaceCount( $viewCount );
        
        $this -> dataChannel['avatar'] = $this -> map2api( 'header.c4TabbedHeaderRenderer.avatar.thumbnails.2.url' );
        
        $this -> dataChannel['tags'] = implode ( ',', ( $this -> map2api( 'microformat.microformatDataRenderer.tags' ) ?: [ 'Отсутствуют' ] ) );
    }
    
    public function isError(): bool
    {
        return ! empty ( $this -> code );
    }
    
    public function getCode(): int
    {
        return $this -> code;
    }
    
    public function getMessage( int $code ): string
    {
        return self :: $messages[$code] ?? __CLASS__;
    }
    
    public function getData( string $name = null )
    {
        if ( isset ( $this -> dataChannel[$name] ) )
        {
            return $this -> dataChannel[$name];
        }
        
        return $this -> dataChannel;
    }
}

api func:
PHP
1
2
3
4
5
6
7
8
9
10
$a = new YoubeChannel( 'https://www.youtube.com/channel/UCpwFVuATxG2m4A4vSqWCvDA' );
 
if ( $a -> isError() )
{
    echo $a -> getMessage( $a -> getCode() );
}
else
{
    print_r ( $a -> getData() );
}
result:
PHP
1
2
3
4
5
6
7
8
9
Array
(
    [title] => love korea
    [description] => Зарисовки из жизни мультикультурной семьи в Южной Корее.
    [subscriberCount] => 764000
    [viewCount] => 150086975
    [avatar] => https://yt3.ggpht.com/ytc/AAUvwngHPwYvb3_cqHEQBQx4g4NmpOw9WbLw1AIXhKF_Tg=s176-c-k-c0x00ffffff-no-rj
    [tags] => Южная Корея,жизнь в Южной Корее,семья в Южной Корее,Корея,блог о Южной Корее,влог из Южной Кореи,всё о Южной Корее,Интересные факты о Корее,как живут в Корее,как живут в южной корее,брак с корейцем,корейский быт,корейский досуг,интересные места в южной корее,всё о корее
)
2
 Аватар для evikza
968 / 530 / 244
Регистрация: 20.05.2015
Сообщений: 776
04.01.2021, 18:15
Fruit, обновите скрипт. Выводилась ошибка, если количество подписчиков скрыто или отсутствовало.

Так же, воспользовался регулярным выражение от MouseZver. Моя отдавала на некоторых запросах невалидный JSON.

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
<?php
 
function getChannelSubscribers($channelId)
{
  $baseUri = 'https://www.youtube.com/';
 
  $curl = curl_init();
 
  curl_setopt_array($curl, [
    CURLOPT_URL => $baseUri . 'channel/' . $channelId . '/about',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => [
      'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
    ],
  ]);
 
  $response = curl_exec($curl);
  curl_close($curl);
 
  $regexPattern = '/var ytInitialData = {(.+)};/';
  preg_match_all($regexPattern, $response, $matches, PREG_SET_ORDER, 0);
 
  $prepSubscribersCount_ = json_decode("{{$matches[0][1]}}", true)['header'][
    'c4TabbedHeaderRenderer'
  ]['subscriberCountText']['simpleText'];
 
  return $subscribersCount = $prepSubscribersCount_
    ? $prepSubscribersCount_
    : 'Информация о подписчиках отсутствует';
}
 
echo getChannelSubscribers('UCLdH6JccXs19m7pE4XfDU9g');
1
 Аватар для MouseZver
58 / 15 / 3
Регистрация: 03.08.2019
Сообщений: 82
04.01.2021, 23:36
Обновить метод stream в классе.
Без участия cURL
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
    protected function stream(): bool
    {
        $opts = [
            'http' => [
                'method' => 'GET',
                'header' => 
                    "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n" .
                    "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0\r\n"
            ],
        ];
        
        $contents = file_get_contents ( $this -> url, false, stream_context_create ( $opts ) );
        
        if ( empty ( $contents ) )
        {
            $this -> code = 1004;
            
            return false;
        }
        
        if ( preg_match ( $this -> regex_api_parsing, $contents, $matches ) )
        {
            $this -> api = json_decode ( "{{$matches[1]}}", true );
            
            return true;
        }
        
        $this -> code = 1005;
        
        return false;
    }
Я так и не понял, почему у меня OpenServer ругался на такой подход с заменой cURL. Включил снова - ошибки Нет.

Добавлено через 39 секунд
PHP
1
2
        // Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
        // error:14095126:SSL routines:ssl3_read_n:unexpected eof while reading
1
10 / 9 / 5
Регистрация: 17.02.2016
Сообщений: 377
05.01.2021, 11:35  [ТС]
MouseZver, evikza, Спасибо Вам большое!!!

Надеюсь данную тему не закроют, так как в интернете мало решений по выводу количества подписчиков канала, а если и есть то в 95% они не рабочие и устаревшие.

Добавлено через 1 минуту
Ну а я, пошёл теперь искать способ вывода количества подписчиков канала на твиче
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2021, 11:35

Как исправить исправить ошибку в коде
Здравствуйте,помогите пожалуйста исправить ошибку в коде.using System; using System.Threading; namespace Gorokhov_2 { class...

Нужно посчитать погрешность измерений (по примеру). Мне не ясно из примера как нашли погрешность
Нужно посчитать погрешность измерений.(по примеру) Мне не ясно из примера как нашли погрешность, понятно,что искали дифференциал, но почему...

Исправить ошибки в коде
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...

Исправить ошибку в коде
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; typedef struct avto{ char marka; ...

Исправить ошибки в коде
define B booboo define X 10 main(int) { int age; char name; printf(&quot;Please enter your first name.&quot;); ...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru