iOSでPythonistaを使って短縮URLを解決する

iOSでPythonistaを使って短縮URLを解決する
iOSでPythonistaを使って短縮URLを解決する

サードパーティのアプリやサービスが、記事やウェブページへのリンクを独自の短縮リンクを使って共有するように強制するのは好きではありません。パーソナライズされた短縮ドメインの魅力は理解できます。結局のところ、私たちは @macstoriesnet アカウントで mcstr.net リンクをツイートしています。クリックを追跡するための分析情報を提供でき、文字数を節約でき、少なくとも理論上は「クール」に見えるからです。しかし、私は長い間、mcstr.net リンクを削除するアイデアを検討してきましたが、(私たちのように)自分のコンテンツへのリンクをツイートせず、別のドメインで他の人のリンクを上書きするアプリやサービスの場合は、問題はより深刻(でより迷惑)だと思います。例えば Pocket は、共有メニューから「リンクをコピー」アクションを選択すると、クリーンな元の URL が表示されますが、テキストを下書きに送信すると(私はよくこれを行います)、代わりに pocket.co リンクを返します。私は、この習慣(Pocket や他のサービス)に飽きてきたので、ブラウザを開いて複数のメニューをタップしなくても短縮リンクを簡単に解決できる Python スクリプトに基づくワークフローを作成しました。

5月の脚注で簡単に触れましたが、短縮URLに関する私の問題は、Flipboardの「Flip It」ブックマークレットがpocket.coリンクの背後にあるURLを取得できないことでした。できる限り手間を省くために、PocketからDraftsにリンクを送信する際に「リンクをコピー」をクリックする必要がないようにしたいと考えました。DraftsからFlipboardにリンクを保存するアクションを起動できるのですが、短縮リンクを解決するには、間にスクリプトを挟む必要がありました。私が作成したスクリプトは、URLを受け取り、Webページの実際のURLを取得しようとし、リダイレクトのないURLを返します。このURLをFlipboardに送信すれば、サービスのWebインターフェースがそれを認識し、私の雑誌に追加してくれることが分かります。

このスクリプトは短く、私はiOS版のPythonistaで使用していますが、Keyboard MaestroやAlfredなどのアプリで動作させたい場合は、少し手を加えてOS Xに移植できます。私のワークフローでは、Pocketで記事を読み終えたら「Draftsに送信」をタップし、「URLをクリーンアップ」アクションをタップします。すると数秒でDraftsからPythonistaへ、そしてGoogle ChromeのFlipboardの共有ページへ移動し、最後にPocketに戻って、読んだ記事をアーカイブして共有できます。

以下にスクリプトと簡単なデモ ビデオを示します。

import re
import string
import console
import urllib
import sys
import clipboard
import webbrowser
 console.clear()

# Count arguments passed to script, if less than 2 run regex against clipboard
numArgs = len(sys.argv)
 if numArgs == 2:
	redirect = sys.argv[1]
elif numArgs < 2:
	redirect = clipboard.get()
 # Provided by Peter Hansen on StackOverflow:
# http://stackoverflow.com/questions/1986059/grubers-url-regular-expression-in-python/1986151#1986151
pat = r'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^%s\s]|/)))'
pat = pat % re.escape(string.punctuation)
 
match = re.findall(pat, redirect)
 if match:
	for x in match:
 console.show_activity()
 # Get the first match without redirects
 cleaned = urllib.urlopen(x[0]).geturl()
 final = urllib.quote(cleaned, safe='')
 clipboard.set(cleaned)
 console.hide_activity()
 webbrowser.open('googlechrome-x-callback://x-callback-url/open/?url=https%3A%2F%2Fshare.flipboard.com%2Fflipit%2Fload%3Fv%3D1.0%26url%3D' + final + '&x-success=pocket://&x-source=Pocket')
elif not match:
	console.alert('No match found')

このスクリプトは基本的に、リンクのすべてのリダイレクトをたどり、ページの実際のURLを返すgeturl()メソッドを利用していますurllib.urlopen()。Pythonのドキュメントには次のように書かれています。

geturl() メソッドは、ページの実際の URL を返します。HTTP サーバーがクライアントを別の URL にリダイレクトする場合があります。urlopen() 関数はこれを透過的に処理しますが、呼び出し元はクライアントがどの URL にリダイレクトされたかを知る必要がある場合もあります。geturl() メソッドは、このリダイレクトされた URL を取得するために使用できます。

12行目は、スクリプトに渡された引数を数えています。引数が2つ未満の場合、スクリプトはクリップボードにリンクがある可能性があると想定しますsys.argv[1]。引数が2つ見つかった場合、取得するURLとして識別されます。これは、DraftsからPythonistaにテキストを送信できるようにしたいためです。また、以前のレビューで詳しく説明したように、PythonistaのURLスキームは引数をサポートしているため、スクリプトで必要なチェックを簡単に設定できます。

このスクリプトは Launch Center Pro や iCab などのアプリから起動できますが、私の Drafts アクションは次のようになります。

pythonista://CleanURL?action=run&argv=[[draft]]

21~22行目では、Peter Hansen氏による正規表現(Gruber氏のPython正規表現に関する質問への返信として投稿されたもの)を使用しています。これは受信したテキストをスキャンして一致するものを検索します。一致するものは、ご想像のとおり、Web URLです。Pocketは記事のタイトル短縮リンクの両方を1行でDraftsに送信するため、Draftsの行タグを使ってタイトルとURLを簡単に分離することはできません。そのための最適な方法は、文字列内のURLに一致するものを返す正規表現です。URLの一致には任意の正規表現を使用できますが、Hansen氏の正規表現は私にとって問題なく機能し、そのシンプルさが気に入っています。

25行目は で正規表現を実行しre.findall()、27~37行目は、 でマッチするものがあるかどうかをチェックする if 文の中に、実際のURL取得メカニズムが含まれています。31行目は によって返された最初のマッチを取得しre.findall、その実際のURLを取得し、デフォルトの安全文字を使用せずに を使用してパーセントエンコードしますurllib.quote。そして、33行目で、システムクリップボードに新しく取得したURLが設定されます。

このスクリプトは、Flipboardのウェブインターフェースを全く気にすることなく、このように(URLを取得し、その実体を取得して、クリップボードにセットする)使うことができます。しかし、私はPocketでゲーム関連の記事をよく読んでおり、Flipboardの雑誌も定期的に更新しているので、スクリプトにGoogle Chromeを起動してFlipboardの共有ページを開き、スクリプトが取得したPocket以外のURLを渡す行を追加しました。

スクリプトはモジュールとChromeのコールバックシステムを使用してwebbrowserChromeを起動し、URLが事前に入力されたFlipboardマガジンのポップアップと、URLがFlipboardに追加されるとPocketに戻るためのカスタムの「戻る」ボタンを表示します。Flipboardの共有UIの優れた点は、URLを追加しても別のページに移動しないことです。そのため、Pocketボタンは常に表示されます。

短縮リンクを解決してクリーンなオリジナルバージョンを返すスクリプトがすべての人に必要なわけではないことは承知しています。しかし、スマートフォンで Python スクリプトを実行して毎日数秒を節約できるというのは、やはり素晴らしいことだと思います。その節約分を年間数分にすれば、ブラウザのメニューをタップするよりも有意義で生産的な活動、例えばガールフレンドとビーチで過ごす時間を増やすなど、に使えるようになります。私は Dr. Drang のように、ガソリンスタンドの駐車場から Python プログラムを使って顧客の問題を解決するような冒険家ではないかもしれませんが、ソファに座りながらでも、Pocket リンクを Flipboard にもっと簡単に共有できるように構築したソリューションにとても満足しています。

クラブ・マックストーリーズ

追加コンテンツと特典にアクセスする

Club MacStories は 2015 年に設立され、ほぼ 10 年間にわたって毎週独占コンテンツを提供してきました。

毎週、毎月の電子メール ニュースレターから始まったものが、すべての MacStories ファン向けに設計されたメンバーシップ ファミリーに成長しました。

詳細については、こちらおよびクラブの FAQ をご覧ください。

Club MacStories : アプリ、ヒント、自動化ワークフロー、長​​文執筆、MacStories Unwind ポッドキャストへの早期アクセス、定期的な景品など、盛りだくさんの情報を満載した、電子メールと Web 経由の週刊および月刊ニュースレター。

Club MacStories+ : Club MacStories が提供するすべての機能に加え、アクティブな Discord コミュニティ、クラブの過去のカタログ全体を閲覧するための高度な検索機能とカスタム RSS 機能、ボーナス コラム、多数のアプリ割引などが含まれます。

Club Premier : 上記のすべてに加え、早期に、広告なしで、高ビットレートのオーディオで配信される当社の主力ポッドキャストの拡張バージョンである AppStories+ が含まれます。