File size: 3,755 Bytes
052e52f
 
 
 
3f861d9
cbda7a6
 
3f861d9
052e52f
 
cbda7a6
 
 
052e52f
cbda7a6
052e52f
 
 
 
 
 
 
cbda7a6
3f861d9
cbda7a6
3f861d9
 
cbda7a6
3f861d9
cbda7a6
3f861d9
 
e615e06
052e52f
f586e58
052e52f
 
 
cbda7a6
 
 
 
 
 
 
 
3f861d9
e615e06
 
3f861d9
 
 
 
 
 
 
e615e06
 
3f861d9
e615e06
3f861d9
e615e06
 
cbda7a6
e615e06
cbda7a6
 
 
052e52f
 
 
 
 
3f861d9
052e52f
 
cbda7a6
 
052e52f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cbda7a6
052e52f
 
 
 
 
 
d173c0d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse
from twilio.rest import Client
import os
import requests
from PIL import Image
import io
import uuid

app = Flask(__name__)
UPLOAD_FOLDER = 'uploads'
if not os.path.exists(UPLOAD_FOLDER):
    os.makedirs(UPLOAD_FOLDER)

# Initialize the Flask app
account_sid = os.environ.get('TWILIO_ACCOUNT_SID')
auth_token = os.environ.get('TWILIO_AUTH_TOKEN')
client = Client(account_sid, auth_token)

# WhatsApp number to send messages from (your Twilio number)
from_whatsapp_number = 'whatsapp:+14155238886'

# Placeholder functions for image classification
def classify_pest(image_path):
    # Implement pest classification model here
    # This function should now accept a file path instead of an image object
    return f"Detected Pest: [Pest Name] for image at {image_path}"

def classify_disease(image_path):
    # Implement disease classification model here
    # This function should now accept a file path instead of an image object
    return f"Detected Disease: [Disease Name] for image at {image_path}"

@app.route('/whatsapp', methods=['POST'])
def whatsapp_webhook():
    incoming_msg = request.values.get('Body', '').lower()
    sender = request.values.get('From')
    
    # Check if an image is attached
    num_media = int(request.values.get('NumMedia', 0))
    
    if num_media > 0:
        media_url = request.values.get('MediaUrl0')
        content_type = request.values.get('MediaContentType0')
        
        if content_type.startswith('image/'):
            # Download and save the image
            response = requests.get(media_url)
            if response.status_code == 200:
                # Generate a unique filename
                filename = f"{uuid.uuid4()}.jpg"
                filepath = os.path.join(UPLOAD_FOLDER, filename)
                
                # Save the image
                with open(filepath, 'wb') as f:
                    f.write(response.content)
                
                if 'pest' in incoming_msg:
                    response_text = classify_pest(filepath)
                elif 'disease' in incoming_msg:
                    response_text = classify_disease(filepath)
                else:
                    response_text = "Please specify if you want to detect a pest or a disease."
            else:
                response_text = "Failed to download the image. Please try again."
        else:
            response_text = "The attached file is not an image. Please send an image for classification."
    elif 'bookkeeping' in incoming_msg:
        response_text = "Please provide the details you'd like to record."
    else:
        response_text = get_agricultural_insights(incoming_msg)
    
    send_message(sender, response_text)
    return '', 204  # Return an empty response to Twilio

def get_agricultural_insights(query):
    # Implement your agricultural insights logic here
    return query

def send_message(to, body):
    try:
        message = client.messages.create(
            from_=from_whatsapp_number,
            body=body,
            to=to
        )
        print(f"Message sent with SID: {message.sid}")
    except Exception as e:
        print(f"Error sending message: {e}")

# Function to send an initial message
def send_initial_message(to_number):
    send_message(
        f'whatsapp:{to_number}',
        'Welcome to the Agri AI Chatbot! How can I assist you today? You can send an image with "pest" or "disease" to classify it.'
    )

if __name__ == '__main__':
    # Send an initial message when the script starts
    send_initial_message('916382792828')  # Replace with the recipient's number
    # Start the Flask server
    app.run(host='0.0.0.0', port=7860)