leogomezz4t / PyTextNow_API

Python texting API utilizing TextNow API
MIT License
67 stars 41 forks source link

Fix for media files errors on message #60

Closed levelKro closed 2 years ago

levelKro commented 2 years ago

Problem

When an mp3 or other media not an image is in messages list, this cause critical error;

Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "C:\Users\level\AppData\Roaming\Python\Python39\site-packages\pytextnow\TNAPI.py", line 91, in on_exit
    unread_msgs = self.get_unread_messages()
  File "C:\Users\level\AppData\Roaming\Python\Python39\site-packages\pytextnow\TNAPI.py", line 186, in get_unread_messages
    new_messages = self.get_received_messages()
  File "C:\Users\level\AppData\Roaming\Python\Python39\site-packages\pytextnow\TNAPI.py", line 177, in get_received_messages
    messages = self.get_messages()
  File "C:\Users\level\AppData\Roaming\Python\Python39\site-packages\pytextnow\TNAPI.py", line 145, in get_messages
    messages = [
  File "C:\Users\level\AppData\Roaming\Python\Python39\site-packages\pytextnow\TNAPI.py", line 146, in <listcomp>
    Message(msg, self) if not msg["message"].startswith("http") else MultiMediaMessage(msg, self)
  File "C:\Users\level\AppData\Roaming\Python\Python39\site-packages\pytextnow\multi_media_message.py", line 12, in __init__
    try:
  File "C:\Program Files\Python39\lib\site-packages\requests\structures.py", line 54, in __getitem__
    return self._store[key.lower()][1]
KeyError: 'content-type'

Solution

In file pytextnow/multi_media_message.py Replace

self.content_type = file_req.headers["Content-Type"]
self.extension = self.content_type.split("/")[1]

By this code

try:
    self.content_type = file_req.headers["Content-Type"]
    self.extension = self.content_type.split("/")[1]
except:
    pass
levelKro commented 2 years ago

After few tests, i conclude this module was a big problem.

My new file look like that, is not the best, but solve this problems;

from pytextnow.message import Message
import requests

from datetime import datetime
from dateutil.relativedelta import relativedelta
from urllib.parse import quote
import mimetypes
import json
import time

MESSAGE_TYPE = 0

MULTIMEDIA_MESSAGE_TYPE = 1

class MultiMediaMessage(Message):
    def __init__(self, msg_obj, outer_self):
        super().__init__(msg_obj, outer_self)
        try:
            file_req = requests.get(self.content)
            self.raw_data = file_req.content
            self.content_type = file_req.headers["Content-Type"]
            self.extension = self.content_type.split("/")[1]
            self.type = MULTIMEDIA_MESSAGE_TYPE
            self.self = outer_self
        except:
            self.content = msg_obj["message"]
            self.number = msg_obj["contact_value"]
            self.date = datetime.fromisoformat(msg_obj["date"].replace("Z", "+00:00"))
            self.first_contact = msg_obj["conversation_filtering"]["first_time_contact"]
            self.type = MESSAGE_TYPE
            self.read = msg_obj["read"]
            self.id = msg_obj["id"]
            self.direction = msg_obj["message_direction"]
            self.raw = msg_obj
            self.self = outer_self

    def mv(self, file_path=None):
        if not file_path:
            file_path = f"./file.{self.extension}"
        with open(file_path, mode="wb") as f:
            f.write(self.raw_data)

I suggest to edit for when is in Bot mode, ignoring mms, and leave this like a sms, with this way, the bot can see the message and working with them.