MENU

Python-seleniumではてなブログ自動投稿プログラムを作ってみる④~ユーザ情報の保存~

こんにちは、のちたままです。

はてなブログ自動投稿プログラム作成第4回です。

前回を見ていない方は先にご覧ください。

nochitamama.hatenablog.com

今回は少しずれてユーザ情報についての話です。

IDや日付、時刻など何度も同じものを入力するのは非常に手間なので、前回入力した情報を保存しておいて起動時に同じ値が使えるようにしておくと便利です。

今回はそんな話です。

(GUIを完成させるにはこの話をしておかなければいけないのを忘れていました。)

user.jsonについて

前回、プログラムの構成について話をしたと思います。

その時に、GUIからuser.jsonというところに矢印が相互についていたと思います。

あのuser.jsonのお話です。

user.jsonというのは、json形式のファイルです。

自分はよくユーザ情報の保存に使っています。

本来は.iniとか使った方がよいと思いますが、使い勝手が良いのでこちらを使っています。

というか趣味で作っているものなので別に形式は問わないといったスタンスです。

json形式はpythonの辞書型のような形をしています。

細かく言うと異なるのですが、keyと値を使うのは共通しています。

実際に作成したjsonファイルを以下に載せておきます。

{
    "Id": "",
    "Check": {
        "Id": true,
        "Day": true,
        "Time": false},
    "Daytime": {
        "Year": "",
        "Month": "",
        "Day": "",
        "Time": "",
        "Minutes": ""
    }
}

このようにKeyと値で構成されるのでpythonを触っている人は扱いやすいと思います。

pythonjsonを使う方法

ここでは簡単にpythonjson形式のファイルを扱う方法を紹介します。

必要がなければGUIの修正の方まで飛ばしてください。

jsonの読み込み

pythonではありがたいことにjsonのライブラリが標準で存在します。

以下のプログラムで指定したファイルを読み込むことができます。

import json
f=open('user.json','r')
j=json.load(f)
print(j)
f.close()
{'Id': '', 'Check': {'Id': True, 'Day': True, 'Time': False}, 'Daytime': {'Year': '', 'Month': '', 'Day': '', 'Time': '', 'Minutes': ''}}
{'Check': {'Day': True, 'Id': True, 'Time': False},
 'Daytime': {'Day': '',    
             'Minutes': '',
             'Month': '',
             'Time': '',
             'Year': ''},
 'Id': ''}

辞書型と同じで順番に出てくれるわけではないみたいですね。

今回はf=open()という書き方をしましたが、文字コードの指定など細かい設定が必要ならwith open()を使う方がよいと思います。

使い方はここでは割愛します。

jsonへの書き込み

書き込みも読み込みとあまり差はありません。

唯一の違いはjson形式のファイルで出力するにはjson.dumpが必要ということでしょうか。

import json
f2=open('user.json','w')
j["Id"]='nochitamama'
json.dump(j,f2)
f2.close()
{'Check': {'Day': True, 'Id': True, 'Time': False},
 'Daytime': {'Day': '', 'Minutes': '', 'Month': '', 'Time': '', 'Year': ''},
 'Id': ''}
{'Check': {'Day': True, 'Id': True, 'Time': False},
 'Daytime': {'Day': '', 'Minutes': '', 'Month': '', 'Time': '', 'Year': ''},
 'Id': 'nochitamama'}

この読み込み、書き込みのやり方さえ覚えれば今回の内容は理解できますのでご安心ください。

それではGUIのコードに組み込んでいきましょう。

GUIのコードに組み込む

それではまずGUI側のコードにjsonファイルを読み込み処理を加えます。

def main():
    dict1={1:'公開',2:'予約投稿',3:'下書き保存'}
    f=open('user.json','r')
    user=json.load(f)
    f.close()
    layout=[
        [sg.Text('ID',size=(15,1)),sg.InputText(default_text=user['Id'], key='ID'),sg.Checkbox('保存', key='ID_CHECK',default=user['Check']['Id'])],
        [sg.Text('Password',size=(15,1)),sg.InputText(key='PW')],
        [sg.Text('ファイル',size=(15,1)),sg.InputText(key='FILE'),sg.FileBrowse()],
        [sg.Text('公開設定',size=(15,1)),sg.Radio(dict1[1],'RADIO1',default=True,key='1'),sg.Radio(dict1[2],'RADIO1',key='2'),sg.Radio(dict1[3],'RADIO1',key='3')],
        [sg.Text('日付',size=(15,1)),sg.InputText(size=(5,1),default_text=user['Daytime']['Year'],key='YEAR'),sg.Text('年'),sg.InputText(size=(5,1),default_text=user['Daytime']['Month'],key='MONTH'),sg.Text('月'),sg.InputText(size=(5,1),default_text=user['Daytime']['Day'],key='DAY'),sg.Text('日'),sg.Checkbox('日付を保存する',default=user['Check']['Day'],key='DAY_CHECK')],
        [sg.Text('時刻',size=(15,1)),sg.InputText(size=(5,1),default_text=user['Daytime']['Time'],key='TIME'),sg.Text('時'),sg.InputText(size=(5,1),default_text=user['Daytime']['Minutes'],key='MINUTES'),sg.Text('分'),sg.Text(size=(8,1)),sg.Checkbox('時刻を保存する',default=user['Check']['Time'],key='TIME_CHECK')],
        [sg.Submit(button_text='実行する')]
    ]
上のコードはGUIのコードの一部です。

3-5行目あたりにjsonファイルの読み込みを入れています。

また、layoutの中にdefault_textとかdefaultという文字がいくつか見えると思います。

default_textGUIを開いたときにデフォルト表示させる文字列です。

Checkboxはdefaultで設定します。

このように書くことで、user.jsonから読み取った情報を各デフォルト値として設定することができます。

では続いて書き込み側です。

def userjson_save(user,userid,year,month,day,time,minutes,checkid,checkday,checktime):
    if checkid:
        user['Id']=userid
    if checkday:
        user['Daytime']['Year']=year
        user['Daytime']['Month']=month
        user['Daytime']['Day']=day
    if checktime:
        user['Daytime']['Time']=time
        user['Daytime']['Minutes']=minutes
    user['Check']['Id']=checkid
    user['Check']['Day']=checkday
    user['Check']['Time']=checktime
    f=open('user.json','w')
    json.dump(user,f)
    f.close()

userの各値に対して引数を割り当てています。

if文がいくつか入っているのは、チェックボックスの状態で上書きするかどうかを変えているからです。

また、最後の3行でuser.jsonに上書きをしています。

これにより、自分が入力した情報がuser.jsonに上書きされ、再度プログラムを起動したときに前回入力した情報がデフォルトで表示されるようになります。

あとはuserjson_saveをwhileの中に組み込めば完成です。

最後に

ユーザ情報の読み込み、書き込み(保存)の組み込みが終わりました。

次回はついにGUIを完成させましょう。

それが終わったらスクリプトを書き直して終わりです。

それでは。


nochitamama.hatenablog.com