Статьи

Подключитесь к Twitter API в приложении Angular 6

В этом руководстве вы узнаете, как проходить аутентификацию и подключаться к API Twitter с помощью Node.js и Angular 6. К концу этого руководства вы сделаете следующее:

  • аутентифицироваться с помощью Twitter API
  • публиковать твиты с помощью API Twitter
  • читать временную шкалу Twitter с помощью API Twitter
  • и более!

Мы начнем с создания Node-сервера, который будет обрабатывать взаимодействие с API Twitter. Первым шагом будет регистрация нового приложения, чтобы получить учетные данные, чтобы начать использовать Twitter API.

Просто зайдите на https://apps.twitter.com/ , создайте новое приложение и заполните все необходимые данные — например, имя приложения, описание и URL-адрес. После создания приложения вам потребуется создать уникальные ключи для вашего приложения. Для этого просто перейдите на вкладку « Ключи и токен доступа » и нажмите « Создать мой токен доступа».   Кнопка расположена внизу страницы.

Приложение сгенерирует четыре ключа следующим образом:

  • Ключ потребителя (ключ API)
  • Consumer Secret (секрет API)
  • Токен доступа
  • Секрет токена доступа

Пожалуйста, запомните приведенные выше ключи, так как они пригодятся позже.

Создайте каталог для кода сервера, создайте . j son файл, запустив npm init и создайте файл server.js .

1
2
3
4
mkdir server
cd server
npm init
touch server.js

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

1
npm install twit body-parser cors express

Пакет twit поможет нам взаимодействовать с API Twitter. Затем в файле server.js инициализируйте модули, создайте приложение Express и запустите сервер.

1
2
3
4
5
const express = require(‘express’);
const Twitter = require(‘twit’);
const app = express();
 
app.listen(3000, () => console.log(‘Server running’))

Затем мы предоставим ключи API для пакета twit , как показано ниже.

1
2
3
4
5
6
const api-client = new Twitter({
  consumer_key: ‘CONSUMER_KEY’,
  consumer_secret: ‘CONSUMER_SECRET’,
  access_token: ‘ACCESS_TOKEN’,
  access_token_secret: ‘ACCESS_TOKEN_SECRET’
});

Ключи уникальны для вашего приложения и связаны с вашей учетной записью Twitter. Поэтому, когда вы делаете запрос через Twitter API, вы становитесь авторизованным пользователем.

Затем мы создадим конечные точки для публикации и получения твитов на нашем сервере Node.

Twitter предоставляет следующие конечные точки, которые позволят нам взаимодействовать с нашей временной шкалой Twitter при получении и публикации твитов.

  • GET statuses/home_timeline возвращает самые последние твиты, опубликованные пользователем и пользователями, на которых они подписаны
  • GET statuses/home_timeline возвращает самые последние упоминания для аутентифицирующего пользователя
  • Состояние POST statuses/update используется для публикации твитов

Эта первая конечная точка будет использоваться для получения последних твитов на вашей временной шкале. Мы также укажем количество твитов, которые мы хотим получить.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
app.get(‘/home_timeline’, (req, res) => {
    const params = { tweet_mode: ‘extended’, count: 10 };
   
    client
      .get(`statuses/home_timeline`, params)
      .then(timeline => {
         
        res.send(timeline);
      })
      .catch(error => {
      res.send(error);
    });
      
});

Далее идет API для получения всех твитов, где был упомянут аутентифицирующий пользователь.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
app.get(‘/mentions_timeline’, (req, res) => {
    const params = { tweet_mode: ‘extended’, count: 10 };
   
    client
      .get(`statuses/mentions_timeline`, params)
      .then(timeline => {
       
        res.send(timeline);
      })
      .catch(error => {
      res.send(error);
    });
      
});

Чтобы иметь возможность записи на временную шкалу Twitter, нам нужно изменить уровень разрешений доступа приложения на « Чтение и запись», как показано ниже.

изменить уровень разрешений доступа приложения на чтение и запись

Затем обновите файл server.js, чтобы вызвать API для публикации твитов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
app.post(‘/post_tweet’, (req, res) => {
 
  tweet = req.body;
   
    client
      .post(`statuses/update`, tweet)
      .then(tweeting => {
        console.log(tweeting);
         
        res.send(tweeting);
      })
 
     .catch(error => {
      res.send(error);
    });
       
    
});

Теперь мы закончили работу с сервером узлов, и теперь вы можете протестировать свой REST API с помощью Postman, чтобы убедиться, что он работает правильно.

Если вы запросите home_timeline точку home_timeline в своем API, вы должны увидеть что-то вроде следующего.

конечная точка home_timeline в Почтальоне

И вот GET-запрос к конечной точке mentions_timeline :

Конечная точка metions_timeline в Почтальоне

Код сервера, который мы создали выше, также можно использовать для создания бота в Twitter. Ниже приведен пример базового бота Twitter, который обновляет статус пользователя.

01
02
03
04
05
06
07
08
09
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
const express = require(‘express’);
const Twitter = require(‘twit’);
 
const app = express();
const client = new Twitter({
  consumer_key: ‘Consumer Key Here’,
  consumer_secret: ‘Consumer Secret Here’,
  access_token: ‘Access Token Here’,
  access_token_secret: ‘Token Secret Here’
});
 
 
app.use(require(‘cors’)());
app.use(require(‘body-parser’).json());
 
app.post(‘/post_tweet’, (req, res) => {
 
  tweet = {status:»Hello world»};
     
    client
      .post(`statuses/update`, tweet)
      .then(timeline => {
        console.log(timeline);
         
        res.send(timeline);
      })
 
     .catch(error => {
      res.send(error);
    });
       
    
});
 
app.listen(3000, () => console.log(‘Server running’));

Теперь мы начнем создавать наше приложение Angular, которое будет использовать API с нашего Node-сервера.

Сначала создайте приложение Angular.

1
ng new client

Мы начнем с создания службы Twitter, которая будет отправлять запросы на сервер Node. Выполните следующую команду в приложении Angular.

1
ng generate service twitterservice

Это создаст два файла: twitter.service.ts и twitter.service.spec.ts . Откройте twitter.service.ts , добавьте необходимый импорт, объявите конечную точку API и HttpClient модуль HttpClient в конструктор.

1
2
3
api_url = ‘https://localhost:3000’;
 
 constructor(private http: HttpClient) { }

Затем мы определим функции для использования REST API.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
export class TwitterService {
 
 api_url = ‘http://localhost:3000’;
  
  constructor(private http: HttpClient) { }
 
  getTimeline() {
    return this.http
      .get<any[]>(this.api_url+’/home_timeline’)
      .pipe(map(data => data));
 
  }
 
  getMentions() {
    return this.http
      .get<any[]>(this.api_url+’/mentions_timeline’)
      .pipe(map(data => data));
 
  }
 
}

Чтобы получить доступ к сервису Twitter из нашего компонента, нам нужно будет сгенерировать следующие компоненты.

1
2
3
ng generate component twitter_timeline
ng generate component twitter_mentions
ng generate component tweet

Затем объявите маршруты для сгенерированных компонентов в app.module.ts .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
import { RouterModule, Routes } from ‘@angular/router’;
 
const appRoutes: Routes = [
  {
    path: ‘twitter_timeline’,
    component: TwitterTimelineComponent
  },
  {
    path: ‘twitter_mentions’,
    component: TwitterMentionsComponent
  },
 
  {
    path: ‘tweets’,
    component: TweetComponent
  },
 
  { path: »,
    redirectTo: »,
    pathMatch: ‘full’
  }
];

Теперь откройте app.component.html и визуализируйте компоненты, как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
<mat-toolbar color=»primary»>
   <mat-toolbar-row>
     <!— <span>HOME
      <span><a href=»/»>HOME</a>
      <span class=»spacer»>
      <span mat-button routerLink=»/twitter_timeline»>Timeline
      <br>
      <a mat-button routerLink=»/twitter_mentions»>Mentions</a>
      <br>
      <a mat-button routerLink=»/tweets»>Tweets</a>
   </mat-toolbar-row>
</mat-toolbar>
<router-outlet></router-outlet>

Мы создадим два компонента для отображения наших твитов. В TwitterTimelineComponent будут отображаться самые последние твиты с временной шкалы аутентифицированного пользователя, а в TwitterMentionsComponent будут отображаться все твиты, в которых упомянут аутентифицированный пользователь.

Мы начнем с TwitterTimelineComponent . Обновите twitter-timeline.component.ts следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
export class TwitterTimelineComponent implements OnInit {
   
  myTimeline: any;
 
  constructor(private api: TwitterService) { }
 
  ngOnInit() {
   this.getTwitterTimeline();
  }
   
  getTwitterTimeline(): void {
    this.api.getTimeline()
      .subscribe(
        myTimeline => {
          this.myTimeline = myTimeline;
          console.log(this.myTimeline);
        }
      )
   }
   
}

Метод getTwitterTimeline использует getTwitterTimeline для извлечения данных из шкалы времени аутентифицированных пользователей. Затем мы обновляем twitter-timeline.component.html, как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<h1>Tweeter Timeline</h1>
<div *ngIf=»undefined === myData»>Loading…</div>
<div *ngIf=»undefined !== myData»>
  <div class =»card»>
    <ng-container *ngFor=»let tweets of myData.data»>
      <h3>{{tweets.full_text
        }}
      </h3>
      <p>{{tweets.created_at}}</p>
      <p>{{tweets.user.name}}</p>
      <p>{{tweets.user.screen_name}}</p>
      <p>{{tweets.user.location}}</p>
      <p>{{tweets.user.description}}</p>
    </ng-container>
  </div>
</div>

Здесь мы перебираем массив, возвращенный методом getTwitterTimeline и отображаем следующие атрибуты для каждого твита:

  • location
  • description
  • username
  • created_at
  • screen_name

Затем мы переходим к компоненту TwitterMentionsComponent и обновляем его следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
export class TwitterMentionsComponent implements OnInit {
   
  myMentions: any;
 
  constructor(private api: TwitterService) { }
 
  ngOnInit() {
   this.getTwitterMentions();
  }
   
  getTwitterMentions(): void {
    this.api.getTimeline()
      .subscribe(
        myMentions => {
          this.myMentions = myMentions;
          console.log(this.myMentions);
        }
      )
   }
   
}

Наконец, нам нужно отобразить данные из API в шаблоне. Обновите twitter-mentions.component.html следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<h1>Tweeter Mentions</h1>
<div *ngIf=»undefined === myData»>Loading…</div>
<div *ngIf=»undefined !== myData»>
  <div class =»card»>
    <ng-container *ngFor=»let tweets of myData.data»>
      <h3>{{tweets.full_text
        }}
      </h3>
      <p>{{tweets.created_at}}</p>
      <p>{{tweets.user.name}}</p>
      <p>{{tweets.user.screen_name}}</p>
      <p>{{tweets.user.location}}</p>
      <p>{{tweets.user.description}}</p>
    </ng-container>
  </div>
</div>

Теперь, когда вы запустите приложение, вы должны увидеть все атрибуты ваших твитов.

Мы начнем с формы для публикации данных в /post_tweet точке /post_tweet , где мы определяем поле ввода и кнопку отправки для публикации твитов. Мы будем использовать модуль FormBuilder для создания формы обновления статуса. Добавьте следующий код в tweet.component.ts .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import { FormBuilder, FormGroup, Validators } from ‘@angular/forms’;
 
export class TweetComponent implements OnInit {
tweetForm: FormGroup;
    
  constructor(private api: TwitterService private formBuilder: FormBuilder) { }
 
  ngOnInit() {
 
   this.tweetForm = this.formBuilder.group({
            tweetdata: [», Validators.required]
        });
  }
 
}

Теперь обновите шаблон, чтобы Angular знал, какую форму использовать.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<mat-card class=»contact-card»>
  <mat-card-content>
    <form [formGroup]=»tweetForm» (ngSubmit)=»onSubmit()»>
    <mat-form-field>
      <input matInput placeholder=»Status» formControlName=»tweetdata» class=»form-control» [ngClass]=»{ ‘is-invalid’: submitted && f.tweetdata.errors }» >
    </mat-form-field>
    <br>
    <div class=»form-group»>
      <button [disabled]=»loading» class=»btn btn-primary»>TWEET</button>
      <img *ngIf=»loading» src=»https://media.giphy.com/media/3oEjI6SIIHBdRxXI40/giphy.gif» />
    </div>
    </form>
  </mat-card-content>
</mat-card>

Как вы можете видеть выше, мы добавили валидаторы, чтобы форма не могла быть отправлена, если она пуста.

Затем мы переходим к сервису Twitter и обновляем его, чтобы включить в него код для публикации данных в API.

01
02
03
04
05
06
07
08
09
10
11
tweet(tweetdata: string) {
        return this.http.post<any>(`${this.api_url}/post_tweet/`, { status: tweetdata})
            .pipe(map(tweet => {
             
                alert(«tweet posted»)
 
                return tweet;
            }));
    }
 
}

Затем мы обновим TweetComponent в него код для вызова метода для публикации в API Twitter. Добавьте следующее к tweet.component.ts .

01
02
03
04
05
06
07
08
09
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
export class TweetComponent implements OnInit {
tweetForm: FormGroup;
    loading = false;
    submitted = false;
    returnUrl: string;
    error = »;
 
  constructor(private api: TwitterService private formBuilder: FormBuilder) { }
 
  ngOnInit() {
 
   this.tweetForm = this.formBuilder.group({
            tweetdata: [», Validators.required]
        });
  }
 
  get f() { return this.tweetForm.controls;
 
    onSubmit() {
        this.submitted = true;
 
        // stop here if form is invalid
        if (this.tweetForm.invalid) {
            return;
        }
 
        this.loading = true;
        this.api.tweet(this.f.tweetdata.value)
            .pipe(first())
            .subscribe(
                data => {
                    console.log(«yes»)
                },
                error => {
                    this.error = error;
                    this.loading = false;
                });
    }
 
}

Теперь вы сможете получить последние твиты, нажав /home_timeline конечную точку, получите ваши упоминания через конечную точку /mentions_timeline и /post_tweet твиты через /post_tweet точку /post_tweet .

В этом уроке вы узнали, как начать работу с Twitter API и как создать простого бота Twitter с помощью всего лишь нескольких строк кода. Вы также узнали, как подключиться к REST API от Angular, включая создание службы API и компонентов для взаимодействия с этой службой.

Чтобы узнать больше об API Twitter, зайдите на сайт разработчиков Twitter и изучите некоторые из бесконечных возможностей.