def sendSMS(name, phoneNo):
    account_sid = 'account_id'
    auth_token = 'token'
    client = Client(account_sid, auth_token)
    for i in range(len(name)):
        client.create(
            body='Good morning ' + name[i] +
            ' hope you are well.This is a kind reminder that your contract is '
            'expirying within next 7 days make sure you renew it before it expires',
            from_='+18303650760',
            to='+' + phoneNo[i])
Exemple #2
0
class SMS:
    """ Send SMS using Twilio. """
    def __init__(self):
        self.account_sid = os.environ["TWILIO_ACCOUNT_SID"]
        self.auth_token = os.environ["TWILIO_AUTH_TOKEN"]
        self.messaging_service_sid = os.environ["MESSAGING_SERVICE_SID"]
        self.to = os.environ["PHONE_NUMBER"]
        self.message = Client(self.account_sid, self.auth_token).messages

    def send_message(self, latitude, longitude):
        message = self.message.create(
            messaging_service_sid=self.messaging_service_sid,
            body=f"It works!!!\n{latitude}\n{longitude}",
            to=self.to,
        )
class RedisMatching:
    def __init__(self, config):
        self.db = Redis(host=config['host'],
                        port=config['port'],
                        db=config['db'],
                        decode_responses=True)
        self.msg_client = Client(config['account_sid'],
                                 config['auth_token']).messages
        self.msg_sender = config['sender']

    def set_userdata(self, user_data):
        user_data['timestamp'] = int(time())
        return self.db.hmset(user_data['phone_numb'], user_data)

    def get_userdata(self, user_name):
        return self.db.hgetall(user_name)

    def get_all_user(self):
        return self.db.keys()

    def remove_userdata(self, user_name):
        return self.db.delete(user_name)

    def send_message(self, phone_numb, message):
        phone_numb = '+82' + phone_numb[1:]
        result = self.msg_client.create(to=phone_numb,
                                        from_=self.msg_sender,
                                        body=message)
        return result

    def initialize(self):
        for key in self.get_all_user():
            self.db.delete(key)

    def match_user(self):
        def make_food_vector(user_data):
            food_vector = [
                int(user_data['cutlet']),
                int(user_data['hamburger']),
                int(user_data['noodle']),
                int(user_data['korean_food'])
            ]
            return food_vector

        def make_message_text(target_name, user_data, similarity=0):
            if user_data['gender'] == 'male': user_data['gender'] = '남'
            elif user_data['gender'] == 'female': user_data['gender'] = '여'
            text ='%s님, 혼밥러 매칭완료!\n\n상대 : %s님\n연락처 : %s\n성별 : %s\n유사도 : %0.2f' \
                    %(target_name, user_data['user_name']
                        , user_data['phone_numb'], user_data['gender']
                        , similarity*100)
            return text

        while (len(self.get_all_user()) >= 2):
            user_list = self.get_all_user()
            user_data_list = list(map(self.get_userdata, user_list))
            user_data_list = [[user_data['timestamp'], user_data]
                              for user_data in user_data_list]
            user_data_list = [
                user_data[1] for user_data in sorted(user_data_list)
            ]
            print(user_data_list)

            target_user = user_data_list[0]
            target_vec = make_food_vector(target_user)

            similarity_list = []
            for user_data in user_data_list[1:]:
                user_vec = make_food_vector(user_data)
                similarity = RedisMatching.cosine_similarity(
                    target_vec, user_vec)
                similarity_list.append((similarity, user_data))

            max_val = max(similarity_list)
            print(max_val)
            text = make_message_text(target_user['user_name'], max_val[1],
                                     max_val[0])
            self.send_message(target_user['phone_numb'], text)
            print(text)
            text = make_message_text(max_val[1]['user_name'], target_user,
                                     max_val[0])
            self.send_message(max_val[1]['phone_numb'], text)
            print(text)

            # self.remove_userdata(target_user['phone_numb'])
            # self.remove_userdata(max_val[1]['phone_numb'])

            return True

    @staticmethod
    def cvt_unit_vec(vector):
        scalar = math.sqrt(sum([i * i for i in vector]))
        return [idx / scalar for idx in vector]

    @staticmethod
    def cosine_similarity(a, b):
        a = RedisMatching.cvt_unit_vec(a)
        b = RedisMatching.cvt_unit_vec(b)
        return sum([i * j for i, j in zip(a, b)])

    @staticmethod
    def custom_similarity(a, b):
        # a = RedisMatching.cvt_unit_vec(a)
        # b = RedisMatching.cvt_unit_vec(b)
        c = [i - j for i, j in zip(a, b)]
        c = [i * i for i in c]
        return 300 - math.sqrt(sum(c))
class RedisMatching:
    def __init__(self, config):
        self.db = Redis(host=config['host'], port=config['port'], db=config['db'], decode_responses=True)
        self.msg_client = Client(config['account_sid'], config['auth_token']).messages
        self.msg_sender = config['sender']

    def set_userdata(self, user_data):
        user_data['timestamp'] = int(time())
        return self.db.hmset(user_data['phone_numb'], user_data)

    def get_userdata(self, user_name):
        return self.db.hgetall(user_name)

    def get_all_user(self):
        return self.db.keys()

    def remove_userdata(self, user_name):
        return self.db.delete(user_name)

    def send_message(self, phone_numb, message):
        phone_numb = '+82'+phone_numb[1:]
        result = self.msg_client.create(to=phone_numb,
                                        from_=self.msg_sender,
                                        body=message
                                        )
        return result

    def initialize(self):
        for key in self.get_all_user():
            self.db.delete(key)

    def match_user(self):
        def make_food_vector(user_data):
            food_vector = [ int(user_data['cutlet']),
                            int(user_data['hamburger']),
                            int(user_data['noodle']),
                            int(user_data['korean_food']) ]
            return food_vector
        def make_message_text(target_name, user_data, similarity=0):
            if user_data['gender'] == 'male' : user_data['gender'] = '남'
            elif user_data['gender'] == 'female' : user_data['gender'] = '여'
            text ='%s님, 혼밥러 매칭완료!\n\n상대 : %s님\n연락처 : %s\n성별 : %s\n유사도 : %0.2f' \
                    %(target_name, user_data['user_name']
                        , user_data['phone_numb'], user_data['gender']
                        , similarity*100)
            return text

        while(len(self.get_all_user()) >= 2):
            user_list = self.get_all_user()
            user_data_list = list(map(self.get_userdata, user_list))
            user_data_list = [[user_data['timestamp'], user_data] for user_data in user_data_list]
            user_data_list = [user_data[1] for user_data in sorted(user_data_list)]
            print(user_data_list)

            target_user = user_data_list[0]
            target_vec = make_food_vector(target_user)

            similarity_list = []
            for user_data in user_data_list[1:]:
                user_vec = make_food_vector(user_data)
                similarity = RedisMatching.cosine_similarity(target_vec, user_vec)
                similarity_list.append( (similarity, user_data) )

            max_val = max(similarity_list)
            print(max_val)
            text = make_message_text(target_user['user_name'], max_val[1], max_val[0])
            self.send_message(target_user['phone_numb'], text)
            print(text)
            text = make_message_text(max_val[1]['user_name'], target_user, max_val[0])
            self.send_message(max_val[1]['phone_numb'], text)
            print(text)

            # self.remove_userdata(target_user['phone_numb'])
            # self.remove_userdata(max_val[1]['phone_numb'])

            return True

    @staticmethod
    def cvt_unit_vec(vector):
        scalar =  math.sqrt(sum([i*i for i in vector]))
        return [idx/scalar for idx in vector]

    @staticmethod
    def cosine_similarity(a, b):
        a = RedisMatching.cvt_unit_vec(a)
        b = RedisMatching.cvt_unit_vec(b)
        return sum([i*j for i,j in zip(a, b)])

    @staticmethod
    def custom_similarity(a, b):
        # a = RedisMatching.cvt_unit_vec(a)
        # b = RedisMatching.cvt_unit_vec(b)
        c = [i-j for i,j in zip(a, b)]
        c = [i*i for i in c]
        return 300 - math.sqrt(sum(c))