Posted at

Pythonistaでホーム画面にショートカットを作るスクリプトをpython3で動作するようにしました。

More than 1 year has passed since last update.

Pythonista3にはスクリプトをホーム画面にアイコンとして登録することができますが、僕の環境ではiOS11にしてからできなくなってしまいました。

例えばSafariからPythonista3を起動してsample.pyを実行したければブックマークを編集してpythonista://sample.py?action=runと書き換えれば可能です。

URLスキームと言い特定のURLの処理を担当するアプリが決まってるのでSafari[ホーム画面へ追加]を利用してPythinistaのスクリプトのショートカットをホーム画面へアイコン付きで登録する方法があります。

しかしその方法はアイコン画像のURLを用意する必要があるので少し面倒でした。

そこで見つけたのが以下のスクリプトで、Pythonista3の作者であるOle Zornさんが作ってくれたものです。

[ShortcutGenerator.py]

僕はpython3に慣れてるのでpython2のスクリプトだと切り替えの手間がかかるのでpython3で動作してもらえるとありがたいのですが、残念ながら僕の環境ではpython2でしか動作しませんでした。

とりあえずエラーの出る箇所をひとつずつ修正してたらpython3で動作するようになりました。


ShortcutGenerator3.py

# 動作確認 python3.5

# このスクリプトはあなたのホーム画面に "Webclip"ショートカットを追加します。
# このショートカットを使用して、フルスクリーンモードでWebページを開くことができます。
# またはカスタムURL(サードパーティアプリなど)を起動することができます。
# タイトル、URL、アイコン(カメラロールから)を尋ねられます。

import plistlib
from http.server import HTTPServer,BaseHTTPRequestHandler
import webbrowser
import uuid
from io import BytesIO
import Image
import photos
import notification
import console

class ConfigProfileHandler(BaseHTTPRequestHandler):
config = None
def do_GET(s):
s.send_response(200)
s.send_header('Content-Type', 'application/x-apple-aspen-config')
s.end_headers()

plist_string = plistlib.writePlistToBytes(ConfigProfileHandler.config)

s.wfile.write(plist_string)
def log_message(self, format, *args):
pass

def run_server(config):
ConfigProfileHandler.config = config
server_address = ('', 0)

httpd = HTTPServer(server_address, ConfigProfileHandler)

sa = httpd.socket.getsockname()
webbrowser.open('safari-http://localhost:' + str(sa[1]))
httpd.handle_request()
notification.schedule('Tap "Install" to add the shortcut to your homescreen.', 1.0)

def main():
console.alert('ショートカットジェネレータ', 'このスクリプトはあなたのホーム画面に "Webclip"ショートカットを追加します。このショートカットを使用して、フルスクリーンモードでWebページを開くか、カスタムURL(サードパーティアプリなど)を起動できます。タイトル、URL、アイコン(あなたのカメラロールから)を求められます。', '続ける')
label = console.input_alert('ショートカットタイトル', 'ホームスクリーンアイコンの短いタイトルを入力してください.', '', '続ける')
if not label:
return
url = console.input_alert('ショートカットURL','ショートカットを起動する完全なURLを入力してください。', '', '続ける')
if not url:
return
icon = photos.pick_image()
if not icon:
return
console.show_activity('構成プロファイルの準備中...')
data_buffer = BytesIO()
icon.save(data_buffer, 'PNG')
icon_data = data_buffer.getvalue()
unique_id = uuid.uuid4().urn[9:].upper()
config = {'PayloadContent': [{'FullScreen': True,
'Icon': plistlib.Data(icon_data), 'IsRemovable': True,
'Label': label, 'PayloadDescription': 'Configures Web Clip',
'PayloadDisplayName': label,
'PayloadIdentifier': 'com.omz-software.shortcut.' + unique_id,
'PayloadOrganization': 'omz:software',
'PayloadType': 'com.apple.webClip.managed',
'PayloadUUID': unique_id, 'PayloadVersion': 1,
'Precomposed': True, 'URL': url}],
'PayloadDescription': label,
'PayloadDisplayName': label + ' (Shortcut)',
'PayloadIdentifier': 'com.omz-software.shortcut.' + unique_id,
'PayloadOrganization': 'omz:software',
'PayloadRemovalDisallowed': False, 'PayloadType':
'Configuration', 'PayloadUUID': unique_id, 'PayloadVersion': 1}
console.hide_activity()
run_server(config)

if __name__ == '__main__':
main()


でも、こういうのって作者に無断で載っけても良いものなのかわかりませんが、ダメなら削除しますので、わかる方は教えて下さい。