Metadata-Version: 2.1
Name: tochka-cyclops-api
Version: 0.2.3
Summary: Tochka API v2 aka Cyclops API
Home-page: https://github.com/s3rgeym/tochka-cyclops-api
Author: Sergey M
Requires-Python: >=3.11,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Requires-Dist: pyopenssl (>=23.2.0,<24.0.0)
Requires-Dist: requests (>=2.31.0,<3.0.0)
Project-URL: Repository, https://github.com/s3rgeym/tochka-cyclops-api
Description-Content-Type: text/markdown

# Tochka API v2 aka Cyclops API Library for Python

[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/tochka-cyclops-api)]() [![PyPI - Version](https://img.shields.io/pypi/v/tochka-cyclops-api)]() [![PyPI - Downloads](https://img.shields.io/pypi/dm/tochka_cyclops_api)]()

Ставьте звезды, суки бесполезные! Мне от ваших 100 установок в первый день НИКАКОЙ ПОЛЬЗЫ

> Unofficial Python Library for Tochka API

Неофициальная библиотека на Python для работы с АПИ Точка Банка (я его предпочитаю называть дрочка банком). [Документация туть](https://api.tochka.com/static/v1/tender-docs/cyclops/main/index.html).

* Работает через JSONRPC.
* Может грузить документы.

Установка:

```bash
pip install tochka-cyclops-api
```

Поддержка asyncio пока не планируется, но за звезду и донат в пару тысяч оперативно добавлю.

В эпоху Docker использовать версии Python, отличные от последних — моветон, поэтому поддержка более старых точно не планируется.

Использование:

```python
from tochka_cyclops_api import ApiTochka, ApiError

api = ApiTochka(
    base_url='<API_URL>',
    sign_system='<SIGN_SYSTEM>',
    sign_thumbprint='<SIGN_THUMBPRINT>',
    pkey_data=open('/path/to/rsaprivkey.pem').read(),
)

# Вызов методов
try:
    """
    Отправит запрос с таким телом:

    {
      "id": "0d6a26ea-84f0-4be2-9999-b46edc9b59b6",
      "jsonrpc": "2.0",
      "method": "identification_payment",
      "params": {
        "payment_id": "cyclops-b9eabfd7-eead-4940-a6b1-4654850664f5",
        "owners":[{
          "virtual_account": "859b645a-ebb8-4f91-8b05-b433c85dc662",
          "amount": 1000
        }]
      }
    }

    * camelCase преобразуется в snake_case: identificationPayment,
      IdentificationPayment и identification_payment равнозначны.
    * Вместо именованных параметров можно передать словарь.
    * Если словарь и именованные параметры передаются вместе, то они мержатся,
      причем именованные параметры перезапишут элементы словаря.

    Результат будет примерно таким:

    {
      "virtual_accounts": [{
        "code": "859b645a-ebb8-4f91-8b05-b433c85dc662",
        "cash": 1000
      }]
    }
    """
    res = api.identificationPayment(payment_id="cyclops-b9eabfd7-eead-4940-a6b1-4654850664f5", owners=[{
        "virtual_account": "859b645a-ebb8-4f91-8b05-b433c85dc662",
        "amount": 1000
    }])

    # Вместо словаря при парсинге объектов используется AttrDict,
    # который позволяет к полям обращаться как к атрибутам, а не только по индексу
    print(rv.virtual_accounts[0])
except ApiError as ex:
    if ex.code == '4411':
        print('Аккаунт не найден')
  ...


# Ну и пример загрузки документа
import datetime, time

rv = api.upload_document(
    'beneficiary',
    open('/path/to/offer.pdf', 'rb'),  # можно передать любой объект, имеющий метод read, например, `requests.get('https://target/path/to/file.pdf')`, но тогда придется указать content_type
    beneficiary_id='...',
    document_type='contract_offer',
    document_date=datetime.datetime.now().strftime("%Y-%m-%d"),
    document_number=f"{int(time.time())}",
)

print(rv.document_id)  # cyclops-231020230621590-98a669e2-859b-44ac-9831-4a964ac7e49b
```

Все мыслимые права защищены _в натуре_ (с) 2023.

