リンク:
アリスブログ > 「ALISのAPI」を使用する方法まとめ > 当記事
◆ 【Python】ALISユーザーの「いいねの数」と「獲得したALISトークン」を表示する方法
「特定のALISユーザーの『記事の情報』を全部取得してみよう!」の続き。
特定のユーザーの記事の番号を全て獲得することができた場合、
追加でリクエストを送れば、「いいねの数」や「獲得したALISトークン」も閲覧可能になるので、試してみました。
○ 関連記事
◆ 「user_name1」の記事を「limit1 × loop_num」個取得した後、「いいね」と「ALISトークン」の合計を表示するプログラム
import urllib.request
import json
import pprint
import time
import math
#任意の値
user_name1 = 'yuuki';
limit1 = 3;
loop_num = 1;
#固定の値
article_id_memo1 = '';
sort_key_memo1 = '';
article_box2 = []
for count1 in range(loop_num):
try:
url_name1 = f'https://alis.to/api/users/{user_name1}/articles/public?limit={limit1}';
if count1 >= 1:
url_name1 += f'&article_id={article_id_memo1}&sort_key={sort_key_memo1}'
cm_data1 = urllib.request.urlopen(url_name1)
article_box1 = json.loads(cm_data1.read().decode("utf-8"))
article_box2.extend(article_box1['Items'])
load_article1_len1 = len(article_box1['Items']);
print("Load : " + str(count1))
if load_article1_len1 <= 0:
break
else:
article_id_memo1 = article_box1['Items'][load_article1_len1 - 1]['article_id'];
sort_key_memo1 = article_box1['Items'][load_article1_len1 - 1]['sort_key'];
#time.sleep(1)
except:
print("Error!")
break
print("")
page2 = 0;
like_sum = 0;
alis_token_sum = 0;
for article3 in article_box2:
url_name2 = f'https://alis.to/api/articles/' + article3['article_id'] + '/likes';
cm_data2 = urllib.request.urlopen(url_name2)
like_dict1 = json.loads(cm_data2.read().decode("utf-8"))
like1 = like_dict1['count']
like_sum += like1;
url_name3 = f'https://alis.to/api/articles/' + article3['article_id'] + '/alistoken';
cm_data3 = urllib.request.urlopen(url_name3)
alis_token_dict1 = json.loads(cm_data3.read().decode("utf-8"))
alis_token1 = alis_token_dict1['alis_token'] / 1000000000000000000;
alis_token_sum += alis_token1;
print(article3['title'] + " いいね : " + str(like1) + " ALIS : " + str(math.floor(alis_token1 * 100) / 100))
page2 += 1;
if page2 >= 10 :
page2 -= 10;
print("")
time.sleep(1)
load_article1_len2 = len(article_box2);
if load_article1_len2 < 1 : load_article1_len2 = 1;
print("")
print("いいねの合計 : " + str(like_sum))
print("いいねの平均 : " + str(math.floor(like_sum / load_article1_len2 * 100) / 100))
print("ALISトークンの合計 : " + str(math.floor(alis_token_sum * 100) / 100))
print("ALISトークンの平均 : " + str(math.floor(alis_token_sum / load_article1_len2 * 100) / 100))
print("要素数 : " + str(len(article_box2)))
print("")
input('Enterキーで終了')
※ 追加(修正)した文の中の「説明しておきたい所」を、太字にしています
ソースコードが結構長くなってきましたね。
ですが、前半のループ部分は「前回の記事と同じ」なので、「『article_box2』に記事の情報を全部代入するプログラム」と認識しておけば、さほど困らないと思います。
後半の部分だけ、しっかり覚えていきましょう!
○ 注意事項
・負荷がかかりやすい
上記のコードを実行すると「ユーザーの記事数 × 2 + α」分、ALISサーバーにリクエストが行われます。
……もし仮に、ユーザーの制作した記事数が「300」だとすると、短期間で「600~700」回も呼び出しを行ってしまうことになります。
そのため、本番の動作の際は、多少気をつけておいたほうが良いでしょう。
(とはいえ、何度も連続で呼び出さない限り、特に問題はないと思います)
・このプログラムは実行が遅い
リクエスト回数がとても多いことと、負荷対策として「time.sleep(1)」を導入していることから、実行に時間がかかります。
(※1 おおよそ、「記事数 × 2秒」の時間を必要とします)
(※2 「300記事」投稿しているユーザーの情報を呼び出す場合、10分ほど待たなければなりません)
・後に「APIの呼び出しの制限」が設定されるかもしれない
現在のALISのAPIの呼び出しは「無制限」ですが、そのうち、1時間に○○○回まで、といった制限が設定される可能性もあります。
制限が設定されている状態で、このプログラムを(最速で)実行すると、エラーになってしまう可能性があるので、気をつけておきたいです。
なお、コマンドプロンプトを選択していなくても、プログラムは裏側で勝手に動作するので、ロードを行っている時に「他の作業」をすることもできます。
○ 説明!
import math
今回は、「math.floor」という「小数点を切り捨てるプログラム」を使いたいので、「math」のモジュールを追加で宣言しておきます。
page2 = 0;
like_sum = 0;
alis_token_sum = 0;
必要となる変数の宣言です。
「いいねの数」の合計をカウントする時などで、使用しています。
for article3 in article_box2:
読み込んだ記事の数分だけループ。
この下のコードで、再びAPIのリクエストを行います。
url_name2 = f'https://alis.to/api/articles/' + article3['article_id'] + '/likes';
今度は、「/articles/{article_id}/likes」という「特定の記事のいいね数を獲得するAPI」を使用したいので、URLが少し変わっています。
like1 = like_dict1['count']
like_sum += like1;
獲得したデータから、「int型」のデータを抽出して、「like1」に代入。
ついでに、いいね数を「合計いいね数」に加算。
url_name3 = f'https://alis.to/api/articles/' + article3['article_id'] + '/alistoken';
次は、ALISトークンの獲得量がわかるAPIの呼び出し。
alis_token1 = alis_token_dict1['alis_token'] / 1000000000000000000;
alis_token_sum += alis_token1;
ALISトークンの獲得量は、1000000000000000000倍(10 ^ 18)された状態で表示されているので、元の見やすい値(ALISのサイトで表示されている単位)に戻します。
print(article3['title'] + " いいね : " + str(like1) + " ALIS : " + str(math.floor(alis_token1 * 100) / 100))
「記事のタイトル名」「いいねの獲得量」「ALISトークンの獲得量」を1つの行にまとめて表示します。
・「math.floor(alis_token1 * 100) / 100)」について
「alis_token1」をそのまま表示すると「3.000000000000000000」であり、見づらいことから、小数点を切り捨てることで見やすくします。
ですが、整数だけだと、獲得量(変数)の精度が大分落ちてしまうため、
本来 : 3.000000000000000000
↓
×100:300.000000000000000000
↓
小数点の切り捨て:300
↓
÷100:3.00
のようにして、小数点第2位まで閲覧できるようにしています。
つまり、
「math.floor(変数 * 100) / 100)」は、変数の小数点第2位以下を切り捨てるプログラム
ということですね。
page2 += 1;
if page2 >= 10 :
page2 -= 10;
print("")
10回カウントしたら、カウントをリセットして、改行を加えるプログラムです。
これで、記事一覧の表示を10個ずつに分けて、可読性を上げます。
time.sleep(1)
今回は無効化されていないタイマースリープ。
最も、この程度の負荷なら、さほど問題にはならないはずなので、無効のままでも良さそうです。
(無効にすると、プログラムの実行速度が上がります)
load_article1_len2 = len(article_box2);
if load_article1_len2 < 1 : load_article1_len2 = 1;
平均値を求める際に、記事の合計数が必要となるため、ここで作成。
ただし、0除算は許されないので、最低値は「1」にしておきました。
print("いいねの合計 : " + str(like_sum))
print("いいねの平均 : " + str(math.floor(like_sum / load_article1_len2 * 100) / 100))
print("ALISトークンの合計 : " + str(math.floor(alis_token_sum * 100) / 100))
print("ALISトークンの平均 : " + str(math.floor(alis_token_sum / load_article1_len2 * 100) / 100))
今まで獲得してきたデータを使って、合計値と平均値を出力します。
○ 実行結果
「limit1 = 100」「loop_num = 3」で実行。
なんと! 私の記事のALISトークンの獲得量がバレてしまいました(笑)!
ちなみに、「user_name1」を「任意のALISのユーザーID」に変更することで、他の方のALISトークンの獲得量も全部わかります(他者の獲得量の公表は、非推奨です)。
◆ 「ゆうき」のツイッター