[API Qiita] Obtenez des vues, des goûts et des actions par diverses méthodes (JavaScript, Google Script, Python, Vue.js)

introduction

En regardant mon message par Qiita, il y a trois nombres: "Page vue", "J'aime" et "Stock". Les "j'aime" de tous les articles sont totalisés sur Ma page, mais la vue, le stock et le total de chaque article ne sont pas clairs. Étant donné que le nombre de messages a atteint environ 20, j'ai décidé d'essayer différentes méthodes pour obtenir tous les affichages, les J'aime et le stock de mes articles pour les étudier.

Quand je l'ai recherché, tout le monde a accédé à l'API Qiita de différentes manières pour obtenir des informations, et il y a beaucoup de pages de référence, donc je vais effectuer tout en les vérifiant.

URL de référence

J'ai principalement évoqué les articles suivants. (D'autres pages de référence sont listées à la fin) [API Qiita] J'aime! Comptage automatique des vues (Qiita)

supposition

Émission d'un jeton d'accès personnel Qiita Qiita "Paramètres" -> "Applications" -> "Jeton d'accès personnel" (lecture seule: read_qiita)

Type d'implémentation

①HTML/JavaScript ②GoogleScript ③Python + Vue.js

①HTML/JavaScript ・ Définissez votre propre jeton d'accès et appuyez sur le bouton «Lire». html1.png html2.png

code


<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Qiita Item Get</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
  </head>

  <body>
    <div class="container">
      <br>
 <h3> Obtenir la liste des messages Qiita </ h3>
      <br>
      <div class="input-group flex-nowrap">
        <div class="input-group-prepend">
 <span class = "input-group-text" id = "addon-wrapping"> Paramètres du jeton d'accès Qiita </ span>
        </div>
        <input type="text" class="form-control" id="accesstoken" placeholder="Access Token" aria-describedby="addon-wrapping">
      </div>
      <br>
 <button type = "button" class = "btn btn-primary" onclick = "getData ()"> Lire </ button>
      <hr>
      <div id="result"></div>
    </div>

    <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>

    <script>
      var title;
      var view;
      var like;
      var stock;

      function getData() {
 // Confirmer le jeton d'accès
        var token = document.getElementById('accesstoken').value
        if(token == ''){
 alert ('Saisir le jeton d'accès')
          return
        }

 // Afficher jusqu'à ce que vous puissiez l'obtenir
        var result = $("#result");
        var loading = '<p>Now Loading...</p>';
        result.append(loading);

 // Obtenez votre propre liste de messages et obtenez des données par identifiant
        var items = [];
        $.ajax({
          type: "GET",
          url: "https://qiita.com/api/v2/authenticated_user/items",
          headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer " + token,
          },
          dataType: "json",
          success: function(data){
            items = data;

            var sum_view = 0;
            var sum_like = 0;
            var sum_stock = 0;

            var html = '<table class="table table-dark">' +
 '<thead> <tr> <th scope = "col"> Non </ th> <th scope = "col"> Title </ th> <th scope = "col"> VUES </ th> <th scope = "col"> LIKES </ th> <th scope = "col"> STOCKS </ th> <th scope = "col"> LIKE rate </ th> <th scope = "col"> STOCK rate </ th> </ tr> </ head> <tbody> '

 // Boucle dans la liste des articles, récupère les données par ID, définit le HTML
            for (var i = 0; i < items.length; i++) {
              qiitaView(items[i].id, token);
              qiitaStock(items[i].id, token);

              var no = items.length - i;

              var per_like = like / view * 1000;
              var math_like = Math.round(per_like) / 1000;

              var per_stock = stock / view * 1000;
              var math_stock = Math.round(per_stock) / 1000;

              html +=
              '<tr>' +
              '<th scope="row">' + no + '</th>' +
              '<td><a href="' + url + '" target="_blank">' + title + '</a></td>' +
              '<td>' + view + '</td>' +
              '<td>' + like + '</td>' +
              '<td>' + stock + '</td>' +
              '<td>' + math_like + '</td>' +
              '<td>' + math_stock + '</td>' +
              '</tr>';

              sum_view += view;
              sum_like += like;
              sum_stock += stock;

            };

 // Définir le total en html et exporter
            html +=
              '<tr>' +
 '<th scope = "row"> total </ th>' +
              '<td></td>' +
              '<td>' + sum_view + '</td>' +
              '<td>' + sum_like + '</td>' +
              '<td>' + sum_stock + '</td>' +
              '<td>' + '' + '</td>' +
              '<td>' + '' + '</td>' +
              '</tr>' +
              '</tbody></table>';

            result.empty();
            result.append(html);

          },
          error: function(XMLHttpRequest, textStatus, errorThrown){
            result.empty();
 alert ('Error1: le jeton d'accès est-il correct?' + ErrorThrown);
          }
        });

      };

      function qiitaView(id, token) {

        var views = [];

        $.ajax({
          type: "GET",
          url: 'https://qiita.com/api/v2/items/' + id,
          headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer " + token,
          },
          dataType: "json",
 async: false, // Communication synchrone
          success: function(data){
            views = data;
            title = views.title;
            url = views.url;
            like = views.likes_count;
            view = views.page_views_count;
          },
          error: function(XMLHttpRequest, textStatus, errorThrown){
            alert('Error2 : ' + errorThrown);
          }
        });

      };

      function qiitaStock(id, token) {

        var stocks = [];
        var flg = 'off';

        for (var j = 1; j < 4; j++) {

          $.ajax({
            type: "GET",
            url: 'https://qiita.com/api/v2/items/' + id + '/stockers?page=' + j + '&per_page=100',
            headers: {
              "Content-Type": "application/json",
              "Authorization": "Bearer " + token,
            },
            dataType: "json",
 async: false, // Communication synchrone
            success: function(data){
              stocks = data;
              var stock_len = stocks.length;

              if (stock_len != 100) {
                stock = (j * 100) - 100 + stock_len;
                flg = 'on';
              }

            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
              alert('Error3 : ' + errorThrown);
            }
          });

          if (flg=='on') {
            break;
          }

        };
      };
    </script>
  </body>
</html>

②Google Script -Créer un script GS et définir le projet à exécuter périodiquement. (Définir de "Modifier" -> "Déclenchement du projet en cours". Définir pour obtenir une fois par jour) (Le script google est presque sur la page à laquelle je fais référence. Je fixe le taux pour le stock et affiche en plus) (Le stock est acquis jusqu'à 1000 actions pour chaque poste)

Si vous l'obtenez tous les jours, vous pouvez voir qu'il y a environ 50 à 100 vues. gs1.png gs2.png

code

function myFunction() {
  
 // Réglage variable
  var sum_likes = 0
  var sum_page_views = 0
  var sum_stocks = 0
  
 // Réglage de la date d'acquisition
  var now = new Date()
 var record_title = ['date']
  var record_page_views = [now]
  var record_likes = [now]
  var record_stocks = [now]
  
 // Obtenez votre propre message via l'API Qiita
  var url = 'https://qiita.com/api/v2/authenticated_user/items'
  var option = {
    headers : {
 'Autorisation': 'Définir le jeton d'accès au porteur'
    },
    method : 'get'
  }
  
  var res = UrlFetchApp.fetch(url, option)  
  var list = JSON.parse(res.getContentText())
 list = list.reverse () // Passage de l'ordre décroissant à l'ordre croissant
  
 // Boucle sur les éléments récupérés pour obtenir la vue, comme, stock
  for(var i = 0; i < list.length; i++) {
    
    var item = list[i]

 // Récupère le nombre de likes
    var item_id = item['id']
    var title = item['title']
    var likes_count = item['likes_count']
    sum_likes += likes_count
    
 // obtenir la vue de la page
    url = 'https://qiita.com/api/v2/items/' + item_id
    res = UrlFetchApp.fetch(url, option)
    var json = JSON.parse(res.getContentText())
    var page_views_count = json['page_views_count']
    sum_page_views += page_views_count
    
 // Récupère le nombre d'actions
    var cnt = 1
    var stock_count = 0
    while(cnt < 10) {
      var url_stock = url + '/stockers?page=' + cnt + '&per_page=100'
      var res_stock = UrlFetchApp.fetch(url_stock, option)
      var json_stock = JSON.parse(res_stock.getContentText())
      var stock_num = json_stock.length

      if (stock_num != 100) {
        stock_count = (cnt * 100) - 100 + stock_num
        sum_stocks += stock_count
        break
      } else {
        cnt += 1 
      }
    }
    
 // Définir les données pour l'exportation de la feuille
    record_title.push(title)
    record_page_views.push(page_views_count)
    record_likes.push(likes_count)
    record_stocks.push(stock_count)
  }

 // Calculer le tarif
  var par_likes = sum_likes / sum_page_views
  var par_stocks = sum_stocks / sum_page_views
 // Ensemble de feuilles de calcul
  var spreadsheet = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxxxxxxxx')
 // Feuille: somme
  var sheet = spreadsheet.getSheetByName('sum')
  sheet.appendRow([new Date(), list.length, sum_page_views, sum_likes, sum_stocks, par_likes, par_stocks])
 // Feuille: vue
  var sheet = spreadsheet.getSheetByName('view')
  sheet.getRange('1:1').clear()
  sheet.getRange(1,1,1,record_title.length).setValues([record_title])
  sheet.appendRow(record_page_views)
 // Feuille: comme
  var sheet = spreadsheet.getSheetByName('like')
  sheet.getRange('1:1').clear()
  sheet.getRange(1,1,1,record_title.length).setValues([record_title])
  sheet.appendRow(record_likes)
 // Feuille: stock
  var sheet = spreadsheet.getSheetByName('stock')
  sheet.getRange('1:1').clear()
  sheet.getRange(1,1,1,record_title.length).setValues([record_title])
  sheet.appendRow(record_stocks)
}
```


##③Python + PHP/Vue.js
-Obtenez les données avec l'API Qiita et définissez-les dans DB (Python est exécuté une fois par jour avec le paramètre Cron)
- Vue.Obtenez des informations DB en appuyant sur axios avec js(php),afficher
![vue1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/02134f6e-2a9d-1657-8a54-e299d56d2fd9.png)

-Appuyez sur le bouton d'acquisition de données
![vue2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/d7a06ef0-c16b-c27e-e492-be7cbbd4e020.png)

-Obtenez des données Python avec l'API Qiita et définissez-les dans DB (exécutez une fois par jour avec le paramètre Cron)

~~~Qiita_data_get.py
import requests
import json
import datetime
import MySQLdb

#Jeton d'accès Qiita
token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
#Paramètres de l'API Qiita
url = 'https://qiita.com/api/v2/authenticated_user/items'
headers = {'content-type': 'application/json',
           'Authorization': 'Bearer ' + token}
#Paramètres des informations de connexion
cnt = MySQLdb.connect(
  user='xxxxxxxxxxxx',
  passwd='xxxxxxxxxxxxx',
  host='xxxxxxxxxxxxxxxxxxxx',
  db='xxxxxxxxxxxxxx',
  charset='utf8'
)

#Obtenir le curseur
db = cnt.cursor()

#Acquisition / tri des données
res = requests.get(url, headers=headers)
list = res.json()

for item in list:

    item_id = item['id']
    #Titre, ensemble de numéros similaires
    title = item['title']
    item_url = item['url']
    likes_count = item['likes_count']

    url = 'https://qiita.com/api/v2/items/' + item_id
    res = requests.get(url, headers=headers)
    json = res.json()
    #Ensemble de nombre de vues par titre
    page_views_count = json['page_views_count']

    i = 1
    #Obtenez le nombre d'actions
    while i < 10:

        url_stock = url + '/stockers?page=' + str(i) + '&per_page=100'
        res_stock = requests.get(url_stock, headers=headers)
        json_stock = res_stock.json()
        stock_num = len(json_stock)

        if stock_num != 100:
            stock_count = (i * 100) - 100 + stock_num
            break
        else:
            i += 1

    #Réglage de la date
    now = datetime.datetime.now()
    setdate = now.strftime('%Y-%m-%d')

    # like,Calculer le pourcentage de stock
    per_like = likes_count / page_views_count * 100
    per_like = round(per_like, 2)
    per_stock = stock_count / page_views_count * 100
    per_stock = round(per_stock, 2)

    #Sélectionnez les données DB par date et titre
    sqlselect = "SELECT * from qiita_data WHERE setdate='" + setdate + "' AND title='" + title + "'"
    db.execute(sqlselect)
    row = db.fetchall()
    dbcnt = len(row)

    #Mettre à jour s'il y a des données dans la base de données(Pour écraser les données si elles sont exécutées le même jour)
    if dbcnt > 0:
        sqlupdate = "UPDATE qiita_data SET views='" + str(page_views_count) + "', likes='" + str(likes_count) + "', stocks='" + str(stock_count) + "', per_like='" + str(per_like) + "', per_stock='" + str(per_stock) + "' WHERE setdate='" + setdate + "' AND title='" + title + "'"
        db.execute(sqlupdate)
    #Insérer s'il n'y a pas de données dans le DB
    else:
        sqlinsert = "INSERT INTO qiita_data(setdate, title, url, views, likes, stocks, per_like, per_stock) VALUES ('" + setdate + "', '" + title + "', '" + item_url + "', '" + str(page_views_count) + "', '" + str(likes_count) + "', '" + str(stock_count) + "', '" + str(per_like) + "', '" + str(per_stock) + "')"
        db.execute(sqlinsert)

#Fin du curseur
db.close()
#commettre
cnt.commit()
#Déconnexion MySQL
cnt.close()

-Renvoie les informations de la base de données

<?php

  //Ensemble de paramètres de base de données
  $host = "xxxxxxxxxxxxxxxxxxxxxxxx";
  $dbname = "xxxxxxxxxxxxxxxxxxxxxxx";
  $user = "xxxxxxxxxxxxx";
  $pass = "xxxxxxxxxxxxx";

  //Obtenir les paramètres
  if (!isset($_GET['setdate'])) {
    $paramdate = '19000101';
  } else {
    $paramdate = $_GET['setdate'];
  }

  //Vérifiez le nombre de chiffres
  if (strlen($paramdate)!=8) {
    http_response_code(500);
    echo "setdate length is not 8";
    exit();
  }

  //Vérification du format AAAAMMJJ
  $stryear  = substr($paramdate, 0, 4);
  $strmonth = substr($paramdate, 4, 2);
  $strday   = substr($paramdate, 6, 2);
  if (!checkdate($strmonth, $strday, $stryear)) {
    http_response_code(500);
    echo "setdate is not date";
    exit();
  }

  //Définition des informations d'en-tête
  header("Content-Type: application/json; charset=utf-8");

  $data = array();

  //Configuration des informations de connexion à la base de données / préparation SQL / connexion
  $db = new PDO('mysql:host=' . $host . 'dbname=' . $dbname . 'charset=utf8', $user, $pass);

  //Si la date ne vient pas
  if ($paramdate == '19000101') {
    $sql = "select * from qiita_data";
  //Lorsque la date est définie dans le paramètre
  } else {
    $sql = "select * from qiita_data where setdate='" . $paramdate . "'";
  }
  $sth = $db -> prepare($sql);
  $sth -> execute();

  //Obtenez des données
  $data = $sth -> fetchAll(PDO::FETCH_ASSOC);

  //objectivation json
  echo json_encode($data);
?>
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Qiita Data Get</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
  </head>

  <body>
    <div class="container">
      <div id="app">
        <br>
        <h3>Obtenir la liste des messages Qiita</h3>
        <br>
        <p>Date de l'acquisition: <input type="date" id="date" v-model="getdate">(Si vous ne le saisissez pas, obtenez-le avec la date du jour)</p>
        <button type="button" class="btn btn-primary" v-on:click="getitem">L'acquisition des données</button>
        <hr>
        <table class="table table-dark">
          <thead>
            <tr>
              <th scope="col">No</th>
              <th scope="col">Title</th>
              <th scope="col">Views</th>
              <th scope="col">Likes</th>
              <th scope="col">Stocks</th>
              <th scope="col">Comme taux</th>
              <th scope="col">Taux de stock</th>
            </tr>
          </thead>
          <tr v-for="(item, index) in items" :key="item.no">
            <th scope="row">{{ itemno - index }}</th>
            <td><a v-bind:href="item.url" target="_blank">{{ item.title }}</a></td>
            <td>{{ item.views }}</td>
            <td>{{ item.likes }}</td>
            <td>{{ item.stocks }}</td>
            <td>{{ item.per_like }}</td>
            <td>{{ item.per_stock }}</td>
          </tr>
        </table>
      </div>
    <div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

    <script>
      var app = new Vue({
        el: '#app',
        data: {
          items: [],
          getdate: '',
          itemno: 0
        },
        methods: {
          getitem() {

            if( this.getdate === ''){
              var date = new Date();
              var yyyy = date.getFullYear();
              var mm = ("0"+(date.getMonth()+1)).slice(-2);
              var dd = ("0"+date.getDate()).slice(-2);
              this.getdate = yyyy+'-'+mm+'-'+dd;
            }

            yyyy = this.getdate.substr(0,4)
            mm = this.getdate.substr(5,2)
            dd = this.getdate.substr(8,2)
            var setdate = yyyy + mm + dd
            var url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/qiita_data_get.php?setdate=' + setdate

            axios.get(url)
            .then(function(response){
              this.items = response.data
              this.itemno = this.items.length
              if(this.itemno == 0){
                alert('Les données n'ont pas pu être obtenues')
              }
              console.log(this.itemno)
            }.bind(this))
            .catch(function(error){
              console.log(error + 'Est passe')
            })
          }
        }
      })
    </script>
  </body>
</html>

##Résumé ・ Appuyez sur QiitaAPI pour afficher la page de votre message/"Comme c'est gentil"/Implémentation de la place pour acquérir et afficher toutes les informations de "stock". ・ Je pense que n'importe quelle méthode peut être utilisée, mais j'ai pensé que ce serait pratique car Google Script peut facilement définir une exécution régulière. ・ Ensuite, je voudrais essayer un affichage graphique qui montre les informations accumulées d'une manière agréable. → 2020/02/12 Addendum:Chart.Utilisez js pour afficher des graphiques multi-axes(Javascript)Elle a été réalisée à.

##Autres URL de référence

Recommended Posts

[API Qiita] Obtenez des vues, des goûts et des actions par diverses méthodes (JavaScript, Google Script, Python, Vue.js)
Obtenez des visites d'articles et des likes avec l'API Qiita + Python
Obtenez les données de l'API Google Fit en Python
Obtenez une liste d'articles publiés par les utilisateurs avec Python 3 Qiita API v2
Obtenez la liste "J'aime" de Qiita en grattant
Comment générer le nombre de vues, de likes et de stocks d'articles publiés sur Qiita au format CSV (créé avec "Python + Qiita API v2")
[Python] Obtenez des données insight à l'aide de l'API Google My Business
[Python] Obtenez des informations sur les utilisateurs et des articles sur l'API de Qiita
Reconnaissance vocale des fichiers par l'API Google Speech v2 à l'aide de Python