Metadata-Version: 2.1
Name: askfm-api
Version: 0.1.2
Summary: Unofficial API wrapper for https://ask.fm
License: MIT
Author-email: snowwm <snowwontmelt@gmail.com>
Requires-Python: >=3.9
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Requires-Dist: requests~=2.25
Project-URL: homepage, https://github.com/AskfmForHumans/askfm-api
Description-Content-Type: text/markdown

# askfm-api

[![PyPI version](https://img.shields.io/pypi/v/askfm-api.svg)](https://pypi.org/project/askfm-api)
[![PyPI status](https://img.shields.io/pypi/status/askfm-api.svg)](https://pypi.org/project/askfm-api)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Project manager: pdm](https://img.shields.io/badge/project%20manager-pdm-blue.svg)](https://github.com/frostming/pdm)

This aims to be a powerful Python wrapper around the undocumented ASKfm API for its mobile apps.

Currently based on reverse-engineering ASKfm Android app v4.67.1, which uses ASKfm API version 1.18.
The core logic is quite complete, but only a small subset of API methods have helpers in the `askfm_api.requests` module so far.

## Usage

The code should be self-explanatory so I won't go into great detail here. Quick example:

```python
from askfm_api import AskfmApi, AskfmApiError
from askfm_api import requests as r

try:
    api = AskfmApi("<secret key>", device_id="D2A6C471C4B4DA5C")
    me = api.login("username", "password")
    print(me)
    # {'uid': 'jgrdlgrd', 'fullName': 'Снег не растает', 'location': 'my empire of dirt', ...}

    qs = api.request_iter(r.fetch_questions())
    print(next(qs))
    # {'type': 'daily', 'body': 'Hi?', 'answer': None, 'author': None, 'qid': 153352, ...}

    res = api.request(
        r.post_answer(question_type="daily", question_id=153352, text="Hi there!")
    )
    print(res)
    # {'question': {...}, 'answer': {...}}
except AskfmApiError as e:
    print(e)
    # error code returned by the API, e. g. 'session_expired'
```

### Signing key

All requests are signed using a secret key (unique per app version) that is stored inside the official app in an obfuscated manner.
I don't find it ethical to publish it, so if you want to use this library, your options are:
- extract the key by yourself
- contact [me](https://github.com/snowwm), explain your use case and ask for the key

## Todo

- feat: Add more methods
- feat: Refresh expired tokens
- feat: Group errors into categories
- tests: Add tests

## Related work / See also

- a similar library (currently outdated): https://github.com/Hexalyse/pyAskFm  
- blog post with a more in-depth explanation of reverse-engineering ASKfm API: https://hexaly.se/2017/06/14/how-i-reverse-engineered-the-ask-fm-api-part-1/

## Contributing

Any activity is welcome, but I would be especially grateful if someone wrote tests for this code.

