Clubhouse API written in Python. Standalone client included. For reference and education purposes only.

Overview

Clubhouse API written in Python

FOR REFERENCE AND EDUCATION PURPOSES ONLY. THIS DOES NOT COME WITH ANY KINDS OF WARRANTY.

clubhouse-py is originally developed for the sake of interoperability.

Standalone client is also created with very basic features, including but not limited to the audio-chat.

Please note that you may get a permanent ban for sending invalid API requests. Server's ratelimit and security mechanisms are quite strict.

Demo

Please click the image to open a Youtube video demo.

IMAGE ALT TEXT HERE

Requirements

  • Windows or OSX
  • Python 3.7 or higher

Installation

  1. You need to install dependencies first.
$ pip3 install -r requirements.txt
  1. You need to install Agora SDK for voice communication. Refer to Agora-Python-SDK#installation.

Usage

  • For calling APIs from other script
from clubhouse import Clubhouse

...

if __name__ == "__main__":
    clubhouse = Clubhouse()
  • For running a standalone client
$ python3 cli.py

Supported features

Pre-authentication

  • def start_phone_number_auth(self, phone_number):
  • def call_phone_number_auth(self, phone_number):
  • def resend_phone_number_auth(self, phone_number):
  • def complete_phone_number_auth(self, phone_number, verification_code):
  • def check_for_update(self, is_testflight=False):

Post-authentication

  • def get_release_notes(self):
  • def check_waitlist_status(self):
  • def add_email(self, email):
  • def update_photo(self, photo_filename):
  • def follow(self, user_id, user_ids=None, source=4, source_topic_id=None):
  • def unfollow(self, user_id):
  • def block(self, user_id):
  • def unblock(self, user_id):
  • def follow_multiple(self, user_ids, user_id=None, source=7, source_topic_id=None):
  • def follow_club(self, club_id, source_topic_id=None):
  • def unfollow_club(self, club_id, source_topic_id=None):
  • def update_follow_notifications(self, user_id, notification_type=2):
  • def get_suggested_follows_similar(self, user_id):
  • def get_suggested_follows_friends_only(self, club_id=None, upload_contacts=True, contacts=()):
  • def get_suggested_follows_all(self, in_onboarding=True, page_size=50, page=1):
  • def ignore_suggested_follow(self, user_id):
  • def get_event(self, event_id, user_ids=None, club_id=None, is_member_only=False, event_hashid=None, description=None, time_start_epoch=None, name=None):
  • def create_event(self, name, time_start_epoch, description, event_id=None, user_ids=(), club_id=None, is_member_only=False, event_hashid=None):
  • def edit_event(self, name, time_start_epoch, description, event_id=None, user_ids=(), club_id=None, is_member_only=False, event_hashid=None):
  • def delete_event(self, event_id, user_ids=None, club_id=None, is_member_only=False, event_hashid=None, description=None, time_start_epoch=None, name=None):
  • def get_events(self, is_filtered=True, page_size=25, page=1):
  • def get_club(self, club_id, source_topic_id=None):
  • def get_club_members(self, club_id, return_followers=False, return_members=True, page_size=50, page=1):
  • def get_settings(self):
  • def get_welcome_channel(self):
  • def hide_channel(self, channel, hide=True):
  • def join_channel(self, channel, attribution_source="feed"):
  • def leave_channel(self, channel):
  • def make_channel_public(self, channel, channel_id=None):
  • def make_channel_social(self, channel, channel_id=None):
  • def end_channel(self, channel, channel_id=None):
  • def make_moderator(self, channel, user_id):
  • def block_from_channel(self, channel, user_id):
  • def get_profile(self, user_id):
  • def me(self, return_blocked_ids=False, timezone_identifier="Asia/Tokyo", return_following_ids=False):
  • def get_following(self, user_id, page_size=50, page=1):
  • def get_followers(self, user_id, page_size=50, page=1):
  • def get_mutual_follows(self, user_id, page_size=50, page=1):
  • def get_all_topics(self):
  • def get_channels(self):
  • def get_channel(self, channel, channel_id=None):
  • def active_ping(self, channel):
  • def audience_reply(self, channel, raise_hands=True, unraise_hands=False):
  • def change_handraise_settings(self, channel, is_enabled=True, handraise_permission=1):
  • def update_skintone(self, skintone=1):
  • def get_notifications(self, page_size=20, page=1):
  • def get_actionable_notifications(self):
  • def get_online_friends(self):
  • def accept_speaker_invite(self, channel, user_id):
  • def reject_speaker_invite(self, channel, user_id):
  • def invite_speaker(self, channel, user_id):
  • def uninvite_speaker(self, channel, user_id):
  • def mute_speaker(self, channel, user_id):
  • def get_suggested_speakers(self, channel):
  • def create_channel(self, topic="", user_ids=(), is_private=False, is_social_mode=False):
  • def get_create_channel_targets(self):
  • def get_suggested_invites(self, club_id=None, upload_contacts=True, contacts=()):
  • def get_suggested_club_invites(self, upload_contacts=True, contacts=()):
  • def invite_to_app(self, name, phone_number, message=None):
  • def invite_from_waitlist(self, user_id):
  • def search_users(self, query, followers_only=False, following_only=False, cofollows_only=False):
  • def search_clubs(self, query, followers_only=False, following_only=False, cofollows_only=False):
  • def get_topic(self, topic_id):
  • def get_clubs_for_topic(self, topic_id, page_size=25, page=1):
  • def get_clubs(self, is_startable_only):
  • def get_users_for_topic(self, topic_id, page_size=25, page=1):
  • def invite_to_existing_channel(self, channel, user_id):
  • def update_username(self, username):
  • def update_name(self, name):
  • def update_twitter_username(self, username, twitter_token, twitter_secret):
  • def update_instagram_username(self, code):
  • def update_displayname(self, name):
  • def refresh_token(self, refresh_token):
  • def update_bio(self, bio):
  • def record_action_trails(self, action_trails=()):
  • def add_user_topic(self, club_id, topic_id):
  • def remove_user_topic(self, club_id, topic_id):
  • def report_incident(self, user_id, channel, incident_type, incident_description, email):
  • def reject_welcome_channel(self):
  • def update_channel_flags(self, channel, visibility, flag_title, unflag_title):
  • def ignore_actionable_notification(self, actionable_notification_id):
  • def invite_to_new_channel(self, user_id, channel):
  • def accept_new_channel_invite(self, channel_invite_id):
  • def reject_new_channel_invite(self, channel_invite_id):
  • def cancel_new_channel_invite(self, channel_invite_id):
  • def add_club_admin(self, club_id, user_id):
  • def remove_club_admin(self, club_id, user_id):
  • def remove_club_member(self, club_id, user_id):
  • def accept_club_member_invite(self, club_id, source_topic_id=None):
  • def add_club_member(self, club_id, user_id, name, phone_number, message, reason):
  • def get_club_nominations(self, club_id, source_topic_id):
  • def approve_club_nomination(self, club_id, source_topic_id, invite_nomination_id):
  • def reject_club_nomination(self, club_id, source_topic_id, invite_nomination_id):
  • def add_club_topic(self, club_id, topic_id):
  • def remove_club_topic(self, club_id, topic_id):
  • def get_events_to_start(self):
  • def update_is_follow_allowed(self, club_id, is_follow_allowed=True):
  • def update_is_membership_private(self, club_id, is_membership_private):
  • def update_is_community(self, club_id, is_community):
  • def update_club_description(self, club_id, description):

Unsupported features

Endpoints

  • def update_club_rules(self):
  • def update_club_topics(self):
  • def get_events_for_user(self):

PubNub

PubNub is used for the notification while being in a conversation. This has not been implemented yet. However, you may utilize the PubSub keys provided in the sourcecode to implement this.

Reference

You may also add more endpoints and features based on the following repositories.

Please note that these repositories were partially referenced to create this project.

Most of things were tested and handcrafted from scratch.

Comments
  • The room not available

    The room not available

    Hey! I try to connect to room with channel name from the link, but get that message: {'success': False, 'error_message': 'That room is no longer available 👋🏼\nTry starting a new one instead?'} And my friends with iOS can get access to that room. I don't understand why it happened.

    question 
    opened by myxomor 5
  • Can't enter the room

    Can't enter the room

    Hi, thanks for the work. After I launched the client and authorized by sms code and tried to enter a particular room the following error occurred:

    zsh: killed     python3 cli.py
    

    I think it has to do with permissions. Can you help?

    duplicate 
    opened by ttoktassynov 2
  • req.json() is a weak point

    req.json() is a weak point

    I really don't like the part with

    req = requests.post(smth)
    return req.json()
    

    It can cause so many problems, server can return 50* and it will break .json() method, server can theoretically return "bad" json and so on.

    What do you think about idea to at least start validating response headers, or (better!) check if server response is a correct JSON. I can make a PR if you approve the idea.

    enhancement 
    opened by yegorov-p 2
  • Is it possible to get ban by sending requests to same endpoint repeatedly in range of 5-7 seconds?

    Is it possible to get ban by sending requests to same endpoint repeatedly in range of 5-7 seconds?

    Thank you for your work!

    I want to make a auto-updating subscriber counter in my bio, like "now i have N subscribers". As README says:

    Please note that you may get a permanent ban for sending invalid API requests. Server's ratelimit and security mechanisms are quite strict.

    I just want to know it it's safe to do this. Have you ever been banned? If so, how often were the requests sent? I want to update my bio every 5-10 seconds. Is it safe?

    question 
    opened by samohovets 2
  • How can i invite someone?

    How can i invite someone?

    I saw some functions with invite and comment: " Invite users to app. but this only works when you have a leftover invitation.". So what I need to do?

    question 
    opened by richard-undex 1
  • Signup error - Method

    Signup error - Method "GET" not allowed

    python3 cli.py

    1 )In docker with different version of python (3.6, 3.7, 3.8, 3.9). I don't understand why it's happening - because it's requests.post request :

    Please enter your phone number. (+818043217654) > +79099028132
    {'detail': 'Method "GET" not allowed.'}
    [-] Error occured during authentication. (None)
    
    1. On OSX 11, using python3.9 I'm getting HTTPSConnectionPool(host='www.clubhouseapi.com', port=443): Max retries exceeded with url: /api/start_phone_number_auth (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))

    2. On OSX using app for requests, like - Insomnia - all working fine.

    Anyone have thoughts why it may happen with python? I tried installing requests[security] - but it's didn't helped either

    bug invalid 
    opened by 0x366 1
  • Profile pic upload

    Profile pic upload

    Is there currently a way to upload and update a profile pic? If so - do we need to upload it to a certain S3 bucket, or which API requests are available for this? If it's not yet implemented - are you planning on doing so?

    question 
    opened by mnb3000 1
  • /get_event example?

    /get_event example?

    Hello!

    Can anyone explain how /get_event method works? Let's say I have a link to event: https://www.joinclubhouse.com/event/abcdef I am trying to get link to the room from that event (yes, the event has already started and room exists). I thought that abcdef is an event_id, but calling .get_event(event_id='abcdef') returns 500 error from server.

    question 
    opened by yegorov-p 1
  • Is there any option to sign-up using invite code?

    Is there any option to sign-up using invite code?

     python3 cli.py
    [.] Please enter your phone number. (+818043217654) > +12345678900
    [.] Please enter the SMS verification code (1234, 0000, ...) > 0000
    [.] Writing configuration file complete.
    [!] You're still on the waitlist. Find your friends to get yourself in.
    Traceback (most recent call last):
      File "/Users/tandav/Desktop/clubhouse-py/cli.py", line 326, in <module>
        main()
      File "/Users/tandav/Desktop/clubhouse-py/cli.py", line 323, in main
        main()
      File "/Users/tandav/Desktop/clubhouse-py/cli.py", line 319, in main
        chat_main(client)
      File "/Users/tandav/Desktop/clubhouse-py/cli.py", line 150, in chat_main
        print_channel_list(client, max_limit)
      File "/Users/tandav/Desktop/clubhouse-py/cli.py", line 83, in print_channel_list
        channels = client.get_channels()['channels']
    KeyError: 'channels'```
    question 
    opened by tandav 1
  • Headers conflict

    Headers conflict

    • [x] Extract headers per instance

      • This code can help to use multi account from this class as multi instance.
      • Before this only one account can be used because the dictionary(HEADERS) as an attribute of class has the same value for all instances.
      • Therefore, the auth specific to each instance cannot be stored separately.
    • [x] Add custom header

      • Custom header as class parameter can be used when user saved Headers.
    opened by mahdizojaji 0
Releases(v434.0.1)
  • v434.0.1(Jun 28, 2021)

    • Fixed the dict copy bug to support multi account authentications
    • Added additional comments, typo fixes

    Also available at pypi: https://pypi.org/project/clubhouse-py/434.0.1/

    Source code(tar.gz)
    Source code(zip)
  • v434(Jun 23, 2021)

  • 304.0.1(Feb 21, 2021)

  • v304(Feb 16, 2021)

    Built by using PyInstaller. Works on my system.

    All dependencies are included so you do not need to install extra files.

    Clubhouse CLI is currently tested on both Windows and OSX. However, it may not be stable enough to use as a standard client.

    There are some known bugs here and there, but I might plan to fix these issues sometime in the future,

    FOR REFERENCE AND EDUCATION PURPOSES ONLY. THIS DOES NOT COME WITH ANY KINDS OF WARRANTY.

    Installation Notes for OSX

    WARNING: This is purely experimental and tested only on my system. It may not work on your system. Don't blame me for it.

    Installation

    1. Download clubhouse-v304-x86_64-darwin

    2. Run terminal and give exec permission chmod +x ./clubhouse-v304-x86_64-darwin

    3. Run the application. ./clubhouse-v304-x86_64-darwin

    Notes

    1. Hotkey will not work in OSX due to security restrictions. You need to run the application. with sudo ./clubhouse-v304-x86_64-darwin
    Source code(tar.gz)
    Source code(zip)
    clubhouse-v304-x86_64-darwin(15.26 MB)
    clubhouse-v304.exe(23.11 MB)
Owner
security engineer. but don't trust my code. always writing broken codes with a bad quality
A Python implementation of a discord bot that acts as a server scanner similar to Copenheimer.

Bad Copenheimer A Python impelentation of a discord bot that acts as a server scanner. This is a discord bot that will scan ip adresses to see if they

pilot1782 69 Dec 16, 2022
Defi PancakeSwap bot is programmed in Python to buy and sell tokens in seconds once the target is hit.

Defi PancakeSwap BOT A BOT that will make easy your life in Trading. Watch tutorial on Youtube Table of Contents About The Project Built With Getting

Zain Ullah 208 Jan 05, 2023
ro.py is a modern, asynchronous Python 3 wrapper for the Roblox API.

GitHub | Discord | PyPI | Documentation | Examples | License Overview Welcome to ro.py! ro.py is an asynchronous, object-oriented wrapper for the Robl

ro.py 81 Dec 26, 2022
This script will detect changes in your session using Discords built in Gateway.

Detect Session Gateway This script will detect changes in your session using Discords built in Gateway. What does this log? Discord build version Oper

Omega 5 Dec 18, 2021
A Telegram Repo For Devs To Controll The Bots Under Maintenance.This Bot Is For Developers, If Your Bot Is Down, Use This Repo To Give Your Dear Subscribers Some Support By Providing Them Response.

Maintenance Bot A Telegram Repo For Devs To Controll The Bots Under Maintenance About This Bot This Bot Is For Developers, If Your Bot Is Down, Use Th

Vɪᴠᴇᴋ 47 Dec 29, 2022
A python library built on the API of the coderHub.sa, which helps you to fetch the challenges and more

coderHub A python library built on the API of the coderHub.sa, which helps you to fetch the challenges and more Installation • Features • Usage • Lice

TheAwiteb 5 Nov 04, 2022
Migration Manager (MM) is a very small utility that can list source servers in a target account and apply mass launch template modifications.

Migration Manager Migration Manager (MM) is a very small utility that can list source servers in a target account and apply mass launch template modif

Cody 2 Nov 04, 2021
Elkeid HUB - A rule/event processing engine maintained by the Elkeid Team that supports streaming/offline data processing

Elkeid HUB - A rule/event processing engine maintained by the Elkeid Team that supports streaming/offline data processing

Bytedance Inc. 61 Dec 29, 2022
⚡TIKTOK BOT - FAST OPTIMIZED ZEFOY SCRIPT

⚡ ZEFOY [ TikTok Zefoy Bot ] Get the script in: discord.gg/onlp !! Official shop: onlp.sellix.io Newest version v.9.0.0 Requirements pip install p

Tekky 186 Dec 31, 2022
The Python version of the official Discord bot for the Astura Studios Discord community server.

About Astura (Python version) is the official Discord bot for the Astura Studios Discord community server developed and maintained by Ascendus and the

Ascendus 1 Apr 21, 2022
An API that uses NLP and AI to let you predict possible diseases and symptoms based on a prompt of what you're feeling.

Disease detection API for MediSearch An API that uses NLP and AI to let you predict possible diseases and symptoms based on a prompt of what you're fe

Sebastian Ponce 1 Jan 15, 2022
Python script to replace BTC adresses in the clipboard with similar looking ones, whose private key can be retrieved by a netcat listener or similar.

BTCStealer Python script to replace BTC adresses in the clipboard with similar looking ones, whose private key can be retrieved by a netcat listener o

Some Person 6 Jun 07, 2022
AminoAutoRegFxck/AutoReg For AminoApps.com

AminoAutoRegFxck AminoAutoRegFxck/AutoReg For AminoApps.com Termux apt update -y apt upgrade -y pkg install python git clone https://github.com/deluvs

3 Jan 18, 2022
A Telegram bot to index Chinese and Japanese group contents, works with @lilydjwg/luoxu.

luoxu-bot luoxu-bot 是类似于 luoxu-web 的 CJK 友好的 Telegram Bot,依赖于 luoxu 所创建的后端。 测试环境 Python 3.7.9 pip 21.1.2 开发中使用到的 Telethon 需要 Python 3+ 配置 前往 luoxu 根据相

TigerBeanst 10 Nov 18, 2022
An advanced telegram language translator bot

Made with Python3 (C) @FayasNoushad Copyright permission under MIT License License - https://github.com/FayasNoushad/Translator-Bot-V3/blob/main/LICE

Fayas Noushad 19 Dec 24, 2022
Fully Automated Omegle Chatbot

omegle-bot tutorial features fast runs in background can run multiple instances at once Requirement Run this command in cmd, terminal or PowerShell (i

6 Aug 07, 2021
Nowadays we don't have time to listen to each and every song that we come across in a playlist.

Nowadays we don't have time to listen to each and every song that we come across in a playlist. so, this project helps you. we used Spotify API for collecting the dataset information and able to do E

3 Apr 26, 2022
Deezer client for python

Deezer Python Client A friendly Python wrapper around the Deezer API. Installation The package is published on PyPI and can be installed by running: p

Bruno Alla 103 Dec 19, 2022
Telegram bot implementing Lex Arcana using python-telegram-bot library.

Lex Arcana Telegram Bot 🤖 Telegram bot implementing Lex Arcana using python-telegram-bot library. This bot was evaluated for the course "Computer Eng

Nicolò Sonnino 6 Jun 22, 2022
Simple Telegram bot to confess to your crush this Valentine's Day

Simple Telegram bot to confess to your crush this Valentine's Day! Steps pip install python-telegram-bot Register a Telegram bot & get the token by fo

3 Mar 18, 2022