LoginSignup
9
13

More than 5 years have passed since last update.

Pythonista3を使ってカメラロールからsearchbyimageをする

Posted at

やりたいこと

iOSのカメラロールに保存された画像からGoogleのSearchByImageを使って結果をSafariで見る.

実現

Pythonista3にはアプリの共有シートから自分で書いたPythonのスクリプトが呼べるという機能があるのでコレを使います.
Pythonista3に関する詳しいことはひとりぶろぐさんのこちら記事(iOS上で動作する革命的ものづくり環境「Pythonista 3」の魅力をとくと語る)でよく紹介されています.
Pythonista3はPython2.7とPython3.5が使えますが,今回はPython3.5の方で書きました.

かいた

searchbyimage.py
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. 画像を選択し,スクリプトを実行.
  2. 受け取ったアタッチメントから1つ目のファイルパスを取得.
  3. それが画像か一応確認して,search_by_image()にかけ,成功すると検索結果のurlが返されます.
  4. 返された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が使えたらいいかなと思います.

9
13
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
9
13