{"id":25602823,"url":"https://github.com/niewiemczego/feeld","last_synced_at":"2025-11-11T07:31:54.579Z","repository":{"id":278095691,"uuid":"934488142","full_name":"niewiemczego/Feeld","owner":"niewiemczego","description":"Unofficial Python3 API connector for Feeld's HTTP and WebSockets APIs.","archived":false,"fork":false,"pushed_at":"2025-02-18T00:30:10.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-18T01:26:10.999Z","etag":null,"topics":["api","dating-app","dating-app-feeld","feeld","feeld-api","feeld-client","python","python3","websocket"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/niewiemczego.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-17T23:18:47.000Z","updated_at":"2025-02-18T00:30:13.000Z","dependencies_parsed_at":"2025-02-18T01:26:12.466Z","dependency_job_id":"8dd9eb15-8d4a-4f0c-b145-1fadb3f0c117","html_url":"https://github.com/niewiemczego/Feeld","commit_stats":null,"previous_names":["niewiemczego/feeld"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niewiemczego%2FFeeld","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niewiemczego%2FFeeld/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niewiemczego%2FFeeld/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/niewiemczego%2FFeeld/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/niewiemczego","download_url":"https://codeload.github.com/niewiemczego/Feeld/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240056102,"owners_count":19741076,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","dating-app","dating-app-feeld","feeld","feeld-api","feeld-client","python","python3","websocket"],"created_at":"2025-02-21T17:24:11.042Z","updated_at":"2025-11-11T07:31:54.575Z","avatar_url":"https://github.com/niewiemczego.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Feeld\n\nAn unofficial asynchronous API wrapper for interacting with the Feeld dating app. Designed for managing multiple profiles, automating actions and facilitating account operations.\n\n\u003e **Disclaimer:**\n\u003e\n\u003e This project is an independent, community-driven effort and is not affiliated, endorsed, or sponsored by Feeld or Feeld Ltd. The purpose of this wrapper is solely to serve as a portfolio piece demonstrating my skills and abilities. It is **not intended to harm or misrepresent the company or its services.**\n\n---\n\n## 🚀 Getting Started\n\n### Prerequisites\n- **Python 3.11+** (recommended)\n- Virtual environment tool (e.g., `venv` or `pipenv`)\n\n### Installation\n\n```bash\ngit clone https://github.com/niewiemczego/Feeld.git\ncd feeld\npip install -r requirements.txt\n```\n\n## TODO\n\n- [X] HTTP(s) support\n- [X] Proxy Manager\n- [X] Rotating proxy automatically\n- [X] Refreshing access token automatically\n- [X] Chat Manager (Enable sending pre-made videos alongside live recording)\n- [X] Profile Manager\n- [X] Discovery Manager(Swipes/Likes/Matches)\n- [X] Docs/Examples for each manager\n- [ ] Update some endpoints to always return data instead of True/False to allow user-defined handling (?)\n\n\n## Signin / Signup\nDue to security reasons, I will not be open-sourcing the login and registration solution. Both components rely on specific, highly encrypted data that acts as a fingerprint. However, I offer two options: you can purchase this part of the solution (availability is limited), or you can rent access to my API, which will generate the required data/fingerprint for you, allowing for easy integration. For a trial, please check [contact](#contact) section.\n\n## Usage\n\nThe script is divided into three main sections: `profile_manager`, `discovery_manager` and `chat_manager`.\n\n### Initial Setup\n\nBefore using the managers, you need to initialize the `HTTPManager` and set up the profile data:\n\n```python\nimport asyncio\nimport logging\n\nfrom feeld import (\n    ChatManager,\n    DiscoveryManager,\n    HTTPManager,\n    ImageMessage,\n    PopularLocations,\n    ProfileManager,\n    ProfileUpdatePayload,\n    TextMessage,\n    VideoMessage,\n)\n\nlogging.basicConfig(level=logging.DEBUG)\n\nREFRESH_TOKEN = \"YOUR_REFRESH_TOKEN_HERE\"  # Replace with your actual refresh token\n\nhttp_manager = HTTPManager(refresh_token=REFRESH_TOKEN)\n\nasync def initial_profile_setup(http_manager: HTTPManager) -\u003e bool:\n    profile_manager = ProfileManager(http_manager)\n\n    # Get profile data\n    profile_data = await profile_manager.get_profile_data()\n    if profile_data is None:\n        return False\n\n    # Set profile data in HTTPManager\n    set_profile_data = http_manager._set_profile_data(profile_data)\n    if not set_profile_data:\n        return False\n\n    # Update last seen status\n    await profile_manager.update_last_seen_status()\n    return True\n```\n__Important Note:__ `initial_profile_setup` should only be called once at the beginning of your script's execution. It fetches and sets up essential profile data. Calling it repeatedly for the same profile is unnecessary and can lead to inefficiencies. So generally speaking if you are going to use every manager then u should call this function in the main one instead of in each function for each manager as we do in the examples.\n\n\n### Profile Manager\n\nThe `profile_manager` function demonstrates how to interact with the user profile:\n\n```py\nasync def profile_manager() -\u003e None:\n    # Initial profile setup\n    if not await initial_profile_setup(http_manager):\n        return\n\n    profile_manager = ProfileManager(http_manager)\n\n    # Update profile data\n    await profile_manager.update_profile(\n        ProfileUpdatePayload(\n            bio=\"We should get to know each other better, don't you think?\",\n            interests=[\"sports\", \"music\", \"art\", \"travel\", \"golf\", \"food\"],\n        ),\n    )\n\n    # Update profile location\n    await profile_manager.update_profile_location(41.881832, -87.623177)\n    # await profile_manager.update_profile_location(popular_location=PopularLocations.LOS_ANGELES.value)\n```\n\n### Chat Manager\n\nThe `chat_manager` function demonstrates how to manage chats, including sending likes, getting matches, and sending messages:\n\n```py\nasync def chat_manager() -\u003e None:\n    # Initial profile setup\n    if not await initial_profile_setup(http_manager):\n        return\n\n    chat_manager = ChatManager(http_manager)\n    discovery_manager = DiscoveryManager(http_manager)\n\n    connection_id = await chat_manager.get_connection_id()\n    if connection_id is None:\n        return\n\n    # Force match by liking all users who liked you\n    likes = await discovery_manager.get_likes()\n    for like in likes.interactions.nodes:\n        await discovery_manager.send_like(like.id)\n\n    # Alternative: Swipe on users based on interaction status\n    users_to_swipe_on = await discovery_manager.get_users_to_swipe_on([18, 30])\n    for user in users_to_swipe_on.discovery.nodes:\n        if user.interaction_status.theirs.upper() == \"LIKED\":\n            await discovery_manager.send_like(user.id)\n            continue\n\n        if user.interaction_status.theirs.upper() == \"PINGED\":\n            await discovery_manager.accept_ping(user.id)\n            continue\n\n        if user.interaction_status.theirs.upper() == \"DISLIKED\":\n            await discovery_manager.send_dislike(user.id)\n            continue\n\n    # Get matches and their stream channel ID\n    matches = await discovery_manager.get_matches()\n    if not matches:\n        return\n\n    # for this example we are getting only data of the first user from matches, so that's why we are indexing [0]\n    # but in real sceario you will for loop ofc\n    user_chat_id = matches.summaries.nodes[0].id\n    activate_chat = await chat_manager.activate_chat(user_chat_id)\n    if activate_chat is None:\n        return\n\n    user_stream_channel_id = matches.summaries.nodes[0].stream_channel_id\n\n    # Interact with the chat\n    messages_history = await chat_manager.get_messages_history(user_stream_channel_id, connection_id)\n    print(f\"{messages_history=}\")\n\n    await chat_manager.send_video_message(\n        user_stream_channel_id,\n        connection_id,\n        \"test_video.mov\",\n        VideoMessage(\"Hey how r u ?\", \"view_once\"),\n    )\n\n    await chat_manager.send_image_message(\n        user_stream_channel_id,\n        connection_id,\n        \"test_image.png\",\n        user_chat_id,\n        ImageMessage(\"Heeyyy :))\", \"view_once\", 10),\n    )\n\n    await chat_manager.send_text_message(\n        user_stream_channel_id,\n        connection_id,\n        TextMessage(\"Wanna hang out?\"),\n    )\n```\n\n## Contact\nFor questions, suggestions or any feedback regarding the Feeld API Wrapper, please use one of the following methods:\n\n- GitHub: Open an issue in the repository.\n- Telegram: @niewiemczego\n- Discord: niewiemczego\n\n\u003e **Job Opportunities:** I am actively looking for a Python developer position. If you have any relevant opportunities, please reach out to me via the contact methods above.\n\nYour feedback is important and I'm happy to help!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniewiemczego%2Ffeeld","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fniewiemczego%2Ffeeld","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniewiemczego%2Ffeeld/lists"}