Update main.py

master
fabston 2024-05-01 08:38:17 +07:00
parent d1d7699e24
commit b8ef523b2c
3 changed files with 47 additions and 26 deletions

1
.github/FUNDING.yml vendored
View File

@ -1 +0,0 @@
liberapay: fabston

View File

@ -26,20 +26,21 @@
The **TradingView Webhook Bot** ⚙️ listens to [TradingView](https://tradingview.com) alerts via [webhooks](https://www.tradingview.com/support/solutions/43000529348-i-want-to-know-more-about-webhooks/) using [flask](https://flask.palletsprojects.com/en/1.1.x/).
All alerts can be instantly sent to Telegram, Discord, Twitter and/or Email.
## Features
- Telegram Support using the [Python Telegram](https://github.com/python-telegram-bot/python-telegram-bot) libary
- Discord Support using [webhooks](https://support.discord.com/hc/de/articles/228383668-Webhooks-verwenden)
- Slack Support using [webhooks](https://api.slack.com/messaging/webhooks)
- Twitter Support using the [tweepy](https://github.com/tweepy/tweepy) libary
- Email Support using [smtplib](https://docs.python.org/3/library/smtplib.html)
- Alert channels can be enabled or disabled in [`config.py`](https://github.com/fabston/TradingView-Webhook-Bot/blob/master/config.py)
- Dynamically send alerts to different Telegram and/or Discord channels
- TradingView `{{close}}`, `{{exchange}}` etc. variables support. Read more [here](https://www.tradingview.com/blog/en/introducing-variables-in-alerts-14880/)
> 📊 If you are looking for an exchange to trade on, I can recommend [Bybit](https://partner.bybit.com/b/20882).
> Sign up now and receive up to $30,000 in Deposit Rewards!
> 💡 Got a feature idea? Open an [issue](https://github.com/fabston/TradingView-Webhook-Bot/issues/new?assignees=&labels=enhancement&template=feature-request---.md) and I might implement it.
## Features
- Telegram Support using the [Python Telegram](https://github.com/python-telegram-bot/python-telegram-bot) libary.
- Discord Support using [webhooks](https://support.discord.com/hc/de/articles/228383668-Webhooks-verwenden).
- Slack Support using [webhooks](https://api.slack.com/messaging/webhooks).
- Twitter Support using the [tweepy](https://github.com/tweepy/tweepy) libary.
- Email Support using [smtplib](https://docs.python.org/3/library/smtplib.html).
- Alert channels can be enabled or disabled in [`config.py`](https://github.com/fabston/TradingView-Webhook-Bot/blob/master/config.py).
- Dynamically send alerts to different Telegram and/or Discord channels.
- TradingView `{{close}}`, `{{exchange}}` etc. variables support. Read more [here](https://www.tradingview.com/blog/en/introducing-variables-in-alerts-14880/).
## Installation
> ⚠️ Best to run the bot on a VPS. I can recommend <a href="https://hetzner.cloud/?ref=tQ1NdT8zbfNY" title="Get €20 in cloud credits">Hetzner</a>'s CX11 VPS for 2.89€/month. [Sign up](https://hetzner.cloud/?ref=tQ1NdT8zbfNY) now and receive **€20 free** credits.
> ⚠️ Best to run the bot on a VPS. I can recommend <a href="https://hetzner.cloud/?ref=tQ1NdT8zbfNY" title="Get €20 in cloud credits">Hetzner</a>'s CX11 VPS for 3.79€/month. [Sign up](https://hetzner.cloud/?ref=tQ1NdT8zbfNY) now and receive **€20 free** credits.
1. Clone this repository `git clone https://github.com/fabston/TradingView-Webhook-Bot.git`
1. Create your virtual environment `python3 -m venv TradingView-Webhook-Bot`
1. Activate it `source TradingView-Webhook-Bot/bin/activate && cd TradingView-Webhook-Bot`
@ -64,14 +65,35 @@ All alerts can be instantly sent to Telegram, Discord, Twitter and/or Email.
1. Run the bot with `python main.py`
1. [PM2](https://github.com/fabston/TradingView-Webhook-Bot/issues/28#issuecomment-766301062) can help you in running the app in the background / on system boot.
### Forward Port 80 to 8080 using NGINX
*It is recommended to run flask on a different port like 8080. It is then necessary to forward port 80 to 8080.*
1. Edit the NGINX configuration file `sudo nano /etc/nginx/sites-enabled/tv_webhook`
1. Add the following content:
```nginx
server {
listen 80;
server_name <YOUR-IP>;
location / {
proxy_pass http://127.0.0.1:8080; # Forward traffic to port 8080
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Pass client's IP address
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
1. Restart NGINX `sudo service nginx restart`
### Docker
1. Clone this repository `git clone https://github.com/fabston/TradingView-Webhook-Bot.git`
1. Edit and update [`config.py`](https://github.com/fabston/TradingView-Webhook-Bot/blob/master/config.py)
1. `docker-compose build`
1. `docker-compose up`
*It is recommended to run flask on a different port like 8080. It is then necessary to forward port 80 to 8080.*
## Images
![Webhook Bot](https://i.imgur.com/vZA42cc.png)

24
main.py
View File

@ -4,13 +4,10 @@
# File Name : main.py #
# ----------------------------------------------- #
import json
import time
from flask import Flask, request
from handler import send_alert
import config
from handler import *
import time
from flask import Flask, request, jsonify
app = Flask(__name__)
@ -22,25 +19,28 @@ def get_timestamp():
@app.route("/webhook", methods=["POST"])
def webhook():
whitelisted_ips = ['52.89.214.238', '34.212.75.30', '54.218.53.128', '52.32.178.7']
client_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
if client_ip not in whitelisted_ips:
return jsonify({'message': 'Unauthorized'}), 401
try:
if request.method == "POST":
data = request.get_json()
key = data["key"]
if key == config.sec_key:
if data["key"] == config.sec_key:
print(get_timestamp(), "Alert Received & Sent!")
send_alert(data)
return "Sent alert", 200
return jsonify({'message': 'Webhook received successfully'}), 200
else:
print("[X]", get_timestamp(), "Alert Received & Refused! (Wrong Key)")
return "Refused alert", 400
return jsonify({'message': 'Unauthorized'}), 401
except Exception as e:
print("[X]", get_timestamp(), "Error:\n>", e)
return "Error", 400
return jsonify({'message': 'Error'}), 400
if __name__ == "__main__":
from waitress import serve
serve(app, host="0.0.0.0", port=80)
serve(app, host="0.0.0.0", port=8080)