การสร้าง chat bot Telegram ที่ใช้ gpt 3.5 ใน python
Tags: ai, python
Published: 2023-04-07 09:45:06

ขั้นตอนการสร้าง Telegram chat bot ที่ทำงานร่วมกับ OpenAI API
1. ตั้งค่า Flask บนเครื่องคอมพิวเตอร์ของคุณ
2. สร้าง Telegram Bot
3. การเชื่อมต่อ Flask กับ Telegram Bot
4. การเขียนฟังก์ชันเพื่อ request ไปยัง OpenAI API
5. การใช้บน Deta.space

เมื่อทำตามขั้นตอนเหล่านี้ จะทำให้คุณสามารถสร้าง Telegram Bot ที่สามารถโต้ตอบกับผู้ใช้ได้อย่างชาญฉลาด โดยการใช้ประโยชน์จาก OpenAI มาเริ่มกันเลย!!

## **1. ตั้งค่า Flask บนเครื่องคอมพิวเตอร์ของคุณ**

```
mkdir telegrambot
cd telegrambot
touch main.py

# Open the file in the editor that u prefer
```
จากนั้นให้ติดตั้งโมดูลที่จำเป็นลงไป ทีนี้คุณจะต้องเลือกว่าจะใช้ virtual env. หรือ local machine 
สมมติคุณจะใช้ virtual env. ก็ให้ set up ด้วยคำสั่งดังต่อไปนี้:


```
python -m venv <name_of_virtual_environment>

# if you use bash
source <name_of_virtual_environment>

# if you use fish
source <name_of_virtual_environment>/bin/activate.fish
```
ทีนี้เปิดไฟล์ main.py และเขียนโค้ดพื้นฐานกัน 
main.py


```
from flask import Flask, request

app = Flask(__name__)

@app.route("/", methods=["GET"])
def index():
    return "Hello World!"


if __name__ == "__main__":
    port = 5000
    app.run(debug=True, host='0.0.0.0', port=port)
```
ต่อไปให้ติดตั้ง flask ผ่าน pip: `pip3 install flask`
หลังจากติดตั้งแล้ว เราสามารถรันแอปได้ด้วยคำสั่ง: `python3 main.py`
จะเห็นว่าเราสร้างแอปให้ทำงานได้แล้ว! 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7reeheyrv69lxciibrya.png)

## **2. สร้าง Telegram Bot**
ในการเชื่อมต่อ Flask ของเรากับ Telegram Bot API ก่อนอื่นเราต้องสร้าง Bot ใหม่บน Telegram ซึ่งเราสามารถทำได้ง่าย ๆ โดยทำตามขั้นตอนดังนี้

1. เปิด Telegram และค้นหา " @botfather " ในแถบค้นหา 
2. เริ่มการสนทนากับ BotFather โดยส่งคำสั่ง "/ start" 
3. หากต้องการสร้าง Bot ใหม่ ให้พิมพ์คำสั่ง "/newbot" และทำตามคำแนะนำของ BotFather 
4. ตั้งชื่อ Bot ของคุณและชื่อผู้ใช้ที่ลงท้ายด้วย "bot"
5. เมื่อคุณสร้าง Bot สำเร็จแล้ว BotFather จะให้ token การอนุญาตแก่คุณ ซึ่งคุณจะต้องใช้เพื่อสื่อสารกับ Telegram Bot API

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c2gzohu2j4z0qzwiwllm.png)

ด้วยการสร้าง Bot ใหม่บน Telegram เราสามารถเชื่อมโยงมันกับ Flask ของเราและเริ่มสร้างฟังก์ชันการทำงานของ chat Bot ได้

## **3. หลังจากสร้าง Bot และได้รับ Bot token แล้ว ตอนนี้เราสามารถเชื่อมโยงมันกับ Flask ของเราได้แล้ว**
เราสามารถใช้โมดูล`requests` ได้โดยติดตั้งแพ็คเกจโดยใช้คำสั่ง `pip3 install requests` 

ทีนี้มาดูโค้ด main.py ที่อัปเดตแล้วกัน:

```
import requests
from flask import Flask, request

app = Flask(__name__)

BOT_TOKEN = <your_token_value>

def sendmessage(chatid, message):
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
    payload = {
        "text": message,
        "chat_id": chatid
    }

    print(requests.get(url, params=payload))

@app.route("/", methods=["POST", "GET"])
def index():
    if (request.method == "POST"):
        resp = request.get_json()
        print(resp)
        # We get the content of the message
        msgtext = resp["message"]["text"]
        # We get the id of the chat
        chatid = resp["message"]["chat"]["id"]
        # The message is sent back
        sendmessage(chatid, msgtext)
        return "Done"
    else:
        return "Hello World!"

if __name__ == "__main__":
    port = 5000
    app.run(debug=True, host='0.0.0.0', port=port)
```
ก่อนที่จะทดลองว่า Bot ทำงานหรือไม่ เราต้องใช้`ngrok`เพื่อตั้งค่า HTTP Tunnel เป็น Localhost โดยใช้คำสั่ง `ngrok http 5000`

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/of2z6kzvf0qsvty9mudz.png)
เราสามารถตรวจสอบได้ว่า URL ใช้การได้หรือไม่โดยใช้คำสั่ง`curl`
```
# telegrambot> curl https://a577-131-114-63-2.eu.ngrok.io
Hello World!⏎
```
ตอนนี้เราสามารถตั้งค่า webHook ของ Telegram Bot ได้แล้ว:

```
curl "https://api.telegram.org/bot<TOKEN>/setwebHook?url=https://a577-131-114-63-2.eu.ngrok.io"
{"ok":true,"result":true,"description":"Webhook was set"}⏎

```
และเราจะเห็นว่าตอนนี้ Bot ทำงานได้อย่างสมบูรณ์

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygdgdv22g733lmtczfxq.png)

## **4. การเขียนฟังก์ชันที่เรียก openAI API**

ในการรับรหัส API เราต้องสร้างบัญชีบน OpenAI หลังจากนั้นเราไปที่ URL นี้ https://platform.openai.com/account/api-keys
เพื่อรับรหัสของเราเอง

ทีนี้เราก็อัปเดตฟังก์ชัน `sendmessage` ให้เป็นดังนี้:

```
def sendmessage(chatid, message):
    headers = {"Content-Type": "application/json",
               "Authorization": f"Bearer {OPEN_AI}"}
    info = {
        # The model used (you can use gpt-4 if you have access to it)
        "model": "gpt-3.5-turbo",
        "messages": [{"role": "user", "content": message}],
        # Randomness of the result
        "temperature": 0.7,
        "max_tokens": 1024
    }
    post_request = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=info)

    response_api = post_request.json()["choices"][0]["message"]["content"]
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
    payload = {
        "text": response_api,
        "chat_id": chatid
    }
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m7wxt2k6ndok5fgc9k0l.png)

## **ปรับใช้บน deta.space**
ในการปรับใช้บน deta.space เราจำเป็นต้องทำตามขั้นตอนเหล่านี้
- สร้างบัญชี
- ดาวน์โหลด Space Cli `curl -fsSL https://get.deta.dev/space-cli.sh | sh`
- เข้าสู่ระบบบน cli ด้วย `space login`
- สร้างโครงการด้วย `space new`
- อัปเดตโค้ดสองสามบรรทัดให้เป็นดังนี้

```
 import os
 OPEN_AI = os.getenv("OPEN_AI")
 BOT_TOKEN = os.getenv("BOT_TOKEN")
```
- การสร้าง Spacefile วิธีเรียกใช้แอปดังนี้

```
# Spacefile Docs: https://go.deta.dev/docs/spacefile/v0
v: 0
app_name: telegrambot
micros:
    - name: telegrambot
      src: .
      engine: python3.9
      primary: true
      public_routes:
        - "/"
      presets:
        env:
          - name: BOT_TOKEN
            description: Telegram Bot Key
            default: "<BOT_TOKEN>"
          - name: OPEN_AI
            description: Open AI Key
            default: "<OPEN_AI_API>"
```
- กดแอปไปที่ deta.space ด้วย`space push`
- การเปลี่ยน hook ของ telegram ด้วยคำสั่งเดียวกันแต่ใช้ url ของ deta.space แทน

**เสร็จเรียบร้อย**
เราได้สร้าง Bot ที่สวยงามซึ่งใช้ปัญญาประดิษฐ์ในการช่วยเหลือคุณ