こんばんわ。秋鐘です!(*^▽^*)ノ
今日は非プログラマが全く無知の状態からPythonを使ってTwitterBOTを作成してみた記録を残します👏
Pythonとは
皆さん、Pythonってご存じですか??AI分野が盛んになってから流行ってきてるプログラミング言語らしいんですけど、前々から興味があったので勉強してみました。実践に勝る勉強はなし!ということでいきなりAIもどきを作ってみました👍
Python2とPython3では文法が違うようなので要注意🤔
TwitterBOTとは
TwitterBotとは予め設定した条件に従って勝手にツイートしたりリツイートしたりしてくれるAIロボットです。Twitterが用意してるAPI(tweepy)によって動作します🦜tweepyを制御する命令はPythonで書きます🐍
お手軽にBotを作成してくれる基本無料の代行サービスもありましたが、Sweet☆Home公式Botの要求を満たす制御だと月500円程度の保守料が必要になってしまうので諦めました🤦♂️💦
制作環境
- windows 10
- Visual Studio Code 1.43.0
- python 3.8.2
- tweepy 3.8.0
テキストエディタ
pythonコードを書くにはテキストエディタが必要。テキストエディタなら何でも良いらしく、サクラエディタで開発してました🤪
後に会社の先輩からVisual Studio Cordを紹介してもらいました🤓❣️
python導入
pythonのインストールや基本的な使い方の解説はこちらのサイトを参考にしました💁♂️
Let’sプログラミング
https://www.javadrive.jp/python/
tweepy導入
tweepyのインストールはこちらを参考にしました💁♂️
pipでtweepyをインストールしてAPI1.1に対応させて使う
https://qiita.com/lacolaco/items/f2a8928ef54626a75ae1
TwitterDeveloperのライセンス
TwitterBotを作成するには、Twitter公式から許可をもらう必要があります。申請の仕方はこちらを参考にしました💁♂️
Twitter Developerの開発者申請(例文あり)とAPIキー取得方法まとめ【2019年版】
https://digitalnavi.net/internet/3072/
頑張って英文考えたんですよ😚褒めて欲しい✨
自作Botの仕様を検討
【目標】夫婦2人のtweetを自動でリツイートして1アカウントに集約する
- 最新tweetから50件前まで検索してリツイートする
- コメントへの返信はリツイートしない
- 既にリツイート済みだった場合のエラーは例外処理でスキップする
- リツイートが成功したら♥を付ける
- 夫婦2人分まとめて実行する
- 1日1回自動で実行する
Bot作成
完成したコードを自慢❗️👏#テキストの部分がコードの説明になります🤗
コピペで役立ててくれたら嬉しいけど、ド素人が書いたコードなのでヒント程度に生ぬるく眺めて下さい😅#の説明も間違ってるかも・・・
完成コード
#Sweet☆Home公式Bot(プロトタイプ)
import tweepy
#-----------------------------------------------------------------------------
# KEYの指定
CONSUMER_KEY = "*****"
CONSUMER_SECRET = "*****"
ACCESS_TOKEN = "*****"
ACCESS_TOKEN_SECRET = "*****"
# tweepyの設定(認証情報を設定)
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
# tweepyの設定(APIインスタンスの作成)
api = tweepy.API(auth)
print("------------------------------------------------------------------")
print("秋鐘の最新ツイートをリツイート")
akikane = api.user_timeline(screen_name="SweetHo84497180",count=50) #秋鐘のタイムラインを取得し、akikaneに格納
for status1 in akikane: #countの回数だけ繰り返し実行。タイムラインから繰り返しstatusを取得する。
def if_in1(a): #関数if_in1を定義。文中に特定の文字列があった場合の分岐処理
if '@' in a: #aに代入する文中に@があった場合
print('skip retweet1.tweetに@が含まれていたため除外処理') #コマンドプロンプトに skip retweet .とプリントし、twitterでは何も実行しない
else: #それ以外の場合
try: #とりあえずapi.retweetを試してみる
api.retweet(status1.id) #retweet済みエラーが出なければリツイートする
api.create_favorite(status1.id) #いいねを付ける
print('success retweet1.') #ログ
except tweepy.error.TweepError: #retweet済みエラーが出た場合は以下を実行する
print('skip error1. You have already retweeted this Tweet.') #コマンドプロンプトに skip error1.をプリントし、次のtweet検索に進む
if_in1(status1.text) #status1に格納したtweetをaに代入して関数if_in1を実行
print("------------------------------------------------------------------")
print("琉偉の最新ツイートをリツイート")
rui = api.user_timeline(screen_name="SweetHo21619667",count=50)
for status2 in rui:
def if_in2(b):
if '@' in b:
print('skip retweet2.tweetに@が含まれていたため除外処理')
else:
try:
api.retweet(status2.id)
api.create_favorite(status2.id)
print('success retweet2.')
except tweepy.error.TweepError:
print('skip error2. You have already retweeted this Tweet.')
if_in2(status2.text)
実行時のコマンドプロンプト
実行が成功した場合はコマンドプロンプトに何も表示されません。
それがどうにも気持ちが悪いので成功したのか、リツイート済みエラーを例外処理したのか、返信だったから除外処理したのかログを出すようにしました。
C:\■■■>cd C:\▲▲▲\Python
C:\▲▲▲\Python>python sweethome-official-bot.py
------------------------------------------------------------------
秋鐘の最新ツイートをリツイート
skip error1. You have already retweeted this Tweet.
success retweet1.
success retweet1.
skip retweet1.tweetに@が含まれていたため除外処理
skip retweet1.tweetに@が含まれていたため除外処理
skip retweet1.tweetに@が含まれていたため除外処理
skip retweet1.tweetに@が含まれていたため除外処理
skip error1. You have already retweeted this Tweet.
skip error1. You have already retweeted this Tweet.
skip retweet1.tweetに@が含まれていたため除外処理
skip error1. You have already retweeted this Tweet.
・・・中略・・・
------------------------------------------------------------------
琉偉の最新ツイートをリツイート
skip error2. You have already retweeted this Tweet.
skip retweet2.tweetに@が含まれていたため除外処理
skip retweet2.tweetに@が含まれていたため除外処理
skip retweet2.tweetに@が含まれていたため除外処理
・・・中略・・・
1日1回自動で実行
コードが完成しても毎日手動で実行してたら全く意味がありません💦目指したいのは完全自動化です🐉
レンタルサーバーを借りる、自宅にサーバーを買うなどいろいろ方法はあるようですが、Sweet☆Home公式Botに求めるのは完全無料👻
タスクスケジューラで十分だった
一番お手軽なのはWindows10のタスクスケジューラを利用する方法です。詳しくはこちら💁♂️
Windowsのタスクスケジューラを使ってpythonスクリプトを定期的に自動実行しよう!
https://ryota-trade.com/?p=4610
Windowsタスクスケジューラーのスリープ解除実行でハマったこと
https://qiita.com/yoinhu/items/8a1d49f17207d40a68dc
BIOSでPC自動起動
一見上手く行ったかに思えましたが、タスクスケジューラが起動するための条件としてPCが起動中かスリープ状態である必要があります🌛つまりPCの電源が入ってないとタスクスケジューラが起動出来ないんです😅
そこでPCの電源を定時に自動でONにできないか調べたら出来ました😃
『BIOS設定』で検索🤖メーカーによって設定方法や設定項目や、そもそも設定可能かどうか違ってるらしいです。
Sweet☆Homeでは『DELL』のノートPCを使っていますが、分単位で自動起動設定が出来ました✨
電源プラグ🔌に接続していればノートPCの蓋を閉じた状態で放置しててOK🙆♂️定時にPC起動→タスクスケジューラ起動→スリープ状態に移行→電源OFFとなることが確認出来ました😇
実装しながら学んだこと
文字列とは何か?・・・が超大事だった
「文字列なんて知ってるよ!文字が並んでるやつだろ!?」なんて思ってたら一生プログラミングできないと思いました🤯
python初心者は必ずこの記事を読むべきだと思います😤ここから一気に道が開けたような気がします🐲
Pythonで文字列を扱うには?文字列の基本操作を解説
https://www.sejuku.net/blog/28147
やりたい事に対して実装方法は複数ある
コメントへの返信まで全部リツイートしちゃって大変なことになりそうだったので、返信を除外する命令を検討しました。基本的にはtweet内に”@”が含まれていた場合に返信と判定できるのですが、”@”の検索方法はいろいろあるようです🎲
会社の先輩にfindを教えてもらいましたが、結果的に in を使うことでfindよりスマートな実装になったと思ってます🤺詳細はこちら💁♂️
【3分でPython入門】if文である値が含まれているか知る方法
https://www.sejuku.net/blog/15588
API実行の前にprint()で動作確認する
いきなりリツイートする命令を書くのではなく、print()を使ってifとinの動作を確認しながら書いていくようにしてからスピードが一気に上がりました🚴♂️
- “@”がヒットした場合はprint(“ヒット!除外!”)
- “@”がヒットしなかった場合はprint(“リツイート!”)
こんな感じです。すべての実装でprint()を使ったチェックが有効でした。狙った通りのコメントを取得できたらprint()を実際の命令に書き換えていきます🎨
開発裏話
最後に、開発中にtweetしてた内容を張り付けておきます🦜毎日がとてもエキサイティングでワクワクキラキラしていました✨
pythonの勉強を兼ねて Twitter Bot を作成中🤩
昨日はpythonからtweetする所までいけました✨テンション上がります🥳
その後、基本的な所で詰まってネットをぐるぐるしてましたが、会社で聞いたら5分で解決😭
こういう所は組織が強い😝
早く帰って続きやりたい👾
息子が許してくれるかどうか‥— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 9, 2020
よっしゃー‼️
帰宅して早速試したら5分で解決したわい😹Q.対話モードだとtweepy使えるのに通常モードだと使えないんす😭
A.それパス通ってないだけ。
環境変数設定すればOK🙆♂️Q.対話モードで.pyが実行出来ないんス😭
A.対話モードだと実行出来ないよ👍
あれはコマンド直打ち用モード— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 9, 2020
昨日は
①.pyで実行する
②特定のアカウント(秋鐘)の最新tweetを取得してリツイートするという所まで行けました😚
次は
“仮想サーバーから定期実行”
が目標👾
ワクテカが止まらない✨😆✨
— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 10, 2020
仮想サーバーは面倒だしお金掛かるからWindowsタスクスケジューラ試してみた。
ノートpcでスリープ状態で蓋閉じてても無事リツイート完了😭
何か笑っちゃった🤣
1日1回夫婦のtweetをリツイートしたいだけだからタスクスケジューラで十分そう🎉
次の目標は夫婦2人分まとめてリツイート🏖
— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 10, 2020
夫婦2人分まとめてリツイートはクリア出来ましたー🗽
しかし、コメントへの返信までリツイートしてしまったので
次の目標は
“ツイートに@が含まれていたらリツイートしない”
です!🏋️
— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 11, 2020
“tweetに@が含まれていたらリツイートしない”
クリア🎉✨
if と in を使いました👾
だんだん分かってきた‼️【次の課題】
①今は最新1件についてしか判定しないので、最新5件を判定するよう拡張②すでにリツイート済みだった場合は無視して次の判定に進む
— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 11, 2020
①最新50件を判定
②リツイート済みだった場合は無視実装完了🏋️‼️
ついでに
③リツイート成功、@を検出したからスキップ、リツイート済みだからスキップ、の3パターンの結果をログ表示
を実装してモヤモヤを解消しました🤡
これで99%完成✨😆
【最後の実装予定】
リツイート成功時に❤️をつける— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 12, 2020
ついにSweet☆Home公式Botが完成しました〜🎉
Sweet☆Home-Official-Bot@SweetHomeOffic1
夫婦2人のtweetを自動リツイートして1つのアカウントにまとめてくれます🥳
ブログからTwitterに来て、新規フォローしてくれる人向けのコンテンツとなります❣️
「 It’s a wrap ❗」🙌😆✨#ブログ書け
— Sweet☆Home-夫の秋鐘 (@SweetHo84497180) March 12, 2020
毎日進化し続けるSweet☆Homeを今後もご期待ください!🐉🦊
ちなみに2万円で自宅にサーバー設置できるらしいです😳