# PYaKlass
Быстрый асинхронный модуль для работы с ЯКлассом.
**Функции:**
* Обход капчи
* Получение активных работ
* Получение всех работ (На данный момент только первой страницы)
## Примеры
### Получение активных работ
```python
from multiprocessing.managers import SyncManager
from pyaklass import Account
# Иначе: manager.start() и manager.shutdown()
with SyncManager() as manager:
account = Account('login', 'password', manager)
await account.login()
testworks = await account.get_new_testworks() # -> List[dict[str, Any]]
print(testworks)
```
### Работа с несколькими аккаунтами
```python
from pyaklass import Account
from pyaklass.manager import AccountManager
# Здесь не требуется указывать SyncManager, так как AccountManager создает его сам.
# При различных менеджерах есть шанс блокировки вашего IP сервисом!
manager = AccountManager(
Account('login1', 'password1'),
Account('login2', 'password2'),
Account('login3', 'password3'),
)
if not any(await manager.prepare()):
print('Не получилось войти ни в один аккаунт.')
testworks_per_account = await manager.get_new_testworks() # -> List[List[dict]]
print(testworks)
```
### Получение результатов прошедших работ
> **Примечание:**
> Пользователь может получить только свои результаты.
```python
from multiprocessing.managers import SyncManager
from pyaklass import Account
# Иначе: manager.start() и manager.shutdown()
with SyncManager() as manager:
account = Account('login', 'password', manager)
await account.login()
results = await account.get_results(testwork_id=..., result_id=...)
print(results)
```
## TODO
Будет сделано при желании и возможности.
- [ ] Брутфорс тестовых заданий
- [ ] Парсинг результатов, времени прохождения, введенных ответов
- [ ] Парсинг ФИО учителя, задавшего работу
- [ ] Использовать API пагинации вместо парсинга списка работ
- [ ] `https://www.yaklass.ru/ajax/TestWork/GetStudentTestWorksAjax?type=FinishedTestWorks&page=1&from=%2FTestWork`
Raw data
{
"_id": null,
"home_page": "https://codeberg.org/teapon/pyaklass",
"name": "pyaklass",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.10,<4.0",
"maintainer_email": "",
"keywords": "library,module,client,python3,pyaklass,russian,russia,education,parse,parsing",
"author": "Teapon",
"author_email": "teapon@keemail.me",
"download_url": "https://files.pythonhosted.org/packages/dd/cc/70d9ba64393996dfccc32b8fa3cc23802c9245011e8b614f6e663bf9ac1f/pyaklass-1.1.0.tar.gz",
"platform": null,
"description": "# PYaKlass\n\n\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u042f\u041a\u043b\u0430\u0441\u0441\u043e\u043c.\n\n**\u0424\u0443\u043d\u043a\u0446\u0438\u0438:**\n\n* \u041e\u0431\u0445\u043e\u0434 \u043a\u0430\u043f\u0447\u0438\n* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\n* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0440\u0430\u0431\u043e\u0442 (\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b)\n\n## \u041f\u0440\u0438\u043c\u0435\u0440\u044b\n\n### \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\n```python\nfrom multiprocessing.managers import SyncManager\n\nfrom pyaklass import Account\n\n# \u0418\u043d\u0430\u0447\u0435: manager.start() \u0438 manager.shutdown()\nwith SyncManager() as manager:\n account = Account('login', 'password', manager)\n await account.login()\n\n testworks = await account.get_new_testworks() # -> List[dict[str, Any]]\n print(testworks)\n```\n\n### \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430\u043c\u0438\n```python\nfrom pyaklass import Account\nfrom pyaklass.manager import AccountManager\n\n# \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c SyncManager, \u0442\u0430\u043a \u043a\u0430\u043a AccountManager \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u0430\u043c.\n# \u041f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u0445 \u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0430\u0448\u0435\u0433\u043e IP \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c!\nmanager = AccountManager(\n Account('login1', 'password1'),\n Account('login2', 'password2'),\n Account('login3', 'password3'),\n)\nif not any(await manager.prepare()):\n print('\u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0439\u0442\u0438 \u043d\u0438 \u0432 \u043e\u0434\u0438\u043d \u0430\u043a\u043a\u0430\u0443\u043d\u0442.')\n\ntestworks_per_account = await manager.get_new_testworks() # -> List[List[dict]]\nprint(testworks)\n```\n\n### \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\n\n> **\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:**\n> \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.\n\n```python\nfrom multiprocessing.managers import SyncManager\n\nfrom pyaklass import Account\n\n# \u0418\u043d\u0430\u0447\u0435: manager.start() \u0438 manager.shutdown()\nwith SyncManager() as manager:\n account = Account('login', 'password', manager)\n await account.login()\n\n results = await account.get_results(testwork_id=..., result_id=...)\n print(results)\n```\n\n## TODO\n\n\u0411\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438.\n\n- [ ] \u0411\u0440\u0443\u0442\u0444\u043e\u0440\u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439\n- [ ] \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\n- [ ] \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0424\u0418\u041e \u0443\u0447\u0438\u0442\u0435\u043b\u044f, \u0437\u0430\u0434\u0430\u0432\u0448\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0443\n- [ ] \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c API \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\n - [ ] `https://www.yaklass.ru/ajax/TestWork/GetStudentTestWorksAjax?type=FinishedTestWorks&page=1&from=%2FTestWork`\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Module for communicating with a russian education website - YaKlass.",
"version": "1.1.0",
"project_urls": {
"Homepage": "https://codeberg.org/teapon/pyaklass",
"Repository": "https://codeberg.org/teapon/pyaklass"
},
"split_keywords": [
"library",
"module",
"client",
"python3",
"pyaklass",
"russian",
"russia",
"education",
"parse",
"parsing"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "71b6737310eff2e89a1bc734ce702143bc4a21562deef46f90acb135b778a5cc",
"md5": "08b212c6761c6b8e62e0c08643b0643e",
"sha256": "a63170f4efc6640e5ca2f5f29a4e734b04f7e45b5c3fdf226897cdd5a0b1dc65"
},
"downloads": -1,
"filename": "pyaklass-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "08b212c6761c6b8e62e0c08643b0643e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10,<4.0",
"size": 15213,
"upload_time": "2023-05-16T18:51:44",
"upload_time_iso_8601": "2023-05-16T18:51:44.211661Z",
"url": "https://files.pythonhosted.org/packages/71/b6/737310eff2e89a1bc734ce702143bc4a21562deef46f90acb135b778a5cc/pyaklass-1.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ddcc70d9ba64393996dfccc32b8fa3cc23802c9245011e8b614f6e663bf9ac1f",
"md5": "e36d3f1e3ca1a634bf296c37ba25b7db",
"sha256": "b392386864bd1557f48649b1734b63a28a9f8c4e63cfa4e321178ab9213edf57"
},
"downloads": -1,
"filename": "pyaklass-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "e36d3f1e3ca1a634bf296c37ba25b7db",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10,<4.0",
"size": 11351,
"upload_time": "2023-05-16T18:51:46",
"upload_time_iso_8601": "2023-05-16T18:51:46.778719Z",
"url": "https://files.pythonhosted.org/packages/dd/cc/70d9ba64393996dfccc32b8fa3cc23802c9245011e8b614f6e663bf9ac1f/pyaklass-1.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-16 18:51:46",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": true,
"codeberg_user": "teapon",
"codeberg_project": "pyaklass",
"lcname": "pyaklass"
}