Как получить данные для URL-адреса канала без идентификатора или имени пользователя?

#youtube #youtube-api #youtube-data-api

#YouTube #youtube-api #youtube-data-api

Вопрос:

Я только что наткнулся на URL-адрес YouTube https://www.youtube.com/u2 . Это приводит к странице канала. Когда я нажимаю на видео канала, а затем на ссылку на канал видео, я возвращаюсь на ту же страницу, но с URL https://www.youtube.com/channel/UC4gPNusMDwx2Xm-YI35AkCA .

Но как я могу перейти от https://www.youtube.com/u2 чтобы https://www.youtube.com/channel/UC4gPNusMDwx2Xm-YI35AkCA используя API данных YouTube? Ссылка на API для канала не документирует способ сделать это. Я могу выполнить поиск u2 с типом channel , и это даст мне идентификатор канала, но также даст мне другие идентификаторы каналов. И для канала, похоже, нет данных, которые перечисляют https://www.youtube.com/u2 в качестве альтернативного URL-адреса.

Ответ №1:

Если нет способа получить идентификатор канала через API (чего я точно не знаю), что должно сработать, так это загрузка сайта (и т. Д. С Использованием curl или предпочтительного способа выполнения HTTP-запросов на ваших языках программирования) и его анализ. Ссылка на фактическую страницу канала содержится пару раз в исходном HTML (в <head> ), как вы можете видеть из этого отрывка:

 <link rel="canonical" href="https://www.youtube.com/channel/UC4gPNusMDwx2Xm-YI35AkCA">

<meta property="og:site_name" content="YouTube">
<meta property="og:url" content="https://www.youtube.com/channel/UC4gPNusMDwx2Xm-YI35AkCA">
<meta property="og:title" content="U2">
<meta property="og:description" content="Rock band from Dublin, Ireland. Adam Clayton on Bass. The Edge on Guitar. Larry Mullen Jr on Drums. Bono on Vocals. http://www.u2.com">
 

Даже если вы не хотите полностью анализировать сайт и извлекать информацию из заголовка, поиск по регулярным выражениям с <link rel="canonical" href="https://www.youtube.com/channel/(. )"> помощью может помочь, но имейте в виду, что это не гарантирует 100%-ную работу.

Комментарии:

1. Спасибо. Это хорошо работает и с jsoup ( jsoup.org ) это всего лишь несколько строк кода. Итак, на данный момент моя проблема решена, и я поддержал ваш ответ, но я неохотно отмечаю его как правильный ответ, поскольку это неофициальное решение, которое может быть нарушено в будущем без предварительного уведомления.

2. Я бы тоже хотел найти другой способ, кроме использования регулярного выражения.

Ответ №2:

Я не знаю, не нашел ли я его, когда опубликовал вопрос, или он новый, но теперь API данных YouTube имеет snippet.customUrl для каналов, что "u2" в данном примере. Итак, вы можете сделать это:

 // Kotlin

fun getChannelById(id: String): Channel? =
    youTube.channels().list("id, snippet")
        .setKey(apiKey)
        .setId(id)
        .execute()
        .items
        ?.single()

private fun getChannelByCustomUrl(customUrl: String): Channel? =
    youTube.search().list("id, snippet")
        .setKey(apiKey)
        .setType("channel")
        .setQ(customUrl)
        // .setMaxResults(5) // The default value 5 should suffice.
        .execute()
        .items
        ?.asSequence()
        ?.mapNotNull {
            // Can be null when channel has been deleted just after search().
            this.getChannelById(it.snippet.channelId)
        }
        ?.firstOrNull { it.snippet.customUrl == customUrl }