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.
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)
Émission d'un jeton d'accès personnel Qiita Qiita "Paramètres" -> "Applications" -> "Jeton d'accès personnel" (lecture seule: read_qiita)
①HTML/JavaScript ②GoogleScript ③Python + Vue.js
①HTML/JavaScript ・ Définissez votre propre jeton d'accès et appuyez sur le bouton «Lire».
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.
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