4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?