前回までに、なにかと便利なページを作成しました。
便利ページ:Javascriptでちょっとした便利な機能を作ってみた
便利ページ:自分のQiita記事を一覧表示
便利ページ:元号を変換してみた
今回は巷で噂のトレンドキーワードを取得するするページを追加しました。
とは言っても、以下の以前の投稿内容と同じで、お便利ページに移植しただけです。
Dialogflowと連携してLINE Botを作る
毎度の通り、デモページとGitHubです。
GitHub
https://github.com/poruruba/utilities
デモページ
https://poruruba.github.io/utilities/
サーバ側の実装
トレンドキーワードを収集するために、「Twitter REST API」を使います。
Twitter Developerアカウントに登録されている必要があります。
swagger.yaml
/trendword:
post:
x-swagger-router-controller: routing
operationId: trendword
parameters:
- in: body
name: body
schema:
type: object
responses:
200:
description: Success
schema:
type: object
index.js
var fetch = require('node-fetch');
const { URLSearchParams } = require('url');
const TWITTER_API_KEY = process.env.TWITTER_API_KEY || 【TwitterアプリのAPI key】;
const TWITTER_API_SECRET_KEY = process.env.TWITTER_API_SECRET_KEY || 【TwitterアプリのAPI secret key】;
const YAHOO_WOEID = process.env.YAHOO_WOEID || 【トレンドを取得したい場所のWOEID】;
const NUM_OF_PICKUP = 10;
exports.handler = async (event, context, callback) => {
if( event.path == '/trendword' ){
var body = JSON.parse(event.body);
if( body.apikey != SERVER_APIKEY )
throw 'apikey mismatch';
var trends = await get_trendlist();
return new Response({ result: 'OK', trends: pickup_list(array_shuffle(trends.trends)) });
}
};
function array_shuffle(array){
for(var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
return array;
}
function pickup_list(list){
var pickup = [];
for( var i = 0 ; i < NUM_OF_PICKUP ; i++ ){
var name = list[i].name;
if( name.slice(0, 1) == '#' || name.slice(0, 1) == '?' )
name = name.slice(1);
pickup.push(name);
}
return pickup;
}
function get_trendlist(){
var body = {
grant_type: 'client_credentials'
};
return do_post_secret('https://api.twitter.com/oauth2/token', body, TWITTER_API_KEY, TWITTER_API_SECRET_KEY)
.then(result =>{
var body = {
id: YAHOO_WOEID
};
return do_get_token_text('https://api.twitter.com/1.1/trends/place.json', body, result.access_token);
})
.then(result =>{
var list = JSON.parse(result);
// console.log(list);
return list[0];
});
}
function do_post_secret(url, body, client_id, client_secret){
var data = new URLSearchParams();
for( var name in body )
data.append(name, body[name]);
var basic = new Buffer(client_id + ':' + client_secret).toString('base64');
return fetch(url, {
method : 'POST',
body : data,
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization' : 'Basic ' + basic }
})
.then((response) => {
if( response.status != 200 )
throw 'status is not 200';
return response.json();
});
}
function do_get_token_text(url, qs, token){
var params = new URLSearchParams();
for( var key in qs )
params.set(key, qs[key] );
console.log(url + '?' + params.toString());
return fetch(url + '?' + params.toString(), {
method : 'GET',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization' : 'Bearer ' + token }
})
.then((response) => {
if( response.status != 200 )
throw 'status is not 200';
return response.text();
});
}
以下の部分を環境に合わせて書き換えます。
【TwitterアプリのAPI key】
【TwitterアプリのAPI secret key】
【トレンドを取得したい場所のWOEID】
#動作確認
ブラウザにはこんな感じに表示されます。
以上