Как отправить смс-ответ Twilio с выводом смайлов

Я создал игру-викторину на Python, которая работает с API Twilio, поэтому я могу запустить игру через sms на свой номер Twilio. Я пытаюсь понять, как передать ответ, в котором будут отображаться стандартный текст и смайлы, когда он будет получен отправляющим телефоном.

Я работал над пониманием набора символов Unicode и ascii, а также кодирования и декодирования в utf-8. Где я последний раз приземлялся, это следующий код, который просто распечатывает кодовую точку Unicode как обычную строку на мобильном телефоне. Кажется, что пробел заключается в том, как изолировать и передать кодовую точку, которую телефон может интерпретировать. Есть идеи или советы о том, как это сделать? Или кто-то порекомендует другой подход?

Текущее состояние кода следующее:

# -*- coding: utf-8 -*-

from flask import render_template, flash, redirect, session, url_for, request, jsonify, g
from flask import Response
from app import app
from config import TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN
from twilio import twiml
from twilio.rest import TwilioRestClient
import re, random

client = TwilioRestClient(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)


def simplify_txt(submitted_txt):
    response_letters = re.sub(r'\W+', '', submitted_txt)
    return response_letters.lower()

@app.route("/quiz_game")
def quiz_game():

   response = twiml.Response()

    from_number = str(request.values.get('From', None))
    body = request.values.get('Body', None)
    simplify_body = simplify_txt(body)

    questions = { 
            0: "What word is shorter when you add two letters to it?",
            1: "If I drink, I die. If i eat, I am fine. What am I?",
            2: "What kind of tree is carried in your hand?",
            3: "Thanks for playing.",
            4: ""
    }

    # Stripped down answers to compare to text in case multiple word answer
    simplify_answers = { 
            1:"short", 
            2:"fire", 
            3:"palm",
            4:""
            }

    # Pretty print answers
    print_answers = { 
            1:"short", 
            2:"fire", 
            3:"palm",
            4:""
            }

    # if from_number not in track_user:
    if from_number not in session:
        session[from_number] = 0
        counter = session.get('counter', 0)
        counter += 1
        session['counter'] = counter
        message = "Shall we play a game? %s "  % questions[0]
    else:
        game_round = session['counter']

        if simplify_answers[game_round] == simplify_body:
            session[from_number] += 10
            score = session[from_number]

            message = "Correct Answer. You have %d points out of 30. %s" % (score, questions[game_round])

            message += unicode('u1f31f',"unicode_escape").encode('utf-8') 

        else:
            score = session[from_number]
            message = "Wrong answer. We were looking for %s. Your score is %d out of 30. %s" % (print_answers[game_round], score, questions[game_round])

        session['counter'] += 1


    if session['counter'] > 3:
        session.pop(from_number, None)
        session['counter'] = 0


    response.sms(message)

    return Response(str(response))

ОБНОВЛЕНИЕ: часть проблемы заключалась в применении метода sms к переменной сообщения, который превратил ее в формат XML, который не сохранил кодовую точку Unicode. Применение метода messages.create захватило и сохранило кодовую точку Unicode, чтобы ее могло интерпретировать мобильное устройство.

Для исправления я применил рекомендацию Роба в первую очередь к последним двум строкам кода, заменив response.sms и return на client.messages.create и передав переменную сообщения в параметр body. Я также применил u для юникода ко всем строкам, назначенным переменной сообщения, а также добавил кодовые точки / изображения эмодзи к сообщениям. Это заставило работать текстовые смайлы. Если вы хотите увидеть обновление, проверьте: https://github.com/nyghtowl/Twilio_Quiz


person nyghtowl    schedule 13.10.2013    source источник


Ответы (1)


Отличный вопрос о том, как отправлять эмодзи с помощью модуля Twilio Python. Также люблю ссылку на Wargames. Думаю, я знаю, что здесь происходит.

Значение Unicode для символа светящейся звезды - U + 1F31F, которое представлено как литерал Unicode Python - u"\U0001F31F". Без знака «плюс» это на самом деле другой код, а не смайлик со светящейся звездой.

Итак, чтобы отправить этот конкретный пример, вы должны сделать что-то вроде:

from twilio.rest import TwilioRestClient

# Set Twilio credentials
TWILIO_ACCOUNT_SID = "ACxxxxxxxxxxxxx"
TWILIO_AUTH_TOKEN = "yyyyyyyyyyyyyyyy"
TWILIO_NUMBER = "+15558675309"

# Instantiate Twilio REST client
client = TwilioRestClient(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)

# Send a glowing star emoji
client.messages.create(from_=TWILIO_NUMBER, to="+15556667777", body=u"Here is your tasty emoji: \U0001F31F")

Надеюсь, это поможет!

person Rob Spectre    schedule 08.11.2013
comment
Это полностью помогло. Спасибо. - person nyghtowl; 09.11.2013
comment
этот сайт помог мне с escape-кодами charbase.com/1f431-unicode-cat-face < / а> - person Ryan Loggerythm; 22.03.2019