mameブログ

mameという男がやりたい事をやっている記録

Pythonで関数、モジュール、パッケージを作成する

■はじめに

以前、C++JPEG画像にフィルタをかける関数プログラムを作成しました。
mame-mame.hatenadiary.com


次の記事では、そのフィルタ関数をスタティックライブラリとして作成しました。
mame-mame.hatenadiary.com


では、Pythonコードではどのようにするのでしょう。
本記事では
Pythonの「関数化&モジュール化」「ライブラリ(パッケージ)化」
について紹介します。

Pythonでの作成方法

本記事におけるサンプル

今回サンプル関数として、四則演算を使用します。
加算関数をadd
除算関数をsub
乗算関数をmul
除算関数をdiv

としました。
この関数を作成して、アプリ側では関数をコールします。

関数化&モジュールの作成方法

要点だけお伝えします。
関数化する際はdefを使います。
C/C++のように変数の型指定が無いため、返り値の型宣言はありません。
一方でC/C++のように引数の設定や帰り値の指定は行います。
指定の方法はC/C++と同様です。
では、四則演算関数を定義します。

def add(x,y):
    result = x + y
    return result

def sub(x,y):
    result = x - y
    return result

def mul(x,y):
    result = x * y
    return result

def div(x,y):
    result = x / y
    return result

SAMPLE_NUM_X = 8
SAMPLE_NUM_Y = 4


SAMPLE_NUM_X、SAMPLE_NUM_Yも宣言しておきました。
以上の記述した内容を、calc_func.pyという名前でファイル保存します。
calc_func.pyは各関数を集めたモジュールとなります。


次にアプリ側。
アプリ側はコールしたいモジュールをimportによって参照します。

import calc_func

if __name__=='__main__':
    a1 = calc_func.add(5,3)
    print(a1)
    a2 = calc_func.sub(4,6)
    print(a2)
    a3 = calc_func.mul(calc_func.SAMPLE_NUM_X, calc_func.SAMPLE_NUM_Y)
    print(a3)
    a4 = calc_func.div(calc_func.SAMPLE_NUM_X, calc_func.SAMPLE_NUM_Y)
    print(a4)


以上の記述した内容を、exec1.pyという名前でファイル保存します。


ターミナルで、アプリを実行すると以下の結果が得られます。
f:id:mizzzo:20200506154747p:plain
四則演算がきちんと実行できています。
乗算・除算は、calc_func.pyモジュールの変数も参照しています。

パッケージの作成方法

パッケージはディレクトリ(フォルダ)によって定義します。
パッケージ内に、モジュールと__init__.pyを置くことによりアプリ側からはパッケージと認識されます。


calc_packageというディレクトリ名でディレクトリ作成します。
ディレクトリ内に、calc_func.pyと、__init__.pyを置きます。
__init__.pyには何も書く必要はありません。
calc_func.pyというファイルには以下を記述します。
(モジュール化の説明と同名ですが、異なる内容を記述します)

def add(x,y):
    result = x + y
    return result

def sub(x,y):
    result = x - y
    return result

def mul(x,y):
    result = x * y
    return result

def div(x,y):
    result = x / y
    return result

SAMPLE_NUM_X = 10
SAMPLE_NUM_Y = 2


次にアプリ側です。
アプリ側はコールしたいパッケージ内及びその中のモジュールをfrom ○○ import ●●によって参照します。

from calc_package import calc_func

if __name__=='__main__':
    a1 = calc_func.add(5,3)
    print(a1)
    a2 = calc_func.sub(4,6)
    print(a2)
    a3 = calc_func.mul(calc_func.SAMPLE_NUM_X, calc_func.SAMPLE_NUM_Y)
    print(a3)
    a4 = calc_func.div(calc_func.SAMPLE_NUM_X, calc_func.SAMPLE_NUM_Y)
    print(a4)


以上の記述した内容を、exec2.pyという名前でファイル保存します。
※1行目以外、exec1.pyとexec2.pyは同じ内容です。


ディレクトリ構成は以下のようになります。
f:id:mizzzo:20200506160415p:plain


ターミナルで、exec2.pyアプリを実行すると以下の結果が得られます。
f:id:mizzzo:20200506160605p:plain
calc_package内に保存したcalc_func.pyを参照している事は、乗算・除算(SAMPLE_NUM_X、SAMPLE_NUM_Yを使用)の結果からも分かります。

if __name__ == "__main__":について

PythonC/C++と異なり、main関数がありません。
その代わり本構文で、モジュールを直接実行する時に、どこから実行するかを定義しています。
直接実行するとは、本記事で示しているようにコマンドラインからPythonアプリを実行する事を指します。
一方でそれ以外の方法としてモジュールをインポートして使用する場合があります。
本構文を使用すると、モジュールをインポートして使用する場合に関数の中身はコールされません。


詳しくは、以下のサイトが参考になります。
techacademy.jp


__init__.pyについて

__init__.pyはアプリがモジュールを検索する時のマーカーとなります。
このファイルがなければ、exec2.pyは実行時エラーが発生します。


詳しくは、以下のサイトが参考になります。
qiita.com

■おわりに

本記事では、モジュール化やパッケージ化を紹介しました。
大規模プロジェクトになってくると、1ファイルではとても整理できなくなってきます。
プロジェクト構成を整理しやすくするために、本記事のようなノウハウは必須になってくるでしょう。

Instagramで自動イイネ(ライクLike)を実施するPythonコード

■はじめに

SNSにおける影響力は重宝されるもスキルです。
意図してバズらせる・ブームを生むために何が必要か、そのための道は明確ではありません。
企業では色んな人のつぶやきを集めた「ビッグ・データ」を解析する事で、ブームの徴候を把握したり、ブームを生むためにはどうしたら良いかを検討しています。


個人が出来る事としては
自身のアカウントのフォロワーを増やす
事でしょう。
自分のアカウントが発するつぶやきが多くの人の目に留まる≒影響力が大きい、と考えます。
そしてフォロワー数を増やすには、他のアカウントと交流を増やす事が第一であると思います。
交流、色々な手段がありますが、イイネ(或いはライク)が最も単純かつ明確な行為です。


今回は少々ワル~な手段として、
自分で手でポチポチとイイネをしなくても、
自動で指定のタグを検索して、自動でイイネをする手段
を紹介します。


今回は、C++について書いた記事で紹介した「Git」というサイトに、上記の自動スクリプトを組んだプロジェクトがありますので、それを利用します。
mame-mame.hatenadiary.com


Gitにある「InstaPy」プロジェクトを参照します。
github.com


具体的な手順は以下から…。

■自動イイネの実行手順

Anacondaをインストール

InstaPyは、Pyという名の通りPythonというプログラミング言語を使っています。
なのでPythonの実行環境を入れます。
インストール方法など丁寧な手順は以下にあります。
www.python.jp

Firefoxをインストール

InstaPyでは自動でブラウザを開いてInstagramを制御します。
ブラウザはFirefoxを使用する事を前提としていますので、こちらもインストールします。
Windowsユーザは普段、Internet ExplorerGoogle Chromeを使っているかもしれませんのでこちらは対応が必要です。
www.mozilla.org

InstaPyを導入する

先で導入したAnacondaはPythonを扱うための実行環境・ツールセットを一揃いでインストールする事が出来ます。
InstaPyはGitでプロジェクトを公開していますが、Anacondaインストール時にセットされるコマンドプロンプト上でもプロジェクトをダウンロード出来ます。
「スタートボタン」を押下するとプロジェクト一覧が表示されます。
その中の「Anaconda」→「Anaconda Prompt」を開きます。
「Anaconda Prompt」で以下を打ち込みます。


pip install instapy


以上で、実施準備は完了です。
InstaPyはPython環境で使用できるInstagramAPIを提供しています。
API仕様は以下に説明があります。
github.com


後は、そのAPIをたたくアプリケーションプログラムを自分で作れば良いだけです。

アプリケーションプログラムを作る

InstaPyは非常に親切なので、sampleコードも提供されています。
例えば、↓のquickstart.py
github.com


他にも、色んなsampleコードがここにも↓
github.com


自動イイネを実行するのにちょうど良いのはquickstart.pyです。
このコードをベースに改良します。

""" Quickstart script for InstaPy usage """

# imports
from instapy import InstaPy
from instapy import smart_run
from instapy import set_workspace

# login credentials
#自分のアカウント名と、自分のパスワードを打ち込みます
insta_username = 'アカウント名を入力'
insta_password = 'パスワードを入力'


# set workspace folder at desired location (default is at your home folder)
set_workspace(path=None)

# get an InstaPy session!
session = InstaPy(username=insta_username,
                  password=insta_password,
                  headless_browser=True)

with smart_run(session):
    # general settings
    # Excluding friends 
    # will prevent commenting on and unfollowing your good friends (the images will still be liked)
    session.set_dont_include(["friend1", "friend2", "friend3"])

    # 実行(以下にイイネしたいタグ名を入力します、●●にはイイネする回数を入力します)
    session.like_by_tags(["タグ名を入力"], amount=●●)
       #tags: The tags that will be searched for and posts will be liked from
       #amount: The amount of posts that will be liked

    #実行にあたっては以下のURLを参照
    #https://github.com/timgrossmann/InstaPy/blob/master/DOCUMENTATION.md#like-by-tags


このコードを自身のPCのローカル上に保存します。
ファイル名は「autolike.py」としておきます。

実行

「Anaconda Prompt」で以下を打ち込みます。


python autolike.py


これで実行完了です。
後はプログラムが自動でFirefoxを立ち上げ、Instagramの画面を開きます。
ユーザ名とパスワードに指定した文字列を打ち込みます。
指定したタグ名を検索し、検索時の投稿の新しい順に●●個分だけイイネ(Like)を押します。

■おわりに

様々なAPI仕様を見ると、フォローを自動で増やしたり、フォロワーを自動解除したり、色々出来る事がありそうです。
引き続き試してみた結果はブログで紹介していきます。
今回のautolike.pyを使えば、まえおきで紹介したように
自動でイイネができる
→フォロワーが増える
→自分の発言を見てくれる人が増える
→意図してバズらせる
事が出来る、かもしれません。


注意点として、Instagramはこのようにプログラムコードを使った開発は推奨していますが、自動イイネなど、人間がやるべき事をプログラムが代替して自動実行する事は望んでいないようです。
手動であってもイイネをあまりにも短時間に多く繰り返すと、イイネがあるスパンで効かなくなります。
自動実行をする際は、ある程度の量にとどめましょう。