catcutの日記

気ままに更新します。過去の制作物もそのうち公開します。

fireHD10でpythonを動かしたい

とりあえず覚え書き。

とりあえずターミナルエミュレータのtermuxをインストールすれば良いらしい。
Termux | The main termux site and help pages.

apkファイルというのをインストールした。
インストーラを起動するとセキュリティ関連の警告が出るが、解除して実行する。
termuxを起動して“termux-change-repo”を実行する。
“Main repository”を選択してok
“Mirrors by Grimler”を選択してok
“pkg update”を実行する。
“pkg upgrade “を実行する。
“ termux-setup-storage”を実行する。
“pkg install python”を実行する。
“pkg install micro”を実行する。

使いそうなライブラリをここに乗っ取ってインストールする。
Python - Termux Wiki

あとはエクスプローラアプリをインストールした。
基本はdocument内に.pyファイルを置く予定。
パスは”/storage/emulated/0/Documents”かな。

ラズパイとTwythonを使った自動リツイートシステムの構築について④


ラズパイを使って特定ユーザーのツイートを自動でリツイートするシステムを紹介します。いくつかの記事に分けて掲載する予定です。

面倒くささを3段階で示しておきます。★の数が多いほど面倒くさいです。

①下準備 ★★★

下準備A: twitter APIの利用申請 ★★★
下準備B: ラスパイの設定 ☆★★

②コーディング ☆☆☆

③定期実行の設定 ☆☆★

前回はTwitterAPIの設定を行いました。

catcut.hatenablog.com

今回は定期実行の設定について説明します。

方法はいろいろありますが、今回はcronというものを使います。


Youtubeに完成品の動作イメージを投稿しました。
youtu.be
youtu.be

PCでの操作

ラズパイ画面を操作します。

下のコマンドを実行します。

sudo apt-get install chkconfig cron





機能が有効か確認します。

sudo chkconfig cron



機能が無効であれば、有効にします。

sudo systemctl enable cron




crontabを編集します。

crontab -e




下のほうにカーソルを持っていき、入力します。

下のコマンドは入力例です。3時間ごとにカレントディレクトリを移動してouen.pyを実行しています。

* /3 * * * cd /home/pi/twython/project1; python3 ouen.py






5つの*は、”分”、”時”、”日”、”月”、”曜日”の設定を表します。*は特に指示がないことを表します。
例えば

5 * * * * cd /home/pi/twython/project1; python3 ouen.py

であれば、*時5分にタスクが実行されます。

5 5 * * * cd /home/pi/twython/project1; python3 ouen.py

であれば、毎日5時5分にタスクが実行されます。


"/"、","、"-"を駆使すれば様々な設定が可能です。

/5 * * * * cd /home/pi/twython/project1; python3 ouen.py

であれば5分おきにタスクが実行されます。

/5 1-5 * * * cd /home/pi/twython/project1; python3 ouen.py

であれば毎日1~5時の間で5分おきにタスクが実行されます。

/5 1,5 * * * cd /home/pi/twython/project1; python3 ouen.py

であれば毎日1時~2時と5時~6時の間で5分刻みににタスクが実行されます。

曜日については、
0:日曜日
1:月曜日
2:火曜日
3:水曜日
4:木曜日
5:金曜日
6:土曜日
7:日曜日
となっています。日曜日は0と7の2パターンあります。好きなほうで設定して下さい。


設定が終わったら「ctrl」+「x」を押して終了します。
保存しますかと聞かれたら「y」を押します。
エンターキーを押して保存します。元の画面に戻ります。




機能の確認をしたいので

* * * * * cd /home/pi/twython/project1; python3 ouen.py

を追加します。毎分タスクが実行されます。



ログを確認すると、無事にタスクが実行されていることがわかります。


とりあえず以上です。

ラズパイとTwythonを使った自動リツイートシステムの構築について③


ラズパイを使って特定ユーザーのツイートを自動でリツイートするシステムを紹介します。いくつかの記事に分けて掲載する予定です。

面倒くささを3段階で示しておきます。★の数が多いほど面倒くさいです。

①下準備 ★★★

下準備A: twitter APIの利用申請 ★★★
下準備B: ラスパイの設定 ☆★★

②コーディング ☆☆☆

③定期実行の設定 ☆☆★

前回はラズパイの設定を行いました。

catcut.hatenablog.com

今回はコーディングについて説明します。


Youtubeに完成品の動作イメージを投稿しました。
youtu.be
youtu.be


Twythonライブラリについて

TwitterAPIという仕組みを使いやすくしたライブラリです。
TwitterAPIそのものではありません。これがなくとも自動投稿はできますが非常に面倒くさいです。

まず全体像です。

2つの.pyファイルを作成します。
1つ目はTwitterAPIへのアクセスキーを記述したファイルです。
下記記事で作成した4つの文字列を記述します。

API Key
API Key Secret
Access Token
Access Token Secret


2つ目は実際にリツイートするプログラムです。
2つのファイルは同じフォルダに入れておいてください。

catcut.hatenablog.com

auth.py
api_key = 'your key'
api_key_secret = 'your key'
access token = 'your access token'
access_token_secret = 'your access token'

ouen.py
# -*- coding: utf-8 -*-
from twython import Twython
from auth import (
	api_key,
	api_key_secret,
	access_token,
	access_token_secret
)
import datetime
import csv
import pprint
import os

class Tweet:
	def __init__(self):
		self.twitter = Twython (api_key, api_key_secret, access_token, access_token_secret)

		folder_path = os.getcwd()
		self.TText_path = folder_path + '/TText'
		self.csv_path =  folder_path + '/coume.csv'
		self.log_text_path = folder_path + '/log_data.txt'

		#create csv file and folder, if these don't exist.
		os.makedirs( self.TText_path, exist_ok = True)
		if os.path.exists(self.csv_path) == False:
			set_data = ['Wed Dec 28 09:27:18 +0000 2022', '1608031831169077248', self.TText_path + '/Text0.txt']
			with open(self.csv_path, "w", encoding='utf-8') as f:
				writer = csv.writer(f)
				writer.writerow(set_data)

	def toko(self, user_name = 'dayukoume'):
		#record execution time to the log text file
		with open(self.log_text_path, "a") as f:
			f.write("[{}] :".format(datetime.datetime.now().strftime("%Y%m%d_%H:%M:%S")))
		
		#read the previous data
		with open(self.csv_path, "r") as f:
			reader = csv.reader(f)
			preData = [row for row in reader]

		#get date to use from the user timeline
		user_timeline = self.twitter.get_user_timeline(screen_name = user_name, count = 5)
		buf = self.extract_data(user_timeline = user_timeline)

		#write the data to .csv
		with open(self.csv_path, "w") as f:
			writer = csv.writer(f)
			writer.writerows(buf)

		#Retweet
		num_RT = self.RT(ID = self.toko_check(preData = preData, nowData = buf), buf = buf)

		#update the logdata
		with open(self.log_text_path, "a") as f:
			f.write( str(num_RT) + '件リツイート!\n')

	def extract_data(self, user_timeline):
		buf = [[]]
		for i in range(len(user_timeline)):
			TTP = self.TText_path + '/TText' + str(i) + '.txt' #Tweet Text Path 
			with open(TTP, "w") as f:
				f.write(user_timeline[i]['text'])       
			buf.append([user_timeline[i]['created_at'],user_timeline[i]['id'],TTP])
		buf.pop(0)
		return buf

	def toko_check(self, preData, nowData):
		toko_data = [i for i in range(len(nowData))]
		for i in range(len(nowData)):
			flag = 0
			for j in range(len(preData)):
				if nowData[i][0] == preData[j][0]: flag = 1
				if self.reject_check(textData_path = nowData[i][2], reject_word = 'RT @') == True: flag = 1
			if flag == 1: toko_data.remove(i)
		return toko_data

	def reject_check(self, textData_path, reject_word = 'RT @'):
		with open(textData_path, "r") as f:
			textData = f.read()
		if reject_word in textData:
			return True
		return False

	def RT(self, ID, buf):
		if ID:
			for i in range(len(ID)):
				print(buf[i][1])
				self.twitter.retweet(id = buf[i][1])
		return len(ID)

def main():
	print('小梅太夫を応援します')
	twython_bot=Tweet()
	twython_bot.toko()
	print('successful!!')

if __name__ == "__main__":
	main()

プログラムの実行前と実行後

実行前のフォルダ


ディレクトリを移動してプログラムの実行


出力ファイル3種

ログファイル:何件リツイートしたか記録


csvファイル:投稿時間とツイートIDとテキスト内容を記録したファイルのパスを記載


テキストファイル:ツイートのテキストを格納したファイル

プログラムの流れ

  1. main関数として呼び出されたらmain()という関数を呼び出します。(97~98行目)
  2. 処理に使うクラスをtwython_botという名前でインスタンス化します。(93行目)
  3. __init__というメソッドが呼び出されます。(15~29行目)
  4. ツイッターAPIを使うための準備をします。(16行目)
  5. 現在の作業ディレクトリを取得します。(18行目)
  6. 処理に使用するパスの定義をしておきます。(19~21行目)
  7. フォルダを再帰的に作成します。すでにある場合は無視されます。(24行目)
  8. csvファイルがなければ作成しておきます。処理内容の記録用のファイルです。(25~29行目)
  9. tokoというメソッドを呼び出します。今回は引数を与えません。(94行目)
  10. user_nameという引数を与えられます。ツイッターアカウントのユーザーネーム(@を除く)を指定します。(31行目)
  11. プログラムの起動時刻が記録されます。(33~34行目)
  12. 前回の処理内容を読み取っておきます。(37~39行目)
  13. timelineを取得します。(42行目)
  14. 取得したデータは情報量が多いため、必要な情報のみを抽出します。(43行目)
  15. timelineからツイートのテキストデータを抽出して、テキストファイルに保存します。(59~62行目)
  16. 投稿時刻とツイートID、テキストのパスを格納したリストを作成します。(63行目)
  17. 最初の要素は空なので消し飛ばします。(64行目)
  18. 読み取ったデータをcsvファイルに上書きします。(46~48行目)
  19. リツイートを行います。特定の条件のツイートIDをtoko_checkというメソッドで抽出してリツイートを行います。(51行目)
  20. 今回タイムラインから抽出したデータの要素番号を格納するリストを作成します。(68行目)
  21. 前回抽出したデータと総当たり戦を行います。投稿時刻が重複しているもの、テキストに"RT @"とついているものをリツイート対象から排除します。(69~74行目)
  22. テキストに"RT @"がついているかどうかはreject_checkというメソッドで行っています。(73行目)
  23. テキストファイルを読み取り、文字列に"RT @"が存在すればTrue、存在しなければFalseを返します。(77~82行目)
  24. リツイートするIDが抽出出来たら、実際に投稿します。(84~89行目)
  25. リツイートした数が返ってくるので、記録しておきます。(54~55行目)

取得するタイムラインデータの例

必要なデータを抽出しましょう。

[{'contributors': None,
  'coordinates': None,
  'created_at': 'Tue Jan 03 15:42:12 +0000 2023',
  'entities': {'hashtags': [{'indices': [37, 47], 'text': 'まいにちチクショー'}],
               'symbols': [],
               'urls': [],
               'user_mentions': []},
  'favorite_count': 351,
  'favorited': False,
  'geo': None,
  'id': 1610300502587371524,
  'id_str': '1610300502587371524',
  'in_reply_to_screen_name': None,
  'in_reply_to_status_id': None,
  'in_reply_to_status_id_str': None,
  'in_reply_to_user_id': None,
  'in_reply_to_user_id_str': None,
  'is_quote_status': False,
  'lang': 'ja',
  'place': None,
  'retweet_count': 50,
  'retweeted': False,
  'source': '<a href="http://twitter.com/download/android" '
            'rel="nofollow">Twitter for Android</a>',
  'text': '湯の花かと思ったら~、\n\nロクロク首にピアスでした~。\n\nチクショー!!\u3000#まいにちチクショー',
  'truncated': False,
  'user': {'contributors_enabled': False,
           'created_at': 'Sun Oct 16 08:15:54 +0000 2011',
           'default_profile': True,
           'default_profile_image': False,
           'description': 'https://t.co/9RPGbBGxgg\n'
                          '\n'
                          'チクポーレディオ\n'
                          'https://t.co/erHVqVbO5m\n'
                          '        \n'
                          'コウメ太夫のクックショー!\n'
                          'https://t.co/H0jtfq3lIu',
           'entities': {'description': {'urls': [{'display_url': 'instagram.com/koumedayu/',
                                                  'expanded_url': 'https://www.instagram.com/koumedayu/',
                                                  'indices': [0, 23],
                                                  'url': 'https://t.co/9RPGbBGxgg'},
                                                 {'display_url': 'youtube.com/user/shotti01/',
                                                  'expanded_url': 'http://youtube.com/user/shotti01/',
                                                  'indices': [34, 57],
                                                  'url': 'https://t.co/erHVqVbO5m'},
                                                 {'display_url': 'youtube.com/channel/UC0-bl…',
                                                  'expanded_url': 'https://www.youtube.com/channel/UC0-bl1zmCvGuOvHvhbC7bbw',
                                                  'indices': [81, 104],
                                                  'url': 'https://t.co/H0jtfq3lIu'}]}},
           'favourites_count': 44,
           'follow_request_sent': False,
           'followers_count': 183173,
           'following': True,
           'friends_count': 713,
           'geo_enabled': True,
           'has_extended_profile': True,
           'id': 391900115,
           'id_str': '391900115',
           'is_translation_enabled': False,
           'is_translator': False,
           'lang': None,
           'listed_count': 713,
           'location': '',
           'name': 'コウメ太夫',
           'notifications': False,
           'profile_background_color': 'C0DEED',
           'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png',
           'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png',
           'profile_background_tile': False,
           'profile_banner_url': 'https://pbs.twimg.com/profile_banners/391900115/1492515189',
           'profile_image_url': 'http://pbs.twimg.com/profile_images/378800000865932105/orzBqjQ1_normal.jpeg',
           'profile_image_url_https': 'https://pbs.twimg.com/profile_images/378800000865932105/orzBqjQ1_normal.jpeg',
           'profile_link_color': '1DA1F2',
           'profile_sidebar_border_color': 'C0DEED',
           'profile_sidebar_fill_color': 'DDEEF6',
           'profile_text_color': '333333',
           'profile_use_background_image': True,
           'protected': False,
           'screen_name': 'dayukoume',
           'statuses_count': 5765,
           'time_zone': None,
           'translator_type': 'none',
           'url': None,
           'utc_offset': None,
           'verified': False,
           'withheld_in_countries': []}}]

ラズパイとTwythonを使った自動リツイートシステムの構築について②


ラズパイを使って特定ユーザーのツイートを自動でリツイートするシステムを紹介します。いくつかの記事に分けて掲載する予定です。

面倒くささを3段階で示しておきます。★の数が多いほど面倒くさいです。

①下準備 ★★★

下準備A: twitter APIの利用申請 ★★★
下準備B: ラスパイの設定 ☆★★

②コーディング ☆☆☆

③定期実行の設定 ☆☆★

前回はTwitterAPIの設定を行いました。

catcut.hatenablog.com

今回は下準備B: ラスパイの設定について説明します。


Youtubeに完成品の動作イメージを投稿しました。
youtu.be
youtu.be

PCでの操作

下記サイトからラズパイOSのインストーラーをDLします。

www.raspberrypi.com

OSを「RASPBERRY PI OS(32-BIT)」、マイクロSDカードを選択して「書き込む」をクリックします。


ラズパイの操作

OSの書き込みが終わったらラズパイにマイクロSDを差し込んで起動します。

最初の起動の時に諸々設定することがありますが、流れに沿って進めてください。
設定が完了したら再起動するのを待ちます。

VNCサーバーを設定します。

別のPCからラズパイを触れるようになるため、便利です。
スタートメニューから、「設定 -> Raspberry Piの設定」をクリックします。
インターフェイス」を選択し、VNCの項目を有効にして、「OK」をクリックします。



設定が完了すると下図のようにVNCのマークが出現します。


ライブラリのインストールを行います。

$sudo apt-get update

インストール可能なパッケージの一覧を更新します。

$sudo apt-get upgrade

インストール済みのパッケージを更新します。
この順番で実行してください。



使用するライブラリのインストールを行います。

・Twython
・datetime
csv
・pprint
・os
Raspberry Pi Imager v1.7.3:2022-09-22更新バージョンではdatetime以外はすでにインストールされていたので、datetimeをインストールするだけでした。

>

Raspberry Pi Imager v1.7.3:2022-09-22更新バージョン


sudo pip install datetimeを行います。

datetimeのインストール


microというエディタをインストールします。

軽いエディタなので重宝します。
sudo apt-get install micro


とりあえず今回は以上です。


次回はコードの紹介を行います。

ラズパイとTwythonを使った自動リツイートシステムの構築について①


ラズパイを使って特定ユーザーのツイートを自動でリツイートするシステムを紹介します。いくつかの記事に分けて掲載する予定です。

面倒くささを3段階で示しておきます。★の数が多いほど面倒くさいです。

①下準備 ★★★

下準備A: twitter APIの利用申請 ★★★
下準備B: ラスパイの設定 ☆★★

②コーディング ☆☆☆

③定期実行の設定 ☆☆★


今回は下準備A:twitter APIの利用申請について説明します。


Youtubeに完成品の動作イメージを投稿しました。
youtu.be
youtu.be

使用する機能についての簡単な説明


twitterの自動投稿にはAPI(Application Programming Interface)という仕組みを利用します。
アプリとプログラムをつなぐ入口みたいなものです。ツイッター社が公開している仕組みを利用します。

TwitterAPIは、ツイッター社が提供しているツイートデータの非公開情報をユーザーが管理できるようにしたものです。

利用申請すると
・自動ツイート
・自動いいね&リツイート
・自動フォロー&フォロー解除
テキストマイニング
などが行えます。

Twitter APIは基本的に無料で使えますが、その用途を申請する必要があります。
APIを使用するアカウントは電話番号の紐づけが必須です。※

申請の流れ

Twitter APIのプラットフォームにアクセスします。

developer.twitter.com

サインインします。

サインインします

下にスクロールしてTwitter APIのLearn moreをクリックします。

Learn moreをクリックします

下のほうにスクロールしてGet Startedをクリックします。

Get Startedをクリックします。

必要項目を入力してLet’s do thisをクリックします。

What country are you based in?
日本でいいと思います。

What's your use case?
"Making a bot"または"Exploring the API"でいいと思います。
学生なら"Student"でもいいかもしれません。

いろいろ入力

規約を全部読んだらチェックを入れてSubmitをクリックします。

規約を読んでSubmit

メールが届くので確認してください

プロジェクト名を入力してGet keysをクリックします。

※この後出力される文字列(APIキー)は後で利用します。また、他人に教えないこと、なくさないこと

Get Keys

今の状態だと読取専用権限のため、機能拡張の申請を行います。

英作文を強いられます。DeepLなどを駆使しましょう。



聞かれる内容は

Twitter APITwitter Dataをどのように利用するか(できるだけ具体的に説明する)。 200文字以上
Twitterのデータを分析する予定はあるか、その時、ツイートやTwitterユーザーの分析など、Twitterのデータをどのように分析するのか。 100文字以上
・ツイート、リツイート、いいね!、フォロー、ダイレクトメッセージなどの機能を使用するか、どのように使用するか。 100文字以上
Twitterのコンテンツに関するツイートや集計データをTwitter以外で表示する予定があるか、Twitterのコンテンツに関するツイートやデータをTwitterの外部で表示する方法と場所はどこか。 100文字以上
・ツイートやTwitter情報を行政機関に提供するか。 100文字以上

申請が通るまで気長に待ちましょう。早ければ1時間もしないうちに承認されます。

アプリの権限を変更します。申請が通らないと変更できません。

URLを入力させられますが、ひとまず「https://twitter.com」にしておきます。




コンシューマーキーが発行されます。

※この後出力される文字列はとても大事なので他人に教えないこと




アクセストークンを発行します。

※この後出力される文字列(APIキー)は後で利用します。また、他人に教えないこと、なくさないこと




以上で作業は終わりです。

API Key
API Key Secret
Access Token
Access Token Secret

APIを使用するときに使うので必ず控えておいてください。

うまくいかない場合は時間を空けてからそれぞれのKeyを再発行してみてください。(RevokeしてRegenerateしてみてください。)

今回は以上です。


次回はラズパイの設定を行います。

catcut.hatenablog.com