Created
April 8, 2023 18:40
-
-
Save fabiovila/af1c988ae1eab319f2e9cf2a5adecc55 to your computer and use it in GitHub Desktop.
OpenAI Bot for Telegram, also example of Flask and webhook pure requests bot for telegram, redis is used as update_id cache.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, request, jsonify | |
import requests | |
from .bot import get_completion | |
import logging, sys | |
import redis | |
logging.basicConfig(stream=sys.stderr,level=logging.DEBUG, format="[FLASK] %(message)s") | |
app = Flask(__name__) | |
app.debug = True | |
TELEGRAM_URL = "https://api.telegram.org/" | |
# -- CONFIGS | |
# token provided by BotFather | |
TOKEN = "bot" + "YOUR_TOKEN_HERE" + "/" | |
# your https server url example: ""https://www.mayserver.com/"" or ""https://www.mayserver.com/telegram/"" | |
SERVER_URL = "https://www.mayserver.com/telegram/" | |
# allowed chats id, other chats are ignored. Integer format | |
TELEGRAM_CHAT_ID= [-1001217684771] | |
def sendMessage(chat_id, text, reply_id): | |
payload = { | |
'chat_id':chat_id, | |
'text':text, | |
'reply_to_message_id': reply_id, | |
} | |
session = requests.Session() | |
req = requests.post(TELEGRAM_URL+TOKEN+"sendMessage",data=payload) | |
print (req) | |
@app.route('/', methods=['GET', 'POST']) | |
def index(): | |
if request.json and 'message' in request.json: | |
j = request.json | |
message = j['message'] | |
chat_id = message['chat']['id'] | |
update_id = j['update_id'] | |
pool = redis.ConnectionPool(host='localhost', port=6379, db=0) | |
r = redis.Redis(connection_pool=pool) | |
if r.get(update_id) == b'1': | |
return "ok" | |
else: | |
r.set(update_id,1,ex=432000) | |
for ci in TELEGRAM_CHAT_ID: | |
if chat_id == ci and 'text' in message: | |
userid = message['from']['id'] | |
username = message['from'].get('username',message['from'].get('first_name','')) | |
text = message['text'] | |
message_id = message['message_id'] | |
answer, message_response = arissa.get_completion(text,username) | |
if answer: | |
sendMessage(chat_id,message_response,message_id) | |
break | |
return "ok" | |
@app.route('/set', methods=['GET', 'POST']) | |
def sethook(): | |
r = requests.get(TELEGRAM_URL+TOKEN+"setWebhook?url="+SERVER_URL) | |
return jsonify(r.json()) | |
@app.route('/del', methods=['GET', 'POST']) | |
def delhook(): | |
r = requests.get(TELEGRAM_URL+TOKEN+'deleteWebhook?url='+SERVER_URL) | |
return jsonify(r.json()) | |
# Open SERVER_URL/refresh in order to set webhook while in dev stage | |
@app.route('/refresh', methods=['GET', 'POST']) | |
def refreshhook(): | |
r = requests.get(TELEGRAM_URL+TOKEN+'deleteWebhook?url='+SERVER_URL) | |
r = requests.get(TELEGRAM_URL+TOKEN+"setWebhook?url="+SERVER_URL) | |
return jsonify(r.json()) | |
if __name__ == "__main__": | |
r = requests.get(TELEGRAM_URL+TOKEN+'deleteWebhook?url='+SERVER_URL) | |
r = requests.get(TELEGRAM_URL+TOKEN+"setWebhook?url="+SERVER_URL) | |
app.run() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import openai | |
MENTION_TRIGGER=['botname','@botname'] | |
PROMPT = 'user @{} in Telegram: "{}".' | |
def get_completion (txt: str, user: str): | |
answer = False | |
original_response = '' | |
for m in MENTION_TRIGGER: | |
if m in txt.lower(): | |
answer = True | |
break | |
if answer: | |
prompt = PROMPT.format(user,txt) | |
openai.api_key = "YOUR_KEY_HERE" | |
message = [{"role": "user", "content": prompt}] | |
chat_completion = openai.ChatCompletion.create(model='gpt-3.5-turbo', messages=message, max_tokens=1024) | |
original_response = chat_completion['choices'][0]['message']['content'] | |
return answer, original_response |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment