когда я использовал Google Tube API получить результат поиска, это дает 403 ошибку - PullRequest
0 голосов
/ 26 апреля 2020

// Когда я получаю ответ от youtube API, он выдает ошибку 403 в приведенном ниже коде службы и компонентов, он выдает ответ с ошибкой 404 с сообщением «Суточный лимит для использования без аутентификации превышен. Для продолжения использования требуется регистрация.»

export class YoutubeServiceService {
          constructor(
            private http: HttpClient,
            @Inject(YOUTUBE_API_KEY) private apiKey: string,
            @Inject(YOUTUBE_API_URL) private apiUrl: string
          ) {}

          search(query: string): Observable<SearchResult[]> {
            const params: string = [
              `q=${query}`,
              `part=${this.apiKey}`,
              `part=snippet`,
              `type=video`,
              `maxResults=8`,
            ].join('&');
            const queryUrl = `${this.apiUrl}?${params}`;
            return this.http.get(queryUrl).pipe(map((response) => {
              return <any>response['items'].map((item) => {
                console.log('raw items', item);
                return new SearchResult({
                  id: item.id.videoId,
                  title: item.snippet.title,
                  description: item.snippet.description,
                  thumbnailUrl: item.snippet.thumbnailUrl.high.url,
                });
              });
            })
            );
          }
        }

// это компонент поиска, где я хочу искать любые строки в поле ввода, чтобы получить данные

 import  
            {
                  Component,
                  OnInit,
                  Output,
                  ElementRef,
                  EventEmitter,
                } from '@angular/core';
                import { SearchResult } from '../search-result.model';
                import { YoutubeServiceService } from '../youtube-service/youtube-service.service';
                import { Observable, fromEvent } from 'rxjs';
                import { map, filter, debounceTime, switchAll ,tap} from 'rxjs/operators';
                @Component({
                  selector: 'app-search-box',
                  template: `<input type="text" class="form-control" placeholder="search"
                  autofocus >`
                })
        export class SearchBoxComponent implements OnInit {
          @Output() loading: EventEmitter<boolean> = new EventEmitter<boolean>();
          @Output() results: EventEmitter<SearchResult[]> = new EventEmitter<
            SearchResult[]
          >();

          constructor(private youtube: YoutubeServiceService, private el: ElementRef) {}

          ngOnInit(): void {
            fromEvent(this.el.nativeElement, 'keyup')
            .pipe(
              map((e: any) => e.target.value), //extract the value of the input
              filter((text: string) => text.length > 1) ,// filter pout if empty
              debounceTime(250), //only once every 250s
              tap(() => this.loading.emit(true)), //enable loading
              map((query: string) => this.youtube.search(query)), //search, discarding old events if new input comes in
              switchAll()
            )
              .subscribe(
                (results: SearchResult[]) => {
                  //on sucess
                  this.loading.emit(false);
                  this.results.emit(results);
                },
                (err: any) => {
                  //on error
                  console.log(err);
                  this.loading.emit(false);
                },
                () => {
                  // on completion
                  this.loading.emit(false);
                }
              );
          }
        }

1 Ответ

0 голосов
/ 26 апреля 2020

В вашей функции search() похоже, что вы устанавливаете свой ключ API в качестве параметра запроса "part". Ссылка API данных YouTube указывает, что ваш ключ API должен быть указан в параметре запроса "key".

Попробуйте установить строку params следующим образом:

const params: string = [
              `q=${query}`,
              `key=${this.apiKey}`,
              `part=snippet`,
              `type=video`,
              `maxResults=8`,
            ].join('&');

Я предполагаю YOUTUBE_API_URL указывает на конечную точку / search, документацию для которой можно посмотреть по адресу https://developers.google.com/youtube/v3/docs/search/list.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...