Pythonista for iOSで松屋のクーポン(QRコード)を表示する

# はじめに

[松屋](http://www.matsuyafoods.co.jp/)好きですか？私は大好きです。
そんなエンジニアなら誰しもが好きな松屋ですが、スマホの[公式アプリ](http://www.matsuyafoods.co.jp/mobile/#cp)や[LINE上で](http://www.matsuyafoods.co.jp/line/)クーポンが配信されていることはご存知でしょうか。

タッチパネル式券売機にQRコードをかざすと使える[^1]のですが、いちいちアプリやLINEを起動してQRコードを表示するのが面倒な上に、画面の輝度が低かったりするとうまく読み取ってくれません。
松屋で発券に17秒以上かける輩は出禁もやむを得ないというのは周知の事実[^2]なので、**最新のQRコードの表示**と**画面の輝度調整**を**ワンタップ**でやってくれる[Pythonista for iOS](http://omz-software.com/pythonista/)用のスクリプトを書きました。

Pythonista for iOSというのはiOS上で動くPython環境で、iOS上でpythonが動くだけでもヤバいのにpythonからObjective-Cのオブジェクトも触れたりなんかもう色々ヤバいアプリです。[^3]

[^1]: 古い券売機の場合は店員さんにクーポンを提示すると使えます。
[^2]: 要出典
[^3]: ヤバさについてはこちらのブログが詳しいです。[iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る](http://hitoriblog.com/?p=42145)

# 使い方
## スクリプト

まずはPythonistaで次のスクリプトを保存します。
PythonistaにはPython2とPython3が搭載されていますがPython3で実行してください。
実行すると、画面輝度を最大にした上で、最新のQRコードが表示されます。[とじる]をタップすると、画面輝度が元に戻ります。

```py3:松屋.py
import urllib.request
import re
import ui
from objc_util import *

def get_matsuya_qrcode_url_linecoupon():
	# LINEクーポン Example
	# http://www.matsuyafoods.co.jp/line/
	# http://www.matsuyafoods.co.jp/sp/line_cp/161115/
	#   http://www.matsuyafoods.co.jp/sp/line_cp/161115/qr_line.png
	
	line_url = 'http://www.matsuyafoods.co.jp/line/'
	with urllib.request.urlopen(line_url) as res:
		html = res.read()
	
	qr_date = re.findall(r"/line/images/cp_(\d{6}).jpg", html.decode('utf-8'))[0]
	qr_url = 'http://www.matsuyafoods.co.jp/sp/line_cp/%s/qr_line.png' % qr_date
	
	return(qr_url)

def get_matsuya_qrcode_url_mobilecoupon():
	# 松屋モバイルクーポン Example
	# http://www.matsuyafoods.co.jp/sp/coupon.html
	#   http://www.matsuyafoods.co.jp/coupon/161115/qr_sp.png
	
	# 松屋モバイルクーポン ケータイサイト Example
	# http://www.matsuyafoods.co.jp/mobile/coupon/
	#   http://www.matsuyafoods.co.jp/mobile/coupon/161115/qr_fp.png
	
	mobile_url = 'http://www.matsuyafoods.co.jp/sp/coupon.html'
	with urllib.request.urlopen(mobile_url) as res:
		html = res.read()
	
	qr_date = re.findall(r"/coupon/(\d{6})/qr_sp.png", html.decode('utf-8'))[0]
	qr_url = 'http://www.matsuyafoods.co.jp/coupon/%s/qr_sp.png' % qr_date
	
	return(qr_url)


def get_matsuya_qrcode_image(url):
	qr_image, headers = urllib.request.urlretrieve(url)
	return(qr_image)

def show_view(qr_image):
	UIScreen = ObjCClass('UIScreen')
	screen = UIScreen.mainScreen()
	prev_brightness = screen.brightness()
	screen.setBrightness(1.0)

	view = ui.View()
	view.name = 'みんなの食卓でありたい。'
	view.background_color = 'white'

	image = ui.Image.named(qr_image)

	imageView = ui.ImageView()
	imageView.image = image
	imageView.flex = 'WH'
	imageView.content_mode = ui.CONTENT_SCALE_ASPECT_FIT

	def button_tapped(sender):
		screen.setBrightness(prev_brightness)
		view.close()

	button = ui.Button(title='[とじる]')
	button.flex = 'TRL'
	button.center = (view.width * 0.5, view.height * 0.5)
	button.action = button_tapped

	view.add_subview(imageView)
	view.add_subview(button)
	view.present(style='full_screen', hide_title_bar=True, orientations=('portrait',))


def main():
	# 松屋モバイルクーポンを表示します。
	url = get_matsuya_qrcode_url_mobilecoupon()
	# LINEクーポンを表示したい場合は次の行をコメントアウト
#	url = get_matsuya_qrcode_url_linecoupon()

	qr_image = get_matsuya_qrcode_image(url)
	show_view(qr_image)



main()
```

### 実行画面
<img width="375" alt="写真 2016-12-14 20 45 52.png" src="https://qiita-image-store.s3.amazonaws.com/0/38266/21dec32e-1805-62c6-a3da-2086c6deb15d.png">



## ホームスクリーンにショートカットを設置

前述のスクリプトをワンタップで起動するために、iPhoneのホームスクリーンにリンクを設置します。

1. Pythonistaでスクリプトを開き、右上のレンチアイコンから"Home Screen"を選択します。
<img width="375" alt="写真 2016-12-14 20 19 06.png" src="https://qiita-image-store.s3.amazonaws.com/0/38266/9b642f54-c557-c36d-df5e-dbb713f5cd7f.png">

2. 設定画面が表示されるので、"Run Script"にチェックを入れて各種設定[^4]を行います。
<img width="375" alt="写真 2016-12-14 20 20 19.png" src="https://qiita-image-store.s3.amazonaws.com/0/38266/bf27bd77-27ab-0eb1-d152-ff63ad3e89a7.png">

3. Continueをタップし、画面の指示に従い設定すれば、ホームスクリーンに松屋アイコンが設置されます。
<img width="375" alt="写真 2016-12-14 20 24 56.png" src="https://qiita-image-store.s3.amazonaws.com/0/38266/0a074b29-baac-22fd-d3c2-97cd9b6455a4.png">


[^4]: 松屋カラーはIcon Color: <font color="014099">014099</font>, Background Color: <font color="FCC929">FCC929</font>です。


# おわりに

いかがでしょうか。雑なスクリプトですが、これくらいの用途のものを自分で簡単に作れるPythonistaはヤバいと思います。
それでは皆様も良い松屋ライフを！