Package: litresapi
python-обёртка вокруг API ЛитРес на базе requests и xmltodictОфициальная документация XML APIПримерыПолучить обновления книгfromlitresapiimportLitresApiapi=LitresApi(secret_key='your-secret-key',partner_id='ZZZZ')lazy_books=api.get_fresh_book(start_date=datetime.datetime(2015,7,19,12,5))>>>first_book=next(lazy_books)>>>print(json.dumps(first_book,indent=4,ensure_ascii=False)){"title-info":{"genre":"detective","author":{"first-name":"Евгений","middle-name":"Евгеньевич","last-name":"Сухов","id":"1212f327-2a83-102a-9ae1-2dfe723fe7c7"},...}..."@external_id":"37828892-1a76-11e5-ad6a-002590591dd6","@tag":"updated-book"...}Вместо словарей можно работать с xml напрямую (lxml):api=LitresApi(secret_key='your-secret-key, partner_id='ZZZZ', xml=True)lazy_books=api.get_fresh_book(start_date=datetime.datetime(2015,7,19,12,5))>>>book=next(lazy_books)<Elementupdated-bookat0x1067186c8>>>>book.attrib['external_id']'37828892-1a76-11e5-ad6a-002590591dd6'>>>book.getchildren()[<Elementfilesat0x10a77cd88>,<Elementtitle-infoat0x10a77c488>,...]Можно предавать аргументы для трансформации ответа на базе requests hooks:defsave_xml_to_file(response,*args,**kwargs):withopen('litres_response.xml','wb')asfl:fl.write(response.content)>>api.get_fresh_book(start_date=datetime.datetime(2015,7,19,12,5),hooks={'response':save_xml_to_file})Ограниченияapi.get_fresh_bookнельзя вызывать чаще одного раза в секундувремя на сервере должно быть установлено верно, иначеtimestampзапроса будет отвергнутСкачать книгуresponse=api.get_the_book(external_id='37828892-1a76-11e5-ad6a-002590591dd6')>>>response<Response[200]>>>>response.headers['Content-Disposition']'attachment; filename="Suhov_E._Rassledovaniya._Brosok_Na_Vyistrel.fb2.zip"'>>>len(response.content)452166Скачать обложкуresponse=api.get_cover(file_id='13299029',file_ext='jpg')>>>response<Response[200]>>>>response.headers['Content-Type']'image/jpeg'>>>len(response.content)51405Вместоfile_idможно передать словарь книги из результатов генератораget_fresh_bookbook=next(api.get_fresh_book(start_date=datetime.datetime(2015,7,19,12,5)))>>>api.get_cover(book=book).headers['Content-Type']'image/jpeg'Если обложки у книги нет, функция вернётNonebook=next(api.get_fresh_book(uuid='ead79f60-4471-4952-aa81-5f126fb6da82'))>>>api.get_cover(book=book)NoneЖанрыgenres=api.get_genres()>>>print(json.dumps(genres,indent=4,ensure_ascii=False))[{"@id":"5003","@title":"Бизнес-книги","@type":"root","genre":[{"@id":"5049","@title":"Банковское дело","@token":"bankovskoe_delo","@type":"genre"},{"@id":"5047","@title":"Кадровый менеджмент","@token":"kadrovyj_menedzhment","@type":"container","genre":[{"@id":"5334","@title":"Аттестация персонала","@token":"attestaciya_personala","@type":"genre"},...]Для получения xml:api=LitresApi(xml=True)genres=api.get_genres()>>>genres.xpath("//genre[@token='sport_fitnes']")[0].attrib['title']'Спорт, фитнес'РазработкаЗапустить тестыtox -e py38Публикация релиза в PyPiДля публикации релиза понадобитсяtwine.
Для удобства его можно установить глобально:pip install twineПоднимаем версию пакета:__version__ = '1.1.1'Собираем пакет:python setup.py sdistЗагружаем собранный пакет в PyPi:twine upload dist/litresapi-1.1.1.tar.gzChangelog1.2.1 (2021-06-15)Add exception support for celery1.2.0 (2020-12-21)Add new content types for podcast and podcast episodeDrop Python <3.6 support1.1.3 (2020-04-23)Allow to download books with different partner_id1.1.2 (2020-04-14)Allow to download book covers with formats other than jpg1.1.1 (2020-04-10)Fix request params for /get_the_book/ and cover download requests1.1.0 (2020-04-06)Drop Python <3.5 support1.0.0 (2017-02-25)Enable requests hooks for get_fresh_bookFix genres endpoint urlIntroduce public parse_fresh_book method to decouple fetching from parsingEnforce list for author, genre, sequence to simplify parsingWrap annotation content to CDATA tag to avoid unparsable xmlBetter connection error handing0.1.0 (2015-08-01)First internal release