web-dev-qa-db-fra.com

Développement des compétences Alexa avec flask-ask et ngrok

J'essaie de commencer à développer une compétence pour Alexa en utilisant flask-ask et ngrok en python. Voici mon code:

from flask import Flask
from flask_ask import Ask, statement, question, session
import json
import requests
import time
import unidecode

app = Flask(__name__)
ask = Ask(app, "/reddit_reader")

def get_headlines():

    titles = 'is this working'
    return titles  

@app.route('/')
def homepage():
    return "hi there, how ya doin?"

@ask.launch
def start_skill():
    welcome_message = 'Hello there, would you like the news?'
    return question(welcome_message)

@ask.intent("YesIntent")
def share_headlines():
    headlines = get_headlines()
    headline_msg = 'The current world news headlines are 
{}'.format(headlines)
    return statement(headline_msg)

@ask.intent("NoIntent")
def no_intent():
    bye_text = 'I am not sure why you asked me to run then, but okay... bye'
    return statement(bye_text)

if __== '__main__':
    app.run(debug=True)

Le code fonctionne correctement sur ma machine et renvoie la sortie correcte si je l’imprime. Mais la compétence génère une erreur interne HTTP 500 lorsque je la déploie sur Amazon avec ngrok. Je reçois la même erreur interne 500 dans le texte que dans le simulateur JSON dans la console de développement.

Ceci est mon schéma d'intention:

{
  "intents": [
    {
      "intent": "YesIntent"
    },
    {
      "intent": "NoIntent"
    }
  ]
}

Je reçois l'erreur suivante dans mon invite python: AttributeError: module 'lib' has no attribute 'X509V3_EXT_get

Le stacktrace est comme suit:

Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\flask\app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Python36\lib\site-packages\flask\app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Python36\lib\site-packages\flask\app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Python36\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Python36\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Python36\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Python36\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Python36\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Python36\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Python36\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Python36\lib\site-packages\flask_ask\core.py", line 728, in _flask_view_func
    ask_payload = self._Alexa_request(verify=self.ask_verify_requests)
  File "C:\Python36\lib\site-packages\flask_ask\core.py", line 662, in _Alexa_request
    cert = verifier.load_certificate(cert_url)
  File "C:\Python36\lib\site-packages\flask_ask\verifier.py", line 21, in load_certificate
    if not _valid_certificate(cert):
  File "C:\Python36\lib\site-packages\flask_ask\verifier.py", line 63, in _valid_certificate
    value = str(extension)
  File "C:\Python36\lib\site-packages\OpenSSL\crypto.py", line 779, in __str__
    return self._subjectAltNameString()
  File "C:\Python36\lib\site-packages\OpenSSL\crypto.py", line 740, in _subjectAltNameString
    method = _lib.X509V3_EXT_get(self._extension)
AttributeError: module 'lib' has no attribute 'X509V3_EXT_get'

Pip gel sortie:

aniso8601==1.2.0
asn1crypto==0.24.0
certifi==2018.1.18
cffi==1.11.5
chardet==3.0.4
click==6.7
cryptography==2.2
Flask==0.12.1
Flask-Ask==0.9.8
idna==2.6
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
pycparser==2.18
pyOpenSSL==17.0.0
python-dateutil==2.7.0
PyYAML==3.12
requests==2.18.4
six==1.11.0
Unidecode==1.0.22
urllib3==1.22
Werkzeug==0.14.1

J'ai essayé de l'exécuter sur Python 2.7 et Python 3.6. Toute aide est appréciée

9
RogerThat

Courant dans le même problème, vous pouvez le résoudre en réduisant la cryptographie à moins de 2,2 pour moi.

pip install 'cryptography<2.2'

rpg711 obtient tout le crédit (voir les commentaires sur le post original)

20
voglster

Je peux confirmer que cela fonctionne avec la cryptographie 2.1.4, pas avec la 2.5 ou la 2.6 sur Python 3.7 et Mac OS High Sierra. Cependant, sous Mac OS, il y a d'autres problèmes à régler en premier. 

Ce que j'ai trouvé est que l'installation de la cryptographie 2.1.4 se termine par une erreur (comme ci-dessous). J'ai rencontré cette erreur au tout début de mon projet flask-ask et je devais faire une installation manuelle des exigences avant de commencer à coder. Quand j'ai finalement commencé à essayer Alexa, j'ai eu la même erreur 500 (comme ci-dessus) avec la cryptographie 2.5 ou 2.6. Donc, en lisant qu'il doit s'agir de 2.1.4, j'ai toujours cette erreur en essayant d'installer cette version spécifique:

    #include <openssl/opensslv.h>
             ^~~~~~~~~~~~~~~~~~~~
    1 error generated.
    error: command 'clang' failed with exit status 1

Après avoir essayé beaucoup de choses, j’ai essayé la recommandation spécifique de ce post ( https://github.com/pyca/cryptography/issues/3489 ). L'exportation des fichiers CPPFLAGS et LDFLAGS ne semble pas fonctionner, mais les éléments suivants

pip3 install cryptography==2.1.4 --global-option=build_ext --global-option="-L/usr/local/opt/openssl/lib" --global-option="-I/usr/local/opt/openssl/include"

Je crains de ne pas pouvoir dire si les choses que j’ai essayées auparavant, c’est-à-dire brasser le lien, ouvrent et que régler CPPFLAGS et LDFLAGS a eu un impact sur le résultat final. Je n'ai toutefois pas mis à jour OpenSL comme dans le post. J'espère que cela aide, mais je ne travaillais pas à partir d'une position de connaissance et je n'étais pas sûr d'avoir les compétences nécessaires pour effectuer une installation manuelle de opsenssl, comme indiqué plus loin dans le message.

J'espère que cela aide car j'avais presque abandonné.

BTW: en utilisant l'interface/inspecteur web de ngrok, j'ai trouvé cela très pratique, c'est-à-dire qu'il était possible de rejouer la demande Amazon à maintes reprises, ce qui était très pratique pour moi, car je faisais d'autres erreurs avant le problème de cryptographie.

0
Simon F