【Python】ALISユーザーの「いいねの数」と「獲得したALISトークン」を表示する方法


リンク:

アリスブログ「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トークンの獲得量も全部わかります(他者の獲得量の公表は、非推奨です)。



「『ALISのAPI』を使用する方法まとめ」に戻る




◆ 「ゆうき」のツイッター


公開日:2018/09/12
獲得ALIS:27.25
ゆうき / アリスブロガー's icon'
  • ゆうき / アリスブロガー
  • @yuuki
ALISブロガーです。スキル:SEO対策、ライティング、プログラム等。ALISでは「記事制作のアドバイス」や「情報提供」などを行っています。よろしくお願いします。Twitter yuuki_tw1
コメントする
コメントする