1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

便利ページ:トレンドキーワードを取得してみた

Last updated at Posted at 2019-05-11

前回までに、なにかと便利なページを作成しました。

 便利ページ: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】

#動作確認

ブラウザにはこんな感じに表示されます。

image.png

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?