画像を結合し、画像ツイートを自動投稿してみた

# はじめに
今回は前回と同様のクラッシュロワイヤルというゲームについて、再びコードを書いてみたので記録として残しておきます。
https://qiita.com/maototanabe/items/1cd3d92704c960badafb
（前回の記事はこちら）



>**クラッシュロワイヤルとは**
クラッシュロワイヤルとは中高生から大人までに流行しているスマホゲームで、世界中でプロリーグが誕生するなど、大きな盛り上がりを見せています。数あるカードの中から8枚を選んでデッキを作成し、相手と対戦するカード・シュミレーションゲームです。


前回はクラロワのAPIを用いてプロゲーマーの対戦情報をcsvファイルに保存しました。
今回は、クラロワの勝率の高いデッキを取得してカード画像を作成し、自動でツイートする機能を作ってみました。

# プログラムの概要
0．必要なライブラリのインストール
0．勝率トップのデッキとその情報を取得（今回は省略）
1．画像データをもとに8枚のカード画像を取得
2．8枚の画像を縦2×横4に結合
3．twitterAPIを用いて2で作成した画像と文章を投稿

# 実際のコード
```
#0．必要なライブラリのインストール

import tweepy
from PIL import Image
import pandas as pd
```
ここは説明不要ですね。後々このライブラリを使用します。

```
# 1．画像データをもとに8枚のカード画像を取得

♯ カード名と画像ファイルの辞書作成
imgdic = {'Baby Dragon': 'baby_dragon.png', 'Goblin Gang': 'goblin_gang.png', 'Minions': 'minion.png"', 'Balloon': 'chr_balloon.png', 'Goblin Barrel': r': 'mirror.png', 'Heal': 'heal.png'}　#一部省略

# 一致する画像ファイルを取得
a = imgdic[df.iloc[0,0][0]]
b = imgdic[df.iloc[0,0][1]]
c = imgdic[df.iloc[0,0][2]]
d = imgdic[df.iloc[0,0][3]]
e = imgdic[df.iloc[0,0][4]]
f = imgdic[df.iloc[0,0][5]]
g = imgdic[df.iloc[0,0][6]]
h = imgdic[df.iloc[0,0][7]]
```

実行するPCに画像ファイルを読み込んだ後、カード名から画像ファイルを取り出せるように辞書を作成しておきます。また、ここでは記載していませんがdfには1列目にカード8枚がリスト形式で、2列目には勝率、3列目には使用率、4列名にはデッキ名が収納されており、これらが勝率の順で20行くらい収納されています。今回は勝率1位のカードを取得したいため、df.iloc[0,0]で1列目1行目のリストを取得し、リスト内の1つ目の要素をaに、2つ目をbに...入れています。


```
# 2．8枚の画像を縦2×横4に結合
# 画像データを読み込み
im1 = Image.open(a)
im2 = Image.open(b)
im3 = Image.open(c)
im4 = Image.open(d)
im5 = Image.open(e)
im6 = Image.open(f)
im7 = Image.open(g)
im8 = Image.open(h)

# 8つの画像を2×4で結合する関数の作成
def get_concat_42(im1,im2,im3,im4,im5,im6,im7,im8):
    dst = Image.new('RGB', (im1.width + im2.width + im3.width + im4.width+6, im1.height + im5.height+2),"white")
    dst.paste(im1,(0,0))
    dst.paste(im2,(im1.width+2,0))
    dst.paste(im3,(im1.width+im2.width+4,0))
    dst.paste(im4,(im1.width+im2.width+im3.width+6,0))

    dst.paste(im5,(0,im1.height+2))
    dst.paste(im6,(im5.width+2,im1.height+2))
    dst.paste(im7,(im5.width+im6.width+4,im1.height+2))
    dst.paste(im8,(im5.width+im6.width+im7.width+6,im1.height+2))
    return dst

# 関数を実行し、新しい画像ファイル（fortwitter.png）を作成し保存
get_concat_42(im1,im2,im3,im4,im5,im6,im7,im8).save('fortwitter.png')
```
ここも書いてある通りです。また、見栄えを良くする一工夫として背景を白色にしてカードを
結合する際に少しだけ隙間を開けるようにしてみました。（そんなに見栄えが良くなってないかも...）
こうしてこんな感じで画像ができました。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378346/27c1bfdb-7a7e-aeaa-3f68-b7eefa71bbfa.png)
早速これをTwitterで投稿してみます。
TwitterAPIの取得等については省略しています。

```
♯ 3．twitterAPIを用いて2で作成した画像と文章を投稿
# アクセストークンを記載
CK = "your key" #(API key)
CS = "your key" #(API secret key)
AT = "your key" #(Access token)
AS = "your key" #(Access token secret)

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

# 勝率、使用率、デッキ名をdfから取得
winrate = df.iloc[0,1]
userate = df.iloc[0,2]
deckname = df.iloc[0,3]

# ツイートを実行
api.update_with_media(status = '【マルチ勝率1位デッキ】\n \n ■deck:%s \n ■Win rate:%s \n ■Use rate:%s ' % ( deckname,winrate,userate ), filename = 'fortwitter.png')

```
こうして実行したツイートがこちら
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【マルチ勝率1位デッキ】<br> <br> ■deck:Giant Prince EDrag <br> ■Win rate:53.2% <br> ■Use rate:0.5% <a href="https://t.co/z6OuGlxAAH">pic.twitter.com/z6OuGlxAAH</a></p>&mdash; クラロワデータ分析 (@crdatabot) <a href="https://twitter.com/crdatabot/status/1134604110664065024?ref_src=twsrc%5Etfw">2019年5月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 参考にさせていただいた記事

画像の結合について→
https://note.nkmk.me/python-pillow-concat-images/

TwitterAPIの取得について→
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

画像付きツイートの投稿について→
https://qiita.com/kkdmgs110/items/d4fa5de0187f25d1d6f7

読んでくださった皆さん、記事を参考にさせていただいた皆さん、ありがとうございました。