Help us understand the problem. What is going on with this article?

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()

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

maboy
すぐ忘れてしまうのでメモする事にしました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away