Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Как импортировать словарь в Lingualeo при помощи Python?

Как импортировать словарь в Lingualeo при помощи Python?

Lingualeo – отличная штука для изучения английского, но сейчас не о нем, а о том, как в него импортировать слова. Для этого есть парочка решений:

  • Приложения для смартфонов или браузера.
  • Добавление слов непосредственно на сайте.

У обеих способов есть недостатки – мы можем вносить слова лишь по одному. Нам же нужно так, чтобы за раз можно было добавить несколько слов.

Надежные и качественные трубы ПВХ

Пластиковые трубы используются для прокладки трубопроводов самого разного назначения. Это целая категория продуктов, пользующаяся большим спросом, чтобы узнать о них подробнее посетите веб-сайт ENEXT.ua. ПВХ трубы обладают массой преимуществ по сравнению с аналогами из стали, поэтому и стали более распространенными, кроме того, при превосходных характеристиках они имеют достаточно низкую стоимость.

А API есть?

Оказалось, что данный сервис не предоставляет официального API. Однако, имеется расширение для браузера, соответственно мы можем поискать внутренний api. Итак, установим расширение для браузера, в нашем случае это будет Chrome. Заходим в папку расширение и находим там файл config.js, там и будут пути к API. Нам нужны из них только 3:

  • /api/login
  • /gettranslates
  • /addword

Писать будем на Python, поскольку установить его можно практически на любую ОС. Возьмем модули, не требующие дополнительной установки. Реализуем решение, чтобы настроить работу с 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 из config.py.dist. Теперь пропишем путь к файлу со словами. Если нужно под Kindle, то к базе sqlite внутри kindle.

python export.py text #Для текстовых файлов
python export.py kindle #Для kindle
Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)