Python pynput - マウスボタンを連打する(1)

キーボードやマウス操作を行うライブラリ「pynput」をご紹介します。

「キー入力」や「マウスを動かす」「クリックする」などのほか、その操作をした時の「イベント」を処理することもできます。

インストール

次のコマンドを実行し「pynput」をインストールします。

1
pip install pynput

コーディング

次は1秒おきに左クリックを行うソースになります。

1
2
3
4
5
6
7
8
9
10
11
from pynput.mouse import Button, Controller
import threading, time

def mouseclick(e):
while not e.isSet(): # e.set()が実行されるまでFalseを返す
Controller().click(Button.left) # 左ボタンをクリックする
time.sleep(1) # 1秒待ち
e = threading.Event()
threading.Thread(target=mouseclick, args=(e,)).start() # スレッドを開始する
input() # 入力待ち
e.set() # e.isSet()がTrueになる

プログラムを実行すると、連打が始まります。
コンソール上で「Enter」キーを押すと連打がとまります。

Python PyAutoGUI - GUI作業の自動化

GUI操作を自動化できればPCの単純操作を任せることができるようになり大変便利です。

今回は、GUI操作を自動化するライブラリの「PyuAutoGUI」をご紹介します。

インストール

1
pip install PyAutoGUI

コーディング

簡単に座標位置をクリックするだけのコードは次のようになります。

1
2
3
4
import pyautogui

pyautogui.moveTo(100, 100)
pyautogui.click()

この処理は「moveTo」と「click」を合わせて下記のように書くこともできます。

1
pyautogui.click(100, 100)

座標を調べたい場合は、下記のコードを実行するとマウス位置の座標を調べることができます。
1
2
3
4
5
6
7
8
9
10
import pyautogui

pos1 = []
while True:
pos2 = pyautogui.position()
if pos1 == pos2:
pass
else:
print(pos2)
pos1 = pos2

ただ座標位置を指定する方法ですと、座標をいちいち調べないといけませんし座標が変わってしまうようなときには対応できなくなります、

このようなときには「画像マッチング機能」を使い画像を探してクリックや入力するなどの操作を行います。

1
2
3
4
5
6
7
8
9
10
11
import pyautogui, time

while True:
# 'btn.png'には探すべき画像ファイルを指定
btn = pyautogui.locateCenterOnScreen('btn.png')
if btn is None:
pass
else:
print('find!')
pyautogui.click(btn)
time.sleep(1)

locateCenterOnScreenメソッドを使うと、画像とマッチした座標を探すことができます。
上記のコードでは、対象の画像が見つかった場合にその画像のクリックを行います。

Python OCR - 画像からテキストを取り出す

スキャンした画像やカメラ画像などから、テキストを抽出できると大変便利です。

テキストを抽出するにはOCR処理を行う必要があります。

今回はGoogle社が提供する「tesseract-ocr」を使って画像からテキストを抽出してみます。

インストール

まず下記サイトから「tesseract-ocr-w64-setup-v5.0.0-alpha.20200223.exe」をダウンロードしてインストールします。

tesseract-ocr - https://github.com/UB-Mannheim/tesseract/wiki

インストール中にコンポーネントを選択する画面が表示されますので
[Additional language data(download)] から、[Japanese] と [Japanese(vertical)] の2つを選択しておきます。

コンポーネント選択


次に「tesseract-ocr」をインストールしたフォルダ・パスを、環境変数 path に追加します。

私は「C:\Util」配下へインストールしましたが、みなさんの環境に合わせて設定して下さい。

環境変数(例)


最後に、pyocrをコンソールからインストールします。

「pyocr」は「tesseract-ocr」を使うためのライブラリで、pipコマンドで次のようにインストールします。

1
pip install pyocr

コーディング

Pythonで下記のようにコーディングし、実行します。
1
2
3
4
5
6
7
8
from PIL import Image
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
img = Image.open('c.png')
txt = tools[0].image_to_string(img, lang='jpn', builder=pyocr.builders.TextBuilder())
print(txt)
6行目には読み込ませる画像を設定します。 7行目のlangパラメータは 'jpn' が日本語、'eng' だと英語での認識となります。

検証1

最初に簡単だと思われる平仮名だけの画像で試してみました。

平仮名の画像

結果は「うとん」。
おしい・・・濁点が読み取れなかったようです。

検証2

次にアルファベットの画像を試してみました。

アルファベットの画像


結果は「SearchPrevlew」・・・・一瞬正解のように思えましたが 'i' のところを 'l' と誤って認識しています。

これは言語のパラメータを’jpn’から’eng’に変えて再度試したところ「SearchPreview」と正しく認識されました。
言語パラメータを合わせるのも大事なようです。

検証3

最後に漢字が含まれる2行の画像で試してみました。

漢字が含まれる2行の画像


結果は・・・

「ここにファイルをドラッグ&ドロップしてください。
 お使いのブラウザが対応していれば」

完璧です。

ただほかにも難しめの漢字などを試してみましたが結果はよくありませんでした。

最初に大まかにOCRでテキスト化して、最後に人が確認するというように分担すれば作業効率化を図ることは可能かと思います。参考になれば幸いです。

Python Pillow - 画像に重ねて文字を描く

ブログやサムネイル作成など、画像に文字を重ねたいことがあります。

GIMPやペイントなどのグラフィックスソフトを使い、手作業で文字を入れることもできますが、コピーライトなど同じ文字を何度も入れたい場合は自動化すると便利です。

今回はPillowというライブラリを使って画像にテキストを追加する処理を自動化していきます。

インストール

まずは、Pillowをインストールします。
1
pip install pillow

コーディング

Pythonで下記のようにコーディングし、実行します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from PIL import Image, ImageDraw, ImageFont

text = 'Sample' # 画像に追加する文字列を指定
img = Image.open('owl.png') # 入力ファイルを指定

imagesize = img.size # img.size[0]は幅、img.size[1]は高さを表す
draw = ImageDraw.Draw(img) # ImageDrawオブジェクトを作成

font = ImageFont.truetype("arial.ttf", 64) # フォントを指定、64はサイズでピクセル単位
size = font.getsize(text)

# 画像右下に'Sampleと表示' #FFFは文字色(白)
draw.text((imagesize[0] - size[0], imagesize[1] - size[1]), text, font=font, fill='#FFF')
# ファイルを保存
img.save('out.png', 'PNG', quality=100, optimize=True)
入力に指定した画像ファイルは下記となります。

入力画像

出力画像

正常に処理ができると次のように文字が追加された画像ファイルが出力されます。

出力画像

Python OpenCV - 動画のサムネイルを作る

動画を管理するときにはサムネイルがあると便利です。

サムネイルは、動画を再生してキャプチャしたり動画編集ソフトで切り出したりすることで作成できます。ただ数が多いと大変な作業となります。

PythonとOpenCVを使えば、動画からサムネイルを簡単に作ることができます。


インストール

まずは、OpenCVをインストールします。
1
pip install opencv_python

コーディング

Pythonでコーディングします。
1
2
3
4
5
6
7
import cv2
file = 'samp.mp4' # 動画のファイル名(パス)を指定
cap = cv2.VideoCapture(file)

cap.set(cv2.CAP_PROP_POS_MSEC, 1000) # 再生位置を第2引数にミリ秒で指定
res, img = cap.read()
cv2.imwrite('cap.png', img)
5行目ではキャプチャしたい再生位置をミリ秒で指定します。

再生位置を変えて5~7行目の処理を繰り返せば、サムネイルを繰り返し作成することができます。
(ファイル名も変更する必要がありますので気を付けてください。)


よく使うプロパティ

上記のサンプルコードでは、再生位置を指定する場合「CAP_PROP_POS_MSEC」プロパティを使いましたが、それ以外でもよく使うプロパティを表にまとめておきます。

cap.getメソッドを使ってプロパティを指定すれば、動画の各種情報が取得できます。

プロパティ名説明
CAP_PROP_POS_MSEC0再生位置を時間で表したもの(ミリ秒単位)
CAP_PROP_POS_FRAMES1再生中のフレーム番号
CAP_PROP_FRAME_WIDTH3フレームの幅
CAP_PROP_FRAME_HEIGHT4フレームの高さ
CAP_PROP_FPS5フレームレート
CAP_PROP_FRAME_COUNT7全フレーム数

Python ハッシュ - 同じ内容のファイルを見つける

ファイルが同じかどうかを比較するにはハッシュが便利です。

ハッシュはデータの並びの特徴を表した数値です。
その値が同じであれば、データが同じである確率がとても高くなります。


コード

下記のソースでは指定されたフォルダ(4行目)内に同じ内容のファイルがある場合、そのファイルを表示します。

今回は「SHA256」という種類のハッシュで計算しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os, sys, glob, hashlib
hashlist = {}
# チェックするフォルダパスを指定
path = './work'

for f in [path + '\\' + f for f in os.listdir(path)]:
data = open(f, 'rb').read()
# ファイルのハッシュを計算
h = hashlib.sha256(data).hexdigest()
if h in hashlist:
if data == open(hashlist[h], 'rb').read():
print(hashlist[h] + 'と' + f + 'は同じ')
# os.remove(f) # 重複ファイルを削除する
else:
hashlist[h] = f

13行目のコメントアウトを外すと重複したファイルを消すことができます。

Python WatchDog - フォルダの監視を行う

特定のフォルダにファイルを置くと自動的になにか処理を行うと便利です。

例えば、ファイルを置くとそれを自動で印刷したり、メールをしたりする場合などです。

今回はWatchDogというライブラリを使って、フォルダを監視する方法をご紹介します。


手順1 ライブラリのインストール

まずは次のコマンドを実行して、WatchDogライブラリをインストールします。

1
pip install watchdog

手順2 コーディング

次の通りコーディングを行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer
import time

class ChangeHandler(FileSystemEventHandler):
# すべてのイベント
def on_any_event(self, event):
print('[全て]',event)

# 作成された時のイベント
def on_created(self, event):
print('[作成]',event)

# 変更されたときのイベント
def on_modified(self, event):
print('[変更]', event)

# 削除された時のイベント
def on_deleted(self, event):
print('[削除]',event)

# 移動した時のイベント
def on_moved(self, event):
print('[移動]',event)

observer = Observer()
# 監視するフォルダを第2引数に指定
observer.schedule(ChangeHandler(), './work', recursive=True)
# 監視を開始する
observer.start()

while True:
time.sleep(5)

WatchDogでは5種類のイベントを監視できます。
メソッド内容
on_any_event全てのイベントを監視
on_created作成イベントを監視
on_deleted削除イベントを監視
on_modified変更イベントを監視
on_moved移動イベントを監視

手順3 実行結果を確認

監視フォルダにファイルを作ったり、削除したり、編集したりすると次のようにイベントを検知することができます。

(例) 実行結果


Windowsでは、ファイルを編集するとイベントが2回連続で発生するようなので注意が必要です。

Python - 2つのフォルダの差を表示する

Pythonでは「dircmp関数」を使うと、2つのフォルダにどのような差異があるのかを簡単に調べることができます。

「dircmp関数」は標準ライブラリなので、インストールをする必要はありません。


コーディング

次のコードでは、2つのフォルダを比較し3種類の差異を表示します。

  • 左のフォルダにだけ存在するファイル
  • 右のフォルダにだけ存在するファイル
  • どちらのフォルダにも存在するが、中身が異なるファイル
    (テキストファイルの場合、ファイル内容の差異を表示します)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os
import sys
import difflib
from filecmp import dircmp

def view_diff(dcmp):
for name in dcmp.left_only:
print('{}は{}だけに存在'.format(name, dcmp.left))
for name in dcmp.right_only:
print('{}は{}だけに存在'.format(name, dcmp.right))
for name in dcmp.diff_files:
print('{}は両者で異なります({} {})'.format(name, dcmp.left, dcmp.right))

# テキストファイルの場合、ファイル内の差分を表示する。
if name.endswith('.txt') or name.endswith('.html'):
diff_text = difflib.context_diff(open(os.path.join(dcmp.left, name)).readlines(),
open(os.path.join(dcmp.right, name)).readlines())
sys.stdout.writelines(diff_text)

# 再帰的に探す(サブフォルダを探す)
for sub_dcmp in dcmp.subdirs.values():
view_diff(sub_dcmp)

# 比較するフォルダを引数に指定
view_diff(dircmp('./a', './b'))

実行結果

実行結果は下記のようになります。

実行結果


ファイルの存在ありなしや相違のあるファイルに関してきちんと判定されていました。

ただファイル内容の差異表示に関しては、確認しづらくあまり実用的ではないかもしれません。

Twitter APIを使ってPythonからツイートする

Twitter APIを利用するとPythonからツイートしたり、ツイートの一覧を取得したりすることができます。

まずTwitterにサインインしてから次のURLにアクセスします。

Twitterアプリケーション - https://apps.twitter.com/


手順1 アプリケーション登録

Twitter APIを利用するためにはアプリケーションを登録する必要があります。

ブラウザ右上の「Create an app」をクリックします。

アプリケーション作成


アプリケーション情報を登録します。 入力が必須なのは次の4項目です。

①App Name
 アプリケーション名です。ほかのアプリケーション名と被らないように一意にする必要があります。
②Application description
 アプリケーションの説明です。
③URL
 自分のサイトがあればそのURLを入力します。なければ存在しないURLでも問題ありません。
④Tell us how this app will be used
 Twitter関係者へアプリケーションをどのような用途で使うのかを説明するようです。適当でかまいません

アプリケーション登録1

アプリケーション登録2


上記画面で「Create」ボタンを押すと、アプリケーション登録前に開発関連のポリシーへの同意画面が表示されます。

問題なければ「Create」ボタンを押します。

アプリケーション登録確認ダイアログ


手順2 アプリケーション情報確認

アプリケーションが問題なく登録されると下記のようなページに移動します。


登録されたアプリケーション


「Kyes and tokens」をクリックします。

ここではTwitter APIを実行するときに必要なアクセスキーとトークン情報を確認することができます。


アクセスキーとトークン情報


Twitter APIを実行する際に必要な情報は次の4つです。

  • API key
  • API secret key
  • Access token
  • Access token secret

アクセストークンに関しては「generate」または「Regenerate」をクリックすると表示されます。


手順3 Twitterライブラリをインストール

コンソールから次のコマンドを実行し、Twitterライブラリをインストールします。

1
pip install python-twitter

手順4 Pythonからツイート

Pythonで次のコードを実行します。

1
2
3
4
5
6
7
8
9
import twitter

api = twitter.Api(
consumer_key='######',
consumer_secret='######',
access_token_key='######',
access_token_secret='######')

api.PostUpdate('投稿テスト1')

パラメータにはアプリケーション情報から対応したキー情報を設定します。

  • consumer_key
    「API key」を設定
  • consumer_secret
    「API secret key」を設定
  • access_token_key
    「Access token」を設定
  • access_token_secret
    「Access token secret」を設定

実行が成功すると下記のようにTwitterに反映されます。

ツイート結果


手順5 ツイート一覧取得

Twitter APIを使うとツイートだけではなく、ツイート一覧を取得することもできます。

「screen_name」にはツイート一覧を取得するTwitterユーザ名を設定してください。

1
2
3
4
5
6
7
8
9
10
11
import twitter

api = twitter.Api(
consumer_key='######',
consumer_secret='######',
access_token_key='######',
access_token_secret='######')

status = api.GetUserTimeline(screen_name='aiblog1')
for s in status:
print(s.text)

デフォルトで一度に取得できるツイート数は200個です。

ReportLab - PythonでPDFファイルを出力

「ReportLab」というライブラリを使ってPythonからPDFファイルを出力してみます。

ReportLab - https://www.reportlab.com/


手順1 ReportLabをインストール

まず「ReportLab」をインストールします。

1
pip install reportlab

手順2 PDFを出力

一番簡単にファイル出力するコードは下記の通りです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, mm, cm
#from reportlab.pdfbase import pdfmetrics, ttfonts

# A4サイズで「output.pdf」というファイルを出力
pdf = canvas.Canvas('output.pdf', pagesize=(210 * mm, 297 * mm))

# 原点は左上ではなく左下
pdf.drawString(10 * mm, (297 - 10) * mm, 'PDF OUTPUT TEST')

# 改ページ
pdf.showPage()

# ファイルに保存する。
pdf.save()

上記のコードを実行すると、次のようなPDFファイルが出力されます。

出力したPDFファイル


文字だけでなく、画像を埋め込んだり表を書いたりもできます。