情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

【Python】Fortniteのショップ情報を呟くTwitterのbotを作った

スポンサーリンク

はじめに

 今回の記事は技術的なことになります。どのようなbotかなどは別途以下の記事をみてください。

parco1021.hatenablog.com

 また、今回は全体的なことのみ書いて具体的なことを書いたものは別途書いてこのブログへリンクを追加していこうと思っています。

使用環境

conda 4.7.10

Python 3.7.3

Twitter api

Fortnite Tracker api

処理の流れ

今回作成したbotの処理のフローが以下です。

 

f:id:Parco1021:20191119125250p:plain


この図の①~⑧までの処理を後で別々に書いていこうと思います。

プログラム

import requests
import twitter
import urllib.request
import requests
from requests_oauthlib import OAuth1Session
import json
import time
from datetime import date

key=''
URL='https://api.fortnitetracker.com/v1/store'
CK=''
CS=''
AT=''
AS=''
twitter = OAuth1Session(CK,CS,AT,AS)

url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"
   


def tweet(media_id,j,result): #⑦、⑧
    now_date = date.today()
    y = now_date.year
    m = now_date.month
    d = now_date.day
    len_pic = len(media_id)
    if len_pic == 4:
        tweet="{}年{}月{}日のショップその{}\n{} {}vBucks\n{} {}vBucks\n{} {}vBucks\n{} {}vBucks\n#Fortnite #フォートナイトショップ"
        status = tweet.format(y,m,d,j+1,result[j*4]['name'],result[j*4]['vBucks'],result[j*4+1]['name'],result[j*4+1]['vBucks'],
        result[j*4+2]['name'],result[j*4+2]['vBucks'],result[j*4+3]['name'],result[j*4+3]['vBucks'])
    elif len_pic == 3:
        tweet="{}年{}月{}日のショップその{}\n{} {}vBucks\n{} {}vBucks\n{} {}vBucks\n#Fortnite #フォートナイトショップ"
        status = tweet.format(y,m,d,j+1,result[j*4]['name'],result[j*4]['vBucks'],result[j*4+1]['name'],result[j*4+1]['vBucks'],
        result[j*4+2]['name'],result[j*4+2]['vBucks'])
    elif len_pic == 2:
        tweet="{}年{}月{}日のショップその{}\n{} {}vBucks\n{} {}vBucks\n#Fortnite #フォートナイトショップ"
        status = tweet.format(y,m,d,j+1,result[j*4]['name'],result[j*4]['vBucks'],result[j*4+1]['name'],result[j*4+1]['vBucks'])
    else:
        tweet="{}年{}月{}日のショップその{}\n{} {}vBucks\n#Fortnite #フォートナイトショップ"
        status = tweet.format(y,m,d,j+1,result[j*4]['name'],result[j*4]['vBucks'])
    media_id= ','.join(media_id)
    params = {"status": status, "media_ids": media_id}
    print(params)
    twitter.post(url_text,params=params)
    time.sleep(5)

def pic(media_id,i,j,result): #⑤、⑥
    img_url = result[i+4*j]['imageUrl']
    print(img_url)
    headers = {"User-Agent": "Mozilla/5.0"}
    request = urllib.request.Request(url=img_url,headers=headers)
    response = urllib.request.urlopen(request)
    print(response)
    data = response.read()
    files = {"media" : data}
    req_media = twitter.post(url_media,files = files)
    media_id.append(json.loads(req_media.text)['media_id_string'])
    print(media_id)
    return media_id

def call():
    #②、③、④ここから
    headers = {'TRN-Api-Key' : key}
    r = requests.get(URL, headers = headers)
    result = eval(r.text)
    print(len(result))
    print(result)
    num = len(result) // 4
    mod = len(result) % 4
#ここまで for j in range(0,num): media_id = [] name = [] vbucks = [] for i in range(4): pic(media_id,i,j,result) #⑤、⑥ tweet(media_id,j,result) #⑦、⑧ media_id = [] name = [] vbucks = [] for k in range(0,mod): pic(media_id,k,j+1,result) #⑤、⑥ tweet(media_id,j+1,result) #⑦、⑧ if __name__ =='__main__': call()

 データ数は毎日異なるのでそれに対応させるように書きます。4つずつデータを呟きたいのでまずは4枚ずつできるだけ呟きます。例えば17個のデータだったらnum=17//4=4となります。なのでまずはfor文のところのjを4回まわすことで16個呟きます。そして残りの1を呟く方法としてmod=17%4=1となるのでfor文のところのkをmodの数だけまわします。

 それぞれ値を関数に渡して処理をします。本当は呟く文章の箇所でif-elifを多用したくなかったのですがよくわからなかったのでゴリ押しました。

 

各処理の説明

①毎日定時に実行

parco1021.hatenablog.com

 

②、③呟くデータをAPIを叩いて取得する

parco1021.hatenablog.com

 

④~⑧データを呟く

parco1021.hatenablog.com

 

全体のコードはgithub見てください。コードが汚いのは許してね。

https://github.com/tnb1021/fortnitebot

 

 おわり。

もしよければ↓ぽちっと↓お願いします。

ブログランキング・にほんブログ村へにほんブログ村

 

PVアクセスランキング にほんブログ村

スポンサーリンク