[1]独自のフォーマットに基づいてQRコードを発行する

この記事は[QRコードを使った入場システムを自作する。](https://qiita.com/inchoXD/items/10e22dbde4a5d4724c44)シリーズの記事です。
#前回
[QRコードを使った入場システムを自作する。](https://qiita.com/inchoXD/items/10e22dbde4a5d4724c44)でなんとなく概要と経緯を説明しました。今回からは実践編です。
#QRコードを発行するには。
PythonでQRコードを生成できるモジュールがあったのでそれを使う。
###まずはインストール
`$ pip3 install qrcode`

###実際に書いてみる。

```QR1.py
import qrcode

#QRコードのサイズを指定
qr = qrcode.QRCode(box_size=5)
#QRコードにする文字列
qr.add_data('Hello_World')
#QRコードを作成
qr.make()
#QRコードを画像化
img = qr.make_image()

#生成した画像を保存
img.save('test.png')

print('Success Generated.')
```

###作成した結果...

`作成されたQRコード`
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/1b97e24d-0c14-ca03-b2e3-77965c07a2e0.png)
読み取ってみると...
`読み取った結果`
<img width="320" alt="IMG_4025.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/d494b2b7-b632-8667-221c-53330c4ac829.png">

簡単に作成ができました。

#作成したQRコードを独自のフォーマットに基づき発行しdbに登録する
以下の大まかな手順により発行しdbへ登録する

- 上記のソースコードを利用し独自のフォーマット(後述）でQRコードを作成する。
- MySQL上"testdb"の"QRtest"テーブルにQRコード(ID)と発行した時刻を保存する。

`(今回はMySQLの環境構築とラズパイ鯖の構築方法は省きます。)`

MySQLをPythonで使えるようにする。(PythonからMySQLに接続するためにmysqlclientパッケージを利用する。)
筆者の実行環境がmacOSであったためまずは以下の手順でライブラリをインストールした。
`$ brew install mysql-connector-c`
次に
`pip install mysqlclient `する。
これでdbにアクセスする準備はできました。

###...独自のフォーマットとは。
発券されるQRコードを識別できるように券種情報を上3桁、ユーザーIDを下9桁をそれぞれ特定の範囲でランダムに生成し組み合わせることでQRコード(ID)を作成する。

###実際に書いてみる。

```dbtest.py
'''
    author: @inchoxd
    ver: 0.1.1
    2019/12/5: MySQLに対応
    2019/12/5: QRコードの生成とdbへの登録機能を追加
'''

import qrcode
import random
import os
import datetime
import mysql.connector as testdb

#サイズの指定
qr = qrcode.QRCode(box_size=15)

'''
    QRコードのフォーマット
    ***@@@@@@@@@ -> 12ケタ
    ***---------: 3ケタ, 券種
    ---@@@@@@@@@: 9ケタ, ID 
'''

#券種
ctype = random.randint(693, 862)
#ID
csid = random.randint(100000000, 999999999)
#券種とIDを文字列に変換してQRidを生成
QRid = str(ctype) + str(csid)

#時刻と日付を取得し文字列へ変換
date = datetime.datetime.now().strftime('%Y/%m/%d')
sdate = str(date)
time = datetime.datetime.now().strftime('%H:%M:%S')
stime = str(time)

#QRコードの生成
qr.add_data(QRid)
qr.make()
#QRコード画像を生成
img = qr.make_image()
#/QRimgフォルダへ保存
img.save(os.path.join('./QRimg',str(QRid)+'.png'))

#MySQLへ接続
conn = testdb.connect(
    user = 'tester', 
    password = '12345', 
    host = '192.168.x.x',
    port = '3306',
    database='QRtest'
)

#接続ステータスを確認
conn.ping(reconnect=True)
print(conn.is_connected())

cur = conn.cursor()

#table: QRidへデータを格納 
table = 'QRid'
cur.execute("INSERT INTO QRid VALUES (%s, %s, %s)", (QRid, sdate, stime))

#MySQLへの接続を終了
cur.close()
conn.commit()
conn.close()

print('Data Saved!')
print(str(date)+' '+str(time)+'| Generated Successfully.')
```

###実行した結果...
`ターミナル`
![スクリーンショット 2019-12-29 2.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/a1dc993e-15d1-c581-553b-c61e6baedb8a.png)
`MySQL`
![スクリーンショット 2019-12-29 2.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/7007ee83-d641-9fb9-7fe4-0c8aa7b20164.png)
`作成されたQRコード`
![708377970881.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/c0415dfe-a9bb-f308-1054-a833cd5b2e04.png)
`読み取った結果`
<img width="320" alt="File_001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/4ec2d6a1-58a0-8d46-cd33-39ef61d5b3be.png">

QRコードを作成しdbへ登録。そして生成されたQRコードが読み取れました。
QRコードを作成するスクリプトの基礎的なものは完成しました。

#次回予告
***[[2] 作成したQRコードを読み取り識別する。](https://qiita.com/inchoXD/items/ded8600b83d9aa231dd3)***