テキストベースのコミュニケーションをするにはやはりtwitterが一番良いんだと思っています。
他国ではInstagramやFacebookが主流ですが日本ではtwitterの利用率が多いというものあり
日本語を学びたいと思う方はtwitterを上手く活用して欲しいなと思ったりも。
今回なんですが、twitterを使ったBotというものを紹介しようと思います。
まず、何するのというところから説明すると
日本語のフレーズや単語をワンフレーズずつ
→ それを見て表現を勉強する、返信することでアウトプットになる
膨大な量のデータから1つを選択して投稿することは大変
データをコピーして変換して投稿していたら時間がいくらあっても足りない
twitter botを作って、投稿はお願いしちゃおう
このような経緯で作成することにしました
作るための必要となった環境は
こんなところです
pythonでコードを全て書いています
作業のフローは
ご自身のアカウントでtwitter developerへアクセスし
developer portalへログインしましょう

初回の場合、このようなフォームの入力が適宜求められるのでポチポチ入力してpush

この状態で既にtwitter APIを使える状態です。

突然、APIという用語が出てきました、botはこのapiを使って作っていきます
簡単にいうと、このプラットフォームの利用規約に準じた内容であれば自分で開発して良いですよということですね
現段階では、botはできません
というのも、twitter apiには段階があり、botを作るには Twitter API v2 Elevatedの申請をし許可をもらわないといけないからです

こちらもですが適宜自分がapiを使って何をするのか申告し許可をもらいます
48時間以内にtwitter社から返信メールが届きます
こんな感じで

ルールに沿っていないので、却下しますという内容です
そう返ってきたら、再度メールで返信をして、利用規約に乗ったものを作ると説明をしましょう
問題なしと認められたら承認のメールが届きます

このように緑のチェックマークが入ります

これでtwitter api の準備がokです
pythonコードを書いていきます
今回のファイル構造はこのようになっています
| - file - - hagoromo-data-20211118.xlsx
| | _ _ kanjiN4N5.csv
|
| _ src - - working.ipynb
| _ _ hagoromo.db
| _ _ kanji.db
| _ _ twitterSecret.json
変数でもjson形式のファイルでも何でも良いのですが
twitter apiのアクセストークンを呼び出せるようにします
json fileで保存しており、今後必要となるであろう全ての値を保存しています
twitter developerよりご自身の値を適宜入れてもらうと良いと思います
{
"api_key" : "*****************************",
"api_key_secret" : "*****************************",
"API_Key": "*****************************",
"API_KEY_secret" : "*****************************",
"bearer_token" : "*****************************",
"OAuth_2.0_Client_ID":"*****************************",
"OAuth_2.0_Client_Secret" : "*****************************",
"ACCESS_TOKEN" : "*****************************",
"ACCESS_SECRET" : "*****************************"
}コードを書くのですが膨大なデータを扱います
file/hagoromo-data-20211118.xlsx がそれに当たるのですが
1行だけを選択して投稿するのに
pd.DataFrame.read_excelメソッドで呼び出すのはメモリが勿体無いですし
レコードを追加して行くことを考えているので、データベースから呼び込む方法にします
pythonには標準ライブラリでsqlite3というデータベースを使えるので
そこにエクセルファイルのデータを格納します
#!pip install pandas
import pandas as pd
import sqlite3
path = '../file/hagoromo-data-20211118.xlsx'
df = pd.read_excel(path) #エクセルファイルの読み込み
dbname = 'hagoromo.db'
conn = sqlite3.connect(dbname) #hagoromo.dbに接続。まだ存在しない場合は新規に作成されます
df.to_sql('hagoromo',conn, if_exists='replace', index=False) #pd.DataFrame.to_sqlメソッドで格納
conn.close() #データベースへの接続を切ります。このコードは忘れずに書きましょうこれによりエクセルデータを全てデータベースへ格納できました
例えばこのデータベースから10行だけ抽出したいときはこのようなコードを書きます
dbname = 'hagoromo.db'
conn = sqlite3.connect(dbname)
query = 'Select * From hagoromo limit 10'
df_sql = pd.read_sql_query(query, conn)
print(df_sql)
conn.close()では、ここからbot用に1行セレクトするコードを書きましょう
データベースは下記のようになっています

ランダムな数字を発生させてその値とIDが一致するレコードを抽出することにします
import numpy as np
dbname = 'hagoromo.db'
con = sqlite3.connect(dbname)
cur = con.cursor()
num = np.random.randint(0,1717)
query = '''
Select
表示見出し, 品詞分類, 意味, 見出し英訳, 意味英訳, 例文
From
hagoromo
Where
ID = ?
'''
res = cur.execute(query, (num,))
print(res.fetchone())
con.close()
'''
('など〜ものか', '文型', '軽視', 'not at all ~, never ever ~', 'Disrespect • strong decision', '自分で努力もしないやつを手伝ってなどやるものか。/A:田中さんって,親切ですよね。B:ええっ,田中さんなんか,親切なもんですか。')
'''numpy.randintメソッドで乱数を発生させ(0から1717の間)てそれをIDナンバーと一致するものを抽出するクエリを書いています
この取り出した内容をtwitter botで投稿するために加工したコードの中身がこちらです
def automation_bot():
# twitterに定期botするコード
import re
import random
import tweepy
import numpy as np
import json
import sqlite3
import warnings
warnings.simplefilter('ignore')
'''hagoromo.dbからランダムに1行抜き出すcode
'''
dbname = 'hagoromo.db'
con = sqlite3.connect(dbname)
cur = con.cursor()
num = np.random.randint(0,1717)
query = '''
Select
表示見出し, 品詞分類, 意味, 見出し英訳, 意味英訳, 例文
From
hagoromo
Where
ID = ?
'''
element = cur.execute(query, (num,))
res = element.fetchone()
con.close()
'''
twittetに投稿するcode
'''
f = open("twitterSecret.json", 'r')
json_data = json.load(f) #JSON形式で読み込む
'''
twitterへ投稿する内容をカスタマイズするcode
'''
new_res1 = []
for i in res[1]:
new_res1.append(i)
new_res1 = ''.join(new_res1)
print(new_res1)
new_res1 = re.sub('[,:?]','/',new_res1)
content = f'''
\ ワンポイント日本語 / \n\n
【{res[0]}】\n
種類:{new_res1}
意味:{res[2]}
英語:{res[3]} /{res[4]}
例文:{res[5]}
🚀Post your examples in this thread!
#Japanese #study #日本語 #English #{res[0]}
'''
# twitterに投稿できる長さの制限があるので長すぎる場合は現在投稿させていません
if len(content) >185:
print(f"contentの長さは{content}です")
# print(content)
# print(len(content))
else:
#****には自身のコードを入力してください
CONSUMER_KEY = json_data["API_Key"]
CONSUMER_SECRET = json_data["API_KEY_secret"]
ACCESS_TOKEN = json_data["ACCESS_TOKEN"]
ACCESS_SECRET = json_data["ACCESS_SECRET"]
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)
api.update_status(content)
あとは定期的に関数 automation_bot() を走らせたら良いので scheduleで実行できます
import schedule
import time
# 実行job関数
def job():
automation_bot()
print("job実行")
#1時間毎のjob実行を登録
schedule.every(4).hours.do(job)
# #AM09:00のjob実行を登録
# schedule.every().day.at("09:00").do(job)
# #日曜日のjob実行を登録
# schedule.every().sunday.do(job)
# #日曜日14:..のjob実行を登録
# schedule.every().sunday.at("14:00").do(job)
# jobの実行監視、指定時間になったらjob関数を実行
while True:
schedule.run_pending()
time.sleep(1)また、Mac ですと cronで定期実行できます
個人的にはGCP上で定期実行させようと思いますが、まだコードの改善と作成するのでテスト段階のため実装に至っていません
今後改良していきたいと思います
現在はこのコードで十分稼働しているので満足ですね
皆さんの学習に立つことを祈った心のこもったBotです!

ちょっと、このコードが複雑という方向けに
次のJLPTまでのカウントダウンコードも走らせているのでそれもご紹介します
from datetime import datetime as dt
import re
import json
today = dt.today()
exam_day = dt.strptime("2022-12-4", "%Y-%m-%d")
rest_days = exam_day - today
regex = r'\d*'
result = re.search(regex, str(rest_days))
print(result.group())
content = "Good morning!\n JLPT12月の試験まで残り " + result.group() + " 日!!\n#JLPT #日本語能力試験 #N5 #N4 #N2 #N1"
f = open("twitterSecret.json", 'r')
json_data = json.load(f) #JSON形式で読み込む
CONSUMER_KEY = json_data["API_Key"]
CONSUMER_SECRET = json_data["API_KEY_secret"]
ACCESS_TOKEN = json_data["ACCESS_TOKEN"]
ACCESS_SECRET = json_data["ACCESS_SECRET"]
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)
api.update_status(content)
以上がコンテンツ紹介でした!!今後もコード作成をしていきます!!
こんなのがあれば便利だな、日本語学習に役立つなと思うものあればリクエストください!
可能かはわかりませんがコンテンツ作成のアイディアに組み込みますので
ではでは、また。