Skip to content

Commit

Permalink
2024.08.13: Add UA polling with rebase to upstream with squashing all…
Browse files Browse the repository at this point in the history
… commits
  • Loading branch information
shorelskyi authored and shorelskyi committed Aug 13, 2024
1 parent f2f30b8 commit 99ed172
Show file tree
Hide file tree
Showing 15 changed files with 741 additions and 279 deletions.
21 changes: 21 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Used as versioning
TAG=0.3
# Bot mode
CAPTCHABOT_PRIVATE=1
# SECURE SECTION
CAPTCHABOT_TOKEN=none
CAPTCHABOT_OWNER=@none
# Initial BOT Language
CAPTCHABOT_INIT_LANG=UK
# Initial captcha solve time (in minutes)
CAPTCHABOT_INIT_CAPTCHA_TIME_MIN=3
# Auto-remove custom welcome message timeout (in seconds)
CAPTCHABOT_T_DEL_WELCOME_MSG=180
# Maximum number of times a user fail to solve a Poll captcha.
# If a user don't solve the captcha after this, it will be ban
# instead kick
CAPTCHABOT_MAX_FAIL_BAN_POLL=3
# Initial captcha characters mode (ascii, hex, nums, math, poll, button, or NEW ukrainer)
CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE=ukrainer
LOCAL_DATA_PATH=/home/admin/github/TLG_JoinCaptchaBot_UA/data

261 changes: 15 additions & 246 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,260 +1,29 @@
# TLG_JoinCaptchaBot
# TLG_JoinCaptchaBot_UA

<p align="center">
<img width="100%" height="100%" src="https://gist.githubusercontent.com/J-Rios/05d7a8fc04166fa19f31a9608033d10b/raw/32dee32a530c0a0994736fe2d02a1747478bd0e3/captchas.png">
</p>
This is a fork of the [J-Rios/TLG_JoinCaptchaBot](https://github.com/J-Rios/TLG_JoinCaptchaBot) with personal improves.

Telegram Bot to verify if a new member joining a group is a human.
Upon a new user join a group, the Bot send an image-based [captcha challenge](https://en.wikipedia.org/wiki/CAPTCHA) that must be solved to allow the user stay in the group. If the new user fails to solve the captcha within a set time limit, they are removed from the group. Additionally, any message from a new user that includes a URL prior to the completion of the captcha will be considered Spam and will be deleted.
This fork-project doesn't provide support. Use on you own risk.

## Donate
## Sync forked master branch with origin master repo

Do you like this Bot? Buy me a coffee :)
1. Add the remote (original repo that you forked) and call it “upstream”

Paypal:
git remote add upstream [email protected]:J-Rios/TLG_JoinCaptchaBot.git

[https://www.paypal.me/josrios](https://www.paypal.me/josrios)
2. Fetch all branches of remote upstream

## Installation
git fetch upstream

Note: Use Python 3.6 or above to install and run the Bot, previous python version are unsupported.
3. Rewrite your master with upstream’s master using git rebase.

To generate Captchas, the Bot uses [multicolor_captcha_generator library](https://github.com/J-Rios/multicolor_captcha_generator), which uses Pillow to generate the images.
git rebase upstream/master

1. Install Pillow prerequisites:
4. Push your updates to master. You may need to force the push with “--force”.

```bash
sudo apt update
sudo apt install -y libtiff5-dev libjpeg62-turbo-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk
```
git push origin master --force

2. Get the project and install JoinCaptchaBot requirements:
## Credits

```bash
git clone https://github.com/J-Rios/TLG_JoinCaptchaBot
cd TLG_JoinCaptchaBot
python3 -m pip install -r requirements.txt
```
Original Author - [Jose](https://github.com/J-Rios)

3. Set Telegram Bot account Token (get it from @BotFather) in "src/settings.py" file:

```python
'TOKEN' : 'XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
```

## Configuration

All Bot configurations can be done easily by modifying them in the **"src/settings.json"** file.

For more experienced users, you can use environment variables to setup all that properties (this is really useful for advance deployment when using [Virtual Environments](https://docs.python.org/3/tutorial/venv.html) and/or [Docker](https://docs.docker.com/get-started/) to isolate the Bot process execution).


## Usage

To ease it usage in Linux, a **Makefile** is provided.

- Check usage help information:

```bash
make
```

- Launch the Bot:

```bash
make run
```

- Check if the Bot is running:

```bash
make status
```

- Stop the Bot:

```bash
make kill
```

## Systemd service

For systemd based systems, you can setup the Bot as daemon service.

To do that, you need to create a new service description file for the Bot as follow:

```bash
[vim or nano] /etc/systemd/system/tlg_joincaptcha_bot.service
```

File content:

```bash
[Unit]
Description=Telegram Join Captcha Bot Daemon
Wants=network-online.target
After=network-online.target
[Service]
Type=forking
WorkingDirectory=/path/to/TLG_JoinCaptchaBot/src/
ExecStart=/path/to/TLG_JoinCaptchaBot/tools/run
ExecReload=/path/to/TLG_JoinCaptchaBot/tools/kill
[Install]
WantedBy=multi-user.target
```

Then, to add the new service into systemd, you should enable it:

```bash
systemctl enable --now tlg_joincaptcha_bot.service
```

Now, you can start the service (Bot) by:

```bash
systemctl start tlg_joincaptcha_bot.service
```

You can check if the service (Bot) is running by:

```bash
systemctl status tlg_joincaptcha_bot.service
```

Remember that, if you wan't to disable it, you should execute:
```bash
systemctl disable tlg_joincaptcha_bot.service
```
## Docker
You can also run the bot on [Docker](https://docs.docker.com/get-started/). This allows easy server migration and automates the installation and setup. Look at the [docker specific documentation](docker/README.md) for more details about how to create a Docker Container for Captcha Bot.
## Bot Owner
The **Bot Owner** can run special commands that no one else can use, like /allowgroup (if the Bot is private, this set allowed groups where the Bot can be used) or /allowuserlist (to make Bot don't ask for captcha to some users, useful for example for blind users).

You can setup a Bot Owner by specifying the Telegram User ID or Alias in "settings.py" file. For example:

```python
"BOT_OWNER": "@JoseTLG",
```

## Make Bot Private

By default, the Bot is **Public**, so any Telegram user can add and use the Bot in any group, but you can set it to be **Private** so the Bot just can be used in allowed groups (Bot owner allows them with **/allow_group** command).

You can set Bot to be Private in "settings.py" file:

```python
"BOT_PRIVATE" : True,
```

**Note:** If you have a Public Bot and set it to Private, it will leave any group where is not allowed to be used when a new user joins.

**Note:** Telegram Private Groups could changes their chat ID when it become a public super-group, so the Bot will leave the group and the owner has to set the new group chat ID with /allow_group.

## Scalability (Polling or Webhook)

By default, Bot checks and receives updates from Telegram Servers by **Polling** (it periodically requests and gets from Telegram Server if there is any new updates in the Bot account corresponding to that Bot Token), this is really simple and can be used for low to median scale Bots. However, you can configure the Bot to use **Webhook** instead if you expect to handle a large number of users/groups (with webhook, the Telegram Server is the one that will connect to you machine and send updates to the Bot when there is any new update).

To use Webhook instead Polling, you need a signed certificate file in the system, you can create the key file and self-sign the cert through openssl tool:

```bash
openssl req -newkey rsa:2048 -sha256 -nodes -keyout private.key -x509 -days 3650 -out cert.pem
```

Once you have the key and cert files, setup the next lines in "settings.py" file to point to expected host system address, port, path and certificate files:

```python
"WEBHOOK_IP": "0.0.0.0",
"WEBHOOK_PORT": 8443,
"WEBHOOK_PATH": "/TLG_JoinCaptchaBot"
"WEBHOOK_CERT" : SCRIPT_PATH + "/cert.pem",
"WEBHOOK_CERT_PRIV_KEY" : SCRIPT_PATH + "/private.key",
```

(Optional) In case you want to use a reverse proxy between Telegram Server and the system that runs the Bot, you need to setup the Proxy Webhook URL setting:

```python
"WEBHOOK_URL": "https://example.com:8443/TLG_JoinCaptchaBot"
```

Then, you need to change Bot connection mode from polling to webhook by setting to True the next configuration:

```python
"CAPTCHABOT_USE_WEBHOOK": True,
```

To go back and use Polling instead Webhook, just set the config back to False:

```python
"CAPTCHABOT_USE_WEBHOOK": False,
```

## Adding a New Language

Actual language support is based on external JSON files that contain all bot texts for each language.

To add support for a new language you must follow this steps:

1. Fork the project repository, clone it and create a new branch to work on it (i.e. named language-support-en).

2. Copy from one of the existing language JSON files from [here](https://github.com/J-Rios/TLG_JoinCaptchaBot/tree/master/src/language) to a new one.

3. Change the name of that file for the language ISO Code of the language that you want.

4. Translate each text from JSON key values of the file without breaking the JSON format/structure (it should be valid for JSON parsers) and maintaining JSON key names. Keep command names in english (i.e. don't translate "START", "HELP"... /start /help ...) and don't remove special characters (like {}, ", ', \n...) too!
5. Make a pull request of that branch with the new language file into this repository and wait for it to be accepted.
6. Then, I will make the integration into source code and actual Bot account (@join_captcha_bot).
7. Enjoy the new language :)
## Languages Contributors
- Arabic: [@damascene](https://github.com/damascene)
- Basque: [@xa2er](https://github.com/xa2er)
- Belarusian: [@antikruk](https://github.com/antikruk)
- Catalán: Adela Casals i Jorba
- Chinese (Mainland): [神林](https://github.com/jyxjjj)
- Esperanto: Pablo Busto & Porrumentzio.
- Finnish: [Aminda Suomalainen (@Mikaela)](https://github.com/Mikaela)
- French: [Mathieu H (@aurnytoraink)](https://github.com/Aurnytoraink)
- Galician: [Fernando Flores (Fer6Flores)](https://github.com/Fer6Flores); Iváns
- German: [@weerdenburg](https://github.com/weerdenburg), [@MossDerg](https://github.com/MossDerg)
- Indonesian: ForIndonesian
- Italian: Noquitt, [Nicola Davide (@nidamanx)](https://github.com/nidamanx)
- Kannada: [@itsAPK](https://github.com/itsAPK)
- Korean: [@dakeshi](https://github.com/dakeshi)
- Persian: [@m4hbod](https://github.com/M4hbod)
- Portuguese (Brazil): Anahuac de Paula Gil
- Russian: Unattributed (anonymous), [@stezkoy](https://github.com/Stezkoy), [Roman (@toxi22)](https://github.com/toxi22)
- Serbo-Croatian: [@IlijaDj](https://github.com/IlijaDj)
- Slovak: [@dumontiskooo](https://t.me/dumontiskooo)
- Ukrainian: Vadym Zhushman (@zhushman00), [Roman (@toxi22)](https://github.com/toxi22)
- Uzbek: [@mhwebuz](https://github.com/mhwebuz)
Original Repository - [J-Rios/TLG_JoinCaptchaBot](https://github.com/J-Rios/TLG_JoinCaptchaBot)
31 changes: 31 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# This docker-compose file is used in production. For local development
# run_backend.py and run_server_rpc.py script are executed in the python venv.

version: "3.9"

services:
UaCaptchaBot:
image: uacaptchabot:${TAG}
build:
dockerfile: docker/Dockerfile
context: .
container_name: UaCaptchaBot
hostname: UaCaptchaBot
environment:
- TAG=${TAG}
- CAPTCHABOT_PRIVATE=${CAPTCHABOT_PRIVATE}
- CAPTCHABOT_TOKEN=${CAPTCHABOT_TOKEN}
- CAPTCHABOT_OWNER=${CAPTCHABOT_OWNER}
- CAPTCHABOT_INIT_LANG=${CAPTCHABOT_INIT_LANG}
- CAPTCHABOT_INIT_CAPTCHA_TIME_MIN=${CAPTCHABOT_INIT_CAPTCHA_TIME_MIN}
- CAPTCHABOT_T_DEL_WELCOME_MSG=${CAPTCHABOT_T_DEL_WELCOME_MSG}
- CAPTCHABOT_MAX_FAIL_BAN_POLL=${CAPTCHABOT_MAX_FAIL_BAN_POLL}
- CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE=${CAPTCHABOT_INIT_CAPTCHA_CHARS_MODE}
volumes:
- "${LOCAL_DATA_PATH}:/srv/app/src/data"
networks:
- UaCaptchaBot

networks:
UaCaptchaBot:
name: UaCaptchaBot
17 changes: 13 additions & 4 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ ARG BOT_USER="nobody"
ARG BOT_GROUP="nogroup"
ARG BOT_HOME_DIR="/srv"
ARG APP_DIR="${BOT_HOME_DIR}/app"
ARG GITHUB_URL="https://github.com/J-Rios/TLG_JoinCaptchaBot"
#ARG GITHUB_URL="https://github.com/J-Rios/TLG_JoinCaptchaBot"

# Export ARGs as ENV vars so they can be shared among steps
ENV BOT_PROJECT="${BOT_PROJECT}" \
Expand All @@ -29,6 +29,8 @@ RUN chown -cR "${BOT_USER}:${BOT_GROUP}" ${BOT_HOME_DIR} && \

FROM base AS builder-deps

RUN sed -e 's/http\:/https\:/g' /etc/apt/sources.list -i

# Install build dependencies
RUN apt-get ${APT_OPTS} update && \
apt-get ${APT_OPTS} install \
Expand All @@ -52,10 +54,16 @@ FROM builder-deps AS builder
# Build the code as unprivileged user
USER ${BOT_USER}
WORKDIR ${BOT_HOME_DIR}
RUN git clone ${GITHUB_URL} ${APP_DIR} && \
python3 -m pip install --user --requirement ${APP_DIR}/requirements.txt && \


#RUN git clone ${GITHUB_URL} ${APP_DIR} && \
COPY --chown=${BOT_USER}:${BOT_GROUP} src/ ${APP_DIR}/src
COPY --chown=${BOT_USER}:${BOT_GROUP} tools/ ${APP_DIR}/tools

RUN python3 -m pip install --upgrade pip && \
python3 -m pip install --user --requirement ${APP_DIR}/src/requirements.txt && \
cd ${APP_DIR}/src && \
chown -cR ${BOT_USER}:${BOT_GROUP} ${BOT_HOME_DIR} && \
chown -cR ${BOT_USER}:${BOT_GROUP} ${BOT_HOME_DIR}/app/* && \
rm -rf ${BOT_HOME_DIR}/.cache && \
find ${APP_DIR} -iname '.git*' -print0 | xargs -0 -r -t rm -rf

Expand All @@ -76,4 +84,5 @@ RUN chown -R "${BOT_USER}:${BOT_GROUP}" ${BOT_HOME_DIR} && \
# Set up to run as an unprivileged user
USER ${BOT_USER}
WORKDIR ${APP_DIR}
RUN chmod +x ./tools/*
CMD ["./tools/entrypoint.sh"]
20 changes: 0 additions & 20 deletions docker/Makefile

This file was deleted.

Loading

0 comments on commit 99ed172

Please sign in to comment.