rairo commited on
Commit
23a6ee2
·
verified ·
1 Parent(s): fc418b7

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +108 -76
main.py CHANGED
@@ -1,6 +1,6 @@
1
- # messenger object
2
  import os
3
  import logging
 
4
  from heyoo import WhatsApp
5
  from dotenv import load_dotenv
6
  from flask import Flask, request, make_response
@@ -8,106 +8,138 @@ from flask import Flask, request, make_response
8
  # Initialize Flask App
9
  app = Flask(__name__)
10
 
 
 
 
 
 
 
 
11
  # Load .env file
12
  load_dotenv()
13
- messenger = WhatsApp(os.environ["whatsapp_token"],phone_number_id=os.environ["phone_number_id"])
14
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  VERIFY_TOKEN = "30cca545-3838-48b2-80a7-9e43b1ae8ce4"
17
 
18
- g_api_key = os.environ["google_api_key"]
19
-
20
- # Logging
21
- logging.basicConfig(
22
- level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
23
- )
24
-
25
-
26
  @app.get("/")
27
  async def verify_token():
28
- if request.args.get("hub.verify_token") == VERIFY_TOKEN:
29
- logging.info("Verified webhook")
30
- response = make_response(request.args.get("hub.challenge"), 200)
31
- response.mimetype = "text/plain"
32
- return response
33
- logging.error("Webhook Verification failed")
34
- return "Invalid verification token"
35
-
 
 
 
36
 
37
  @app.post("/")
38
  async def hook():
39
- # Handle Webhook Subscriptions
40
- data = request.get_json()
41
- logging.info("Received webhook data: %s", data)
42
- changed_field = messenger.changed_field(data)
43
- if changed_field == "messages":
44
- new_message = messenger.is_message(data)
45
- if new_message:
46
- mobile = messenger.get_mobile(data)
47
- name = messenger.get_name(data)
48
- message_type = messenger.get_message_type(data)
49
- logging.info(
50
- f"New Message; sender:{mobile} name:{name} type:{message_type}"
51
- )
 
 
 
 
 
 
 
 
 
 
52
  if message_type == "text":
53
  message = messenger.get_message(data)
54
- name = messenger.get_name(data)
55
- logging.info("Message: %s", message)
56
- await messenger.send_message(f"Hi {name}, nice to connect with you", mobile)
 
 
 
 
 
57
 
58
  elif message_type == "interactive":
59
  message_response = messenger.get_interactive_response(data)
60
  interactive_type = message_response.get("type")
61
  message_id = message_response[interactive_type]["id"]
62
  message_text = message_response[interactive_type]["title"]
63
- logging.info(f"Interactive Message; {message_id}: {message_text}")
64
 
65
  elif message_type == "location":
66
  message_location = messenger.get_location(data)
67
  message_latitude = message_location["latitude"]
68
  message_longitude = message_location["longitude"]
69
- logging.info("Location: %s, %s", message_latitude, message_longitude)
70
-
71
- elif message_type == "image":
72
- image = messenger.get_image(data)
73
- image_id, mime_type = image["id"], image["mime_type"]
74
- image_url = await messenger.query_media_url(image_id)
75
- image_filename = await messenger.download_media(image_url, mime_type)
76
- logging.info(f"{mobile} sent image {image_filename}")
77
-
78
- elif message_type == "video":
79
- video = messenger.get_video(data)
80
- video_id, mime_type = video["id"], video["mime_type"]
81
- video_url = await messenger.query_media_url(video_id)
82
- video_filename = await messenger.download_media(video_url, mime_type)
83
- logging.info(f"{mobile} sent video {video_filename}")
84
-
85
- elif message_type == "audio":
86
- audio = messenger.get_audio(data)
87
- audio_id, mime_type = audio["id"], audio["mime_type"]
88
- audio_url = await messenger.query_media_url(audio_id)
89
- audio_filename = await messenger.download_media(audio_url, mime_type)
90
- logging.info(f"{mobile} sent audio {audio_filename}")
91
-
92
- elif message_type == "document":
93
- file = messenger.get_document(data)
94
- file_id, mime_type = file["id"], file["mime_type"]
95
- file_url = await messenger.query_media_url(file_id)
96
- file_filename = await messenger.download_media(file_url, mime_type)
97
- logging.info(f"{mobile} sent file {file_filename}")
98
- else:
99
- logging.info(f"{mobile} sent {message_type} ")
100
- logging.info(data)
101
- else:
102
- delivery = messenger.get_delivery(data)
103
- if delivery:
104
- logging.info(f"Message : {delivery}")
105
- else:
106
- logging.info("No new message")
107
- return "OK", 200
108
-
109
 
 
 
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
  if __name__ == "__main__":
113
- app.run(debug=True,host="0.0.0.0", port=7860)
 
 
 
 
 
1
  import os
2
  import logging
3
+ import requests
4
  from heyoo import WhatsApp
5
  from dotenv import load_dotenv
6
  from flask import Flask, request, make_response
 
8
  # Initialize Flask App
9
  app = Flask(__name__)
10
 
11
+ # Configure logging
12
+ logging.basicConfig(
13
+ level=logging.INFO,
14
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
15
+ )
16
+ logger = logging.getLogger(__name__)
17
+
18
  # Load .env file
19
  load_dotenv()
 
20
 
21
+ # Initialize WhatsApp with error handling
22
+ try:
23
+ messenger = WhatsApp(
24
+ os.environ.get("whatsapp_token"),
25
+ phone_number_id=os.environ.get("phone_number_id")
26
+ )
27
+ if not os.environ.get("whatsapp_token") or not os.environ.get("phone_number_id"):
28
+ raise ValueError("Missing required environment variables")
29
+ except Exception as e:
30
+ logger.error(f"Failed to initialize WhatsApp messenger: {str(e)}")
31
+ raise
32
 
33
  VERIFY_TOKEN = "30cca545-3838-48b2-80a7-9e43b1ae8ce4"
34
 
 
 
 
 
 
 
 
 
35
  @app.get("/")
36
  async def verify_token():
37
+ try:
38
+ if request.args.get("hub.verify_token") == VERIFY_TOKEN:
39
+ logger.info("Verified webhook")
40
+ response = make_response(request.args.get("hub.challenge"), 200)
41
+ response.mimetype = "text/plain"
42
+ return response
43
+ logger.error("Webhook Verification failed")
44
+ return "Invalid verification token"
45
+ except Exception as e:
46
+ logger.error(f"Error in verify_token: {str(e)}")
47
+ return "Internal server error", 500
48
 
49
  @app.post("/")
50
  async def hook():
51
+ try:
52
+ data = request.get_json()
53
+ logger.info("Received webhook data: %s", data)
54
+
55
+ changed_field = messenger.changed_field(data)
56
+ if changed_field != "messages":
57
+ return "OK", 200
58
+
59
+ if not messenger.is_message(data):
60
+ delivery = messenger.get_delivery(data)
61
+ if delivery:
62
+ logger.info(f"Message delivery status: {delivery}")
63
+ return "OK", 200
64
+
65
+ # Extract message details
66
+ mobile = messenger.get_mobile(data)
67
+ name = messenger.get_name(data)
68
+ message_type = messenger.get_message_type(data)
69
+
70
+ logger.info(f"New Message; sender:{mobile} name:{name} type:{message_type}")
71
+
72
+ # Handle different message types
73
+ try:
74
  if message_type == "text":
75
  message = messenger.get_message(data)
76
+ logger.info("Message: %s", message)
77
+ try:
78
+ await messenger.send_message(f"Hi {name}, nice to connect with you", mobile)
79
+ except requests.exceptions.ConnectionError as ce:
80
+ logger.error(f"Connection error while sending message: {str(ce)}")
81
+ # Implement retry logic here if needed
82
+ except Exception as e:
83
+ logger.error(f"Error sending message: {str(e)}")
84
 
85
  elif message_type == "interactive":
86
  message_response = messenger.get_interactive_response(data)
87
  interactive_type = message_response.get("type")
88
  message_id = message_response[interactive_type]["id"]
89
  message_text = message_response[interactive_type]["title"]
90
+ logger.info(f"Interactive Message; {message_id}: {message_text}")
91
 
92
  elif message_type == "location":
93
  message_location = messenger.get_location(data)
94
  message_latitude = message_location["latitude"]
95
  message_longitude = message_location["longitude"]
96
+ logger.info("Location: %s, %s", message_latitude, message_longitude)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
+ elif message_type in ["image", "video", "audio", "document"]:
99
+ await handle_media_message(messenger, data, message_type, mobile)
100
 
101
+ else:
102
+ logger.info(f"{mobile} sent unsupported message type: {message_type}")
103
+ logger.debug(f"Full message data: {data}")
104
+
105
+ except Exception as e:
106
+ logger.error(f"Error processing message type {message_type}: {str(e)}")
107
+ return "Internal server error", 500
108
+
109
+ return "OK", 200
110
+
111
+ except Exception as e:
112
+ logger.error(f"Error in webhook handler: {str(e)}")
113
+ return "Internal server error", 500
114
+
115
+ async def handle_media_message(messenger, data, message_type, mobile):
116
+ """Handle different types of media messages with error handling."""
117
+ try:
118
+ media_methods = {
119
+ "image": messenger.get_image,
120
+ "video": messenger.get_video,
121
+ "audio": messenger.get_audio,
122
+ "document": messenger.get_document
123
+ }
124
+
125
+ media = media_methods[message_type](data)
126
+ media_id, mime_type = media["id"], media["mime_type"]
127
+
128
+ try:
129
+ media_url = await messenger.query_media_url(media_id)
130
+ media_filename = await messenger.download_media(media_url, mime_type)
131
+ logger.info(f"{mobile} sent {message_type} {media_filename}")
132
+ except requests.exceptions.ConnectionError as ce:
133
+ logger.error(f"Connection error while downloading {message_type}: {str(ce)}")
134
+ except Exception as e:
135
+ logger.error(f"Error downloading {message_type}: {str(e)}")
136
+
137
+ except Exception as e:
138
+ logger.error(f"Error processing {message_type} message: {str(e)}")
139
+ raise
140
 
141
  if __name__ == "__main__":
142
+ try:
143
+ app.run(debug=True, host="0.0.0.0", port=7860)
144
+ except Exception as e:
145
+ logger.error(f"Failed to start Flask app: {str(e)}")