Di sini saya bekerja dengan YouTube Data API dan mencoba mendapatkan judul video YouTube dengan JSON, tetapi saya mendapatkan KeyError at /videos/compose/ 'items'.

Bisakah kalian memberi tahu saya apa yang salah di sini; Saya telah mencetak variabel video_id dan itu benar, tetapi masih mendapatkan kesalahan saat mengambil judul video.

views.py:

class VideoCreateView(CreateView):
    model = Video
    form_class = VideoForm
    template_name = "videos/video_form.html"
    def form_valid(self, form):
        video = Video()
        video.url = form.cleaned_data['url']
        parse = urllib.parse.urlparse(video.url)
        video_id = urllib.parse.parse_qs(parse.query).get('v')
        if video_id:
            video.youtube_id =video_id[0]
            response = requests.get(f'https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id={video_id[0]}&key=[{ YOUTUBE_API_KEY }]')
            json = response.json()
            title = json["items"][0]["snippet"]["title"]
            video.title = title
            video.save()
        return super().form_valid(form)

urls.py:

app_name = 'videos'

urlpatterns = [
    path('compose/',views.VideoCreateView.as_view(),name='new'),
    path('video/<str:slug>/',views.VideoDetailView.as_view(),name='video_detail'),
]

Jika lebih banyak kode diperlukan, beri tahu saya di komentar di bawah; Saya akan memperbarui pertanyaan saya dengan informasi yang diperlukan.

Di terminal, ketika saya mencetak respons JSON, itu menunjukkan kepada saya:

{'error': {'code': 400, 'message': 'API key not valid. Please pass a valid API key.', 'errors': [{'message': 'API key not valid. Please pass a valid API key.', 'domain': 'global', 'reason': 'badRequest'}], 'status': 'INVALID_ARGUMENT'}},

Tapi saya memasukkan YOUTUBE_API_KEY yang benar. Ini dia:

import requests
import urllib


YOUTUBE_API_KEY = 'AIzaSyBdeXR_2YF4***IIeywL08JSUm2zc*******'
-1
Ahmed Yasin 7 November 2020, 16:20

1 menjawab

Jawaban Terbaik

Berikut adalah output yang dihasilkan oleh titik akhir API Videos.list saat meneruskan ke kunci API yang tidak valid seperti pada URL yang ditampilkan:

  1. Kosong key:
$ wget -qO- --content-on-error \
"https://www.googleapis.com/youtube/v3/videos?id=foobar&part=snippet&key="
{
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "errors": [
      {
        "message": "The request is missing a valid API key.",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
}
  1. key adalah barbaz:
$ wget -qO- --content-on-error \
"https://www.googleapis.com/youtube/v3/videos?id=foobar&part=snippet&key=barbaz"
{
  "error": {
    "code": 400,
    "message": "API key not valid. Please pass a valid API key.",
    "errors": [
      {
        "message": "API key not valid. Please pass a valid API key.",
        "domain": "global",
        "reason": "badRequest"
      }
    ],
    "status": "INVALID_ARGUMENT"
  }
}

Untuk memperbaiki kode Anda, miliki string URL Anda sebagai:

f'https://youtube.googleapis.com/youtube/v3/videos?part=snippet&id={video_id[0]}&key={YOUTUBE_API_KEY}'.

Perhatikan tanda kurung siku dan spasi yang dihilangkan di sekitar YOUTUBE_API_KEY.


Berikut adalah output yang dihasilkan oleh titik akhir API Videos.list saat meneruskan ID video yang tidak valid seperti pada URL yang ditampilkan (dengan asumsi bahwa nilai parameter key adalah kunci API yang valid):

$ wget -qO- --content-on-error \
"https://www.googleapis.com/youtube/v3/videos?id=foobar&part=snippet&key=..."
{
  "kind": "youtube#videoListResponse",
  "etag": "...",
  "items": [],
  "pageInfo": {
    "totalResults": 0,
    "resultsPerPage": 0
  }
}

Perhatikan bahwa array items kosong. Ini menjelaskan pengecualian IndexError yang diperoleh oleh kode Anda.

Perbaikan kode Anda adalah sebagai berikut:

json = response.json()
items = json["items"]
assert len(items) <= 1
if len(items):
    title = items[0]["snippet"]["title"]
else:
    title = "N/A"

Anda juga dapat menghasilkan semacam pesan kesalahan jika len(items) == 0; yang memiliki arti sebagai berikut: video yang dirujuk oleh ID yang diberikan tidak ada.

2
stvar 7 November 2020, 14:58