【Python】違う文字を探す脳トレを作成:Tweepyで画像付きツイート

  • URLをコピーしました!
目次

違う文字を探す脳トレ

前回、違う文字を探す脳トレを作成するプログラムで、画像化するところまでプログラミングしました。

今回は作成された脳トレ画像をTwitter制御ライブラリ「Tweepy」を使って、ツイートするところのプログラムを作成していきます。

ちなみにTweepyに関してはこちらの記事でインストールやAPI設定などを解説していますので、よかったらどうぞ。

まずはこれまでのおさらいです。

<セル1>

import random
import json

with open('./question.json', 'r') as f_in:
    question_list = json.load(f_in)

char_list = question_list[random.choice(list(question_list))]
print(char_list)
<セル2>

cell_min = 10; cell_max = 20

vertical = random.randint(cell_min, cell_max)
horizontal = random.randint(cell_min, cell_max)
num_char = vertical*horizontal
diff_char_no = random.randint(1, num_char)

print(vertical, horizontal, num_char, diff_char_no)
<セル3>

output_list = []

for num in range(1, num_char+1):
    if num == diff_char_no:
        output_list.append(char_list[1])
    else:
        output_list.append(char_list[0])
        
print(output_list)
<セル4>

from matplotlib import pyplot as plt
import matplotlib.font_manager as fm
import datetime
%matplotlib notebook

promotion_text = '3PySci https://3pysci.com' 
promotion_fontsize = 30

timenow = datetime.datetime.now().strftime("%Y%m%d%H%M%S")

with open('./fonts.json', 'r') as f_in:
    fonts_list = json.load(f_in)
    
font_path = fonts_list[random.choice(list(fonts_list))]
fp = fm.FontProperties(fname=font_path)
print(font_path)
<セル5>

fig = plt.figure(figsize=(vertical,horizontal))
plt.clf()

i = 0
for x in range(1, vertical+1):
    for y in range(1, horizontal+1):
        plt.text((x-1)/vertical, (y-1)/horizontal, output_list[i], fontsize=55, fontproperties=fp)
        i = i + 1
        
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['bottom'].set_visible(False)
plt.gca().spines['left'].set_visible(False)
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False,
               bottom=False, left=False, right=False, top=False)

plt.xlabel(promotion_text, fontsize=promotion_fontsize, fontproperties=fp)

plt.show()
plt.savefig(f'{timenow}.png', bbox_inches='tight', pad_inches = 0.1)

次に画像ファイルとプログラムファイルの位置関係を確認しましょう。

FindTheDifference
├── FindTheDifference.ipynb                   <- プログラムファイル
├── FindTheDifference.py
├── Dela_Gothic_One
│   ├── DelaGothicOne-Regular.ttf
│   └── OFL.txt
├── Hachi_Maru_Pop
│   ├── HachiMaruPop-Regular.ttf
│   └── OFL.txt
├── New_Tegomin
│   ├── NewTegomin-Regular.ttf
│   └── OFL.txt
├── Noto_Sans_JP
│   ├── NotoSansJP-Regular.otf
│   └── OFL.txt
├── Potta_One
│   ├── OFL.txt
│   └── PottaOne-Regular.ttf
├── Shippori_Mincho
│   ├── OFL.txt
│   └── ShipporiMincho-Regular.ttf
├── 20210730072003.png                            <-画像ファイル
├── 20210730072009.png                            <-画像ファイル
├── 20210730072015.png                            <-画像ファイル
├── 20210730072019.png                            <-画像ファイル
├── 20210730072027.png                            <-画像ファイル
├── fonts.json
├── question.json
├── question_test.json
└── settings.json

現在のプログラムでは画像ファイルとプログラムファイルは同じフォルダ内に存在しています。

それでは始めていきましょう。

Twitter API用のJSONファイル

前にTweepyを使って、Twitter APIに接続したときはプログラムファイル上にTwitter APIのAPIキーを記載していました。

でもこれってGitHubで公開するにはAPIキーを毎回消さないといけないので、結構めんどくさい。

その後、Djangoを触っている内に設定ファイルはJSONに書き込むという技を覚えたので、今回のAPIキーもJSONファイルに記載し、プログラムとは別にしておきましょう。

ということでJSONファイル(settings.json)はこんな感じです。

{
    "account":"@Account Name",
    "consumer_key":" your consumer key ",
    "consumer_secret":" your consumer secret ",
    "access_token":" your access token ",
    "access_token_secret":" your access token secret "
}

ちなみにTwitter APIキーの取得に関してはこちらの記事をご覧ください。

最後に作成した画像ファイルを取得

作成した画像ファイルは日時を名前にしたファイル名となっています。

つまり作れば作るほど、画像ファイルは貯まっていく仕様です。

単純にTwitterでツイートするだけなら、画像を上書きしてツイートすればいいのですが、せっかくなので、画像を貯めて3PySci-Appの方でギャラリーでも作ろうかなと企んでいます。

なので画像は消さずに貯めていく仕様なのですが、ここで一つ問題があります。

多数の画像ファイルから、最新の画像を取得する必要があります。

ということでまずはその部分のプログラムから。

<セル6>

import tweepy
import json
import os

png_files = []
for file in os.listdir('./'):
    if file[-4:] == '.png':
        png_files.append(file)

upload_png = sorted(png_files)[-1]

print(png_files)
print(upload_png)

for関数を使って、フォルダ内のファイルのファイル名を確認し、「.png」を持つものだけリストpng_filesに格納しています。

そして「sorted()」を使うことで、リスト内を昇順にして、その最後のファイル名を変数upload_pngに格納しました。

upload_png = sorted(png_files)[-1]

これを実行するとこんな感じになります。

実行結果
['20210729145122.png', '20210729145126.png', '20210729145103.png', '20210729145116.png', '20210729145111.png', '20210729145407.png']
20210729145407.png

これで最新の画像を取得することができました。

Tweepyで画像付きツイート

最後にTweepyで画像付きツイートをします。

<セル7>

with open('./settings.json', 'r') as f_in:
    settings = json.load(f_in)

auth = tweepy.OAuthHandler(settings['consumer_key'], settings['consumer_secret'])
auth.set_access_token(settings['access_token'], settings['access_token_secret'])

api = tweepy.API(auth, wait_on_rate_limit = True)

text = 'この中に一つだけ違う文字があります😁\n#見つけたらRT'

api.update_status_with_media(status = text, filename = upload_png)

まずTwitter APIのAPIキーは「settings.json」に保管してあるので、読み込みます。

with open('./settings.json', 'r') as f_in:
    settings = json.load(f_in)

次にTwitter APIへの接続ですが、ここは前にも解説していますので、細かい解説は省きます。

auth = tweepy.OAuthHandler(settings['consumer_key'], settings['consumer_secret'])
auth.set_access_token(settings['access_token'], settings['access_token_secret'])

api = tweepy.API(auth, wait_on_rate_limit = True)

Twitter APIへの接続に関しては、こちらをどうぞ。

あとはツイートするだけ。

text = 'この中に一つだけ違う文字があります😁\n#見つけたらRT'

api.update_status_with_media(status = text, filename = upload_png)

単純に文章をツイートする場合は、「api.update_status(“ツイートするテキスト”)」でしたが、画像や動画ファイル付きでツイートする場合は、「api.update_status_with_media(status = “ツイートするテキスト”, filename = “アップロードするファイル”)」となります。

これを実行するとこんな感じでツイートされます。

これで目的が達成できました。

ここからサーバーで自動実行できるようにしたプログラムをGitHubで公開していますので、よかったらどうぞ。

(ただし随時アップデートしていますので、プログラム内容や使用方法等が異なる場合があります。)

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次