見出し画像

SHOWROOMでギフトを画面に降らせるまで5(unixtimeの変換・gift_nameの照合)

1. 概要

このnoteは、virtualSHOWROOMERの東雲めぐちゃんのように、SHOWROOMの配信中にもらったギフトを主の後ろに降らせたい!という想いのもと、プログラミング初心者がなんだかんだしたメモです。(この内容はSHOWROOMで配信しています。)

画像1

↑完成イメージ図 
東雲めぐちゃんSHOWROOMアーカイブ(10:56~15:44あたり)

めぐちゃんのところがバーチャルじゃない人になるイメージ...

詳しくは前回の記事をご覧ください。

2. 今回やったこと

前回は、HTTPリクエストを送った後に欲しいデータだけを整形して出力するということをしました。

ただし、時刻のデータがunixtimeになっていたので、今回は人間がわかる時間に直すところをやりました。

また、今現在出力しているデータはSHOWROOMのgift_log APIから取得しています。しかし、このAPIにはgiftの名前がわかる項目がないので、gift_list APIとgift_log APIを照合してgiftの名前を出力するようにしました。

スクリーンショット 2020-09-05 17.06.12

2-1. unixtimeの変換

まず、unixtimeとは協定世界時(UTC)である1970年1月1日午前0時0分0秒から何秒経過したかをあらわす時間のことだそうです。

これをdatetimeモジュール(テンプレート的なもの?)を使って、その環境(例えば日本にいるなら日本時間)の時間に置き換えることができるそうです。

実際に書いたコードがこんな感じ

import requests
import json
from datetime import datetime
#requests・json・datetimeモジュールの読み込み

url1 = 'https://www.showroom-live.com/api/live/gift_log?room_id='******'
#gift_log APIURIをurl1という名前に置き換える
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
#私はどこどこの誰々ですという情報をheadersという名前にする
r = requests.get(url1,headers=headers)
#httpリクエストを送る
json_log = r.json()
#json形式で出力するという命令をjson_logっていう名前にする
    
for a_gift in json_log['gift_log']:
    time = datetime.fromtimestamp(a_gift['created_at'])
    #gift_logに入ってるデータの中身を一つずつ取り出して(配列の要素を一つずつ取り出して)
    #datetimeモジュールを使ってcreated_atに入ってきたunixtimeを現地の時間に変換

基本的には下の部分が改良点

from datetime import datetime

time = datetime.fromtimestamp(a_gfit['created_at'])

これで日本時間で出力することに成功しました!

スクリーンショット 2020-08-19 16.32.34

この時のコードはこちら↓​​​

import requests
import json
import pprint
from datetime import datetime


url1 = 'https://www.showroom-live.com/api/live/gift_log?room_id=’*****'
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
r = requests.get(url1,headers=headers)
json_log = r.json()


for a_gift in json_log['gift_log']:
   pprint.pprint('name:{}'.format(a_gift['name']))
   pprint.pprint('gift_id:{}'.format(a_gift['gift_id']))
   pprint.pprint('num:{}'.format(a_gift['num']))
   time = datetime.fromtimestamp(a_gift['created_at'])
   pprint.pprint('created_at:{}'.format(time))   



2-2. gift_nameの出力

gift_log APIではギフトアイテムの名前までは取得できないので、gift_list APIとgift_log APIを照合して、gift_list APIからgift_nameを取得したいと思います。

スクリーンショット 2020-09-05 17.06.12

↑gift_idで照合するイメージ

ただし、gift_list APIで取得できるデータが以下のように、enqueteとnormalの辞書に分かれているので、どちらの辞書に該当するデータなのかを分けて考える必要があります。

スクリーンショット 2020-09-08 22.30.25

スクリーンショット 2020-09-08 22.31.23

なので、配列の要素を一つずつ取り出して、その中のgift_idをgift_log APIのgift_idと照合する処理をenqueteとnormalの両方で行うことにしました。

for a_gift in json_log['gift_log']:
   pprint.pprint('name:{}'.format(a_gift['name']))
   pprint.pprint('gift_id:{}'.format(a_gift['gift_id']))
   pprint.pprint('num:{}'.format(a_gift['num']))
   time = datetime.fromtimestamp(a_gift['created_at'])
   pprint.pprint('created_at:{}'.format(time))
   #gift_logの方の出力

   for list_enquete in json_list['enquete']:
       if a_gift['gift_id'] == list_enquete['gift_id'] :
           pprint.pprint('gift_name:{}'.format(list_enquete['gift_name']))
           #enqueteの方の照合

   for list_normal in json_list['normal']:
       if a_gift['gift_id'] == list_normal['gift_id'] :
           pprint.pprint('gift_name:{}'.format(list_normal['gift_name']))
           #normalの方の照合

こんな感じ...
伝わりますかね....  日本語で説明するの難しい....


2-3. 全体のコード

unixtimeの変換とgift_idの照合と両方合わせるとこんな感じ

import requests
import json
import pprint
from datetime import datetime


url1 = 'https://www.showroom-live.com/api/live/gift_log?room_id=******'
url2 = 'https://www.showroom-live.com/api/live/gift_list?room_id=*****'
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
r = requests.get(url1,headers=headers)
r2 = requests.get(url2,headers=headers)
json_log = r.json()
json_list = r2.json()

for a_gift in json_log['gift_log']:
   pprint.pprint('name:{}'.format(a_gift['name']))
   pprint.pprint('gift_id:{}'.format(a_gift['gift_id']))
   pprint.pprint('num:{}'.format(a_gift['num']))
   time = datetime.fromtimestamp(a_gift['created_at'])
   pprint.pprint('created_at:{}'.format(time))

   for list_enquete in json_list['enquete']:
       if a_gift['gift_id'] == list_enquete['gift_id'] :
           pprint.pprint('gift_name:{}'.format(list_enquete['gift_name']))

   for list_normal in json_list['normal']:
       if a_gift['gift_id'] == list_normal['gift_id'] :
           pprint.pprint('gift_name:{}'.format(list_normal['gift_name']))

とりあえずこれで、私が欲しいデータ(ギフトくれた方の名前・ギフトID・同一ギフトの数・投稿された日時・ギフトの名前)を出力することに成功しました!

スクリーンショット 2020-08-19 16.32.34

あ、上もgift_nameまで成功してたやつ貼っちゃった...


3. 次回やりたいこと

今回でやりたいことへの第一ステップを完了した気がするので、次は取得したデータを元に「画面上にアイテムを降らせる」という過程に進みたいと思います!

うーん、Chromeの拡張機能で作るのか、はたまたOpenGL的なので作るのか....

さっぱりいまだ検討はついていませんが、第二ステップに向けて頑張るぞ!

この記事が気に入ったらサポートをしてみませんか?