Twitter bot

👤Tera
Twitter Bot で自動投稿しよう!

テキストベースのコミュニケーションをするにはやはりtwitterが一番良いんだと思っています。

他国ではInstagramやFacebookが主流ですが日本ではtwitterの利用率が多いというものあり

日本語を学びたいと思う方はtwitterを上手く活用して欲しいなと思ったりも。

今回なんですが、twitterを使ったBotというものを紹介しようと思います。

まず、何するのというところから説明すると

twitterで投稿したいこと

日本語のフレーズや単語をワンフレーズずつ

→ それを見て表現を勉強する、返信することでアウトプットになる

課題点

膨大な量のデータから1つを選択して投稿することは大変

データをコピーして変換して投稿していたら時間がいくらあっても足りない

解決策

twitter botを作って、投稿はお願いしちゃおう

このような経緯で作成することにしました

作るための必要となった環境は

  • vscode
  • python3
    • pip install numpy
    • pip install json
    • pip install schedule
    • pip install tweepy
  • twitter api

こんなところです

pythonでコードを全て書いています

作業のフローは

1. twitter apiの申請

ご自身のアカウントでtwitter developerへアクセスし

developer portalへログインしましょう

image block

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

image block

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

image block

突然、APIという用語が出てきました、botはこのapiを使って作っていきます

簡単にいうと、このプラットフォームの利用規約に準じた内容であれば自分で開発して良いですよということですね

現段階では、botはできません

というのも、twitter apiには段階があり、botを作るには Twitter API v2 Elevatedの申請をし許可をもらわないといけないからです

image block

こちらもですが適宜自分がapiを使って何をするのか申告し許可をもらいます

48時間以内にtwitter社から返信メールが届きます

こんな感じで

image block

ルールに沿っていないので、却下しますという内容です

そう返ってきたら、再度メールで返信をして、利用規約に乗ったものを作ると説明をしましょう

問題なしと認められたら承認のメールが届きます

image block

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

image block

これでtwitter api の準備がokです

2. botのコードを書く

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行セレクトするコードを書きましょう

データベースは下記のようになっています

image block

ランダムな数字を発生させてその値と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です!

image block

ちょっと、このコードが複雑という方向けに

次の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)

image block

以上がコンテンツ紹介でした!!今後もコード作成をしていきます!!

こんなのがあれば便利だな、日本語学習に役立つなと思うものあればリクエストください!

可能かはわかりませんがコンテンツ作成のアイディアに組み込みますので

ではでは、また。