やりたいこと
iOSのカメラロールに保存された画像からGoogleのSearchByImageを使って結果をSafariで見る.
実現
Pythonista3にはアプリの共有シートから自分で書いたPythonのスクリプトが呼べるという機能があるのでコレを使います.
Pythonista3に関する詳しいことはひとりぶろぐさんのこちら記事(iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る)でよく紹介されています.
Pythonista3はPython2.7とPython3.5が使えますが,今回はPython3.5の方で書きました.
かいた
import requests, appex, imghdr
from requests_toolbelt.multipart.encoder import MultipartEncoder
from objc_util import *
def search_by_image(fp):
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.98 Safari/537.36 Vivaldi/1.6.689.40'
m = MultipartEncoder(fields={'encoded_image': (fp.name, fp)})
r = requests.post('http://www.google.co.jp/searchbyimage/upload',
data=m,
headers={'Content-Type': m.content_type, 'User-Agent': user_agent})
if r.status_code == 200:
return r.url
else:
return 0
def main():
image = appex.get_attachments()[0]
if imghdr.what(image):
url = search_by_image(open(image, 'rb'))
if url:
UIApplication.sharedApplication()._openURL_(nsurl(url))
if appex.is_running_extension():
main()
だいたいの流れ
- 画像を選択し,スクリプトを実行.
- 受け取ったアタッチメントから1つ目のファイルパスを取得.
- それが画像か一応確認して,
search_by_image()
にかけ,成功すると検索結果のurlが返されます. - 返されたurlをSafariで開き,終了.
画像の受け取り
Pythonista3にはappexという共有シートで受け取ったデータやらなんやらを利用できるモジュールが備わっていて,これでカメラロールの画像ファイルを取得します.
本当なら,appex.get_file_path()
で画像へのパスが手に入るかと思ったのですが,取得できなかったので,
appex.get_attachments()
を使って,1つ目のアタッチメントからパスを抜き出しています.
MultipartEncoder
画像をアップロードするにはmultipart/postとやらを使う必要があり,私にはよくわからない.
どうやら,requests_toolbeltというパッケージに便利なものがあるらしい.
しかし,初期のPythonista3に,requests_toolbeltはない.
そこで活躍するのがStaSh.
これでpipが使えるようになるので,こちらからインストールしました.
なんかよくわからんが,webbrowserが使えない
urlを開くにはwebbrowser.open()
をしますが,どうやら共有からではうまく動かないみたい.
まずfrom objc_util import *
でObjective-Cへのブリッジ機能を使えるようにします.
そして,UIApplication.sharedApplication()._openURL_(nsurl(url))
を呼び出すことで,Safariでurlが開けます.
この辺の仕組みは理解できていないのですが,これを使うことで,共有シートからSafari,またはurl schemeを使えば違ったアプリを開くことも可能です.
おわり
次はTwitterに流れてきた画像からSearchByImageが使えたらいいかなと思います.