
背景
Lingualeo.comに単語をインポートするには、いくつかのソリューションがあります。
- ブラウザまたは電話用のアプリケーション:
- サイトに言葉を追加します。
これらの方法の欠点は、一度に1つの単語しか入力できないことです。 一度にいくつかの単語を追加する実装が必要です。
APIが必要ですか?
公式のAPIが見つかりませんでした。 しかし! ブラウザーには拡張機能があり、これはサービスの内部APIを見つけるのに最適な方法です。
Google Chromeにアクセスして、サービスWebサイトを踏みます。 ページの下部で、アプリケーションと拡張機能が提供されます。 Chromeを選択します。 ブラウザーは、Extensionsフォルダーに拡張機能をインストールします(フルパスは指定しません。OSによって異なります)。 ディレクトリ内には、名前の形式のハッシュを持ついくつかのフォルダがあります。 最新の日付を選択してください。 内部にはconfig.jsファイルがあります-プロジェクトAPIへのすべてのパスが含まれています。 そのうちの3つだけに興味があります。
- / API /ログイン
- / gettranslates
- /アドワード
何を書くの?
pythonを選択したのは ほとんどのOSにデフォルトでインストールされます。 追加のインストールを必要としないモジュールを使用します。 APIを使用するためのソリューションを実装します。
service.py
import urllib import urllib2 import json from cookielib import CookieJar class Lingualeo: def __init__(self, email, password): self.email = email self.password = password self.cj = CookieJar() def auth(self): url = "http://api.lingualeo.com/api/login" values = { "email": self.email, "password": self.password } return self.get_content(url, values) def add_word(self, word, tword, context): url = "http://api.lingualeo.com/addword" values = { "word": word, "tword": tword, "context": context, } self.get_content(url, values) def get_translates(self, word): url = "http://api.lingualeo.com/gettranslates?word=" + urllib.quote_plus(word) try: result = self.get_content(url, {}) translate = result["translate"][0] return { "is_exist": translate["is_user"], "word": word, "tword": translate["value"].encode("utf-8") } except Exception as e: return e.message def get_content(self, url, values): data = urllib.urlencode(values) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) req = opener.open(url, data) return json.loads(req.read())
元のソリューションはテキストファイルのみでした。 各単語は新しい行にある必要があります。 しかし、コードを書く過程で、Kindleの実装を追加することにしました。 定期的に彼から言葉をとることも必要です。
handler.py
class Word: text = ''; context = ''; def __init__(self, text): self.text = text class Base(object): data = [] def __init__(self, source): self.source = source def get(self): return self.data def read(self): raise NotImplementedError('Not implemented yet') class Kindle(Base): def read(self): conn = sqlite3.connect(self.source) sql = 'select word, usage from words LEFT JOIN LOOKUPS ON words.id = LOOKUPS.word_key where words.lang="en" GROUP BY word ORDER BY word;' for row in conn.execute(sql): if isinstance(row[0], unicode): word = Word(row[0]) if isinstance(row[1], unicode): word.context = row[1] self.data.append(word) conn.close() class Text(Base): def read(self): f = open(self.source) for word in f.readlines(): self.data.append(Word(word)) f.close()
そして、単語のエクスポート/インポートのためのスクリプト自体の実装:
export.py
import handler import config import service import sys email = config.auth.get('email') password = config.auth.get('password') export_type = sys.argv[1] if export_type == 'text': word_handler = handler.Text(config.sources.get('text')) elif export_type == 'kindle': word_handler = handler.Kindle(config.sources.get('kindle')) else: raise Exception('unsupported type') word_handler.read() lingualeo = service.Lingualeo(email, password) lingualeo.auth() for word_dto in word_handler.get(): word = word_dto.text.lower().encode('utf-8') translate = lingualeo.get_translates(word) if translate["is_exist"]: print "Already exists: " + word.strip() else: context = word_dto.context.encode('utf-8') lingualeo.add_word(word, translate["tword"], context) print "Add word: " + word.strip()
起動とインストール
githubからコードをダウンロードします。 config.py.distからconfig.pyファイルを作成します。 ファイルへのパスを単語で書きます。 kindleからsqlite baseへのkindleの場合。
python export.py text # python export.py kindle # kindle
ソースコード
GitHub: lingualeo.export