В этом руководстве вы узнаете, как проходить аутентификацию и подключаться к API Twitter с помощью Node.js и Angular 6. К концу этого руководства вы сделаете следующее:
- аутентифицироваться с помощью Twitter API
- публиковать твиты с помощью API Twitter
- читать временную шкалу Twitter с помощью API Twitter
- и более!
Создать Node Server
Мы начнем с создания 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, чтобы убедиться, что он работает правильно.
Тестирование Back-End
Если вы запросите home_timeline
точку home_timeline
в своем API, вы должны увидеть что-то вроде следующего.
И вот GET-запрос к конечной точке mentions_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’));
|
Создайте угловое приложение для использования API REST
Теперь мы начнем создавать наше приложение 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 из компонента.
Чтобы получить доступ к сервису 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 и изучите некоторые из бесконечных возможностей.