web-dev-qa-db-ja.com

Flask-askとngrokを使用したAlexaスキル開発

Pythonでフラスコアスクとngrokを使用して、Alexaのスキルの開発を開始しようとしています。以下は私のコードです:

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 __name__ == '__main__':
    app.run(debug=True)

私のマシンではコードが正常に実行され、印刷すると正しい出力が返されます。しかし、ngrokを使用してAmazonにデプロイすると、スキルによりHTTP 500内部エラーが発生します。テキストと開発コンソールのjsonシミュレーターの両方で同じ500内部エラーが発生します。

これは私の意図したスキーマです:

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

pythonプロンプトで次のエラーが表示されます:AttributeError: module 'lib' has no attribute 'X509V3_EXT_get

スタックトレースは次のとおりです。

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'

ピップフリーズ出力:

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

python 2.7とpython 3.6。

9
RogerThat

同じ問題が発生した場合は、暗号を2.2未満にダウングレードして修正できます。

pip install 'cryptography<2.2'

rpg711はすべてのクレジットを取得します(元の投稿のコメントを参照)

21
voglster

Python 3.7およびMac OS High Sierraの2.5または2.6ではなく、暗号化2.1.4でこれが機能することを確認できます。ただし、Mac OSでは最初に解決する必要がある他の問題があります。

私が見つけたのは、crypotgraphy 2.1.4のインストールがエラー(以下)で終了することです。私は、フラスコアスクプロジェクトの開始時にこのエラーに遭遇し、コーディングを開始する前に要件を手動でインストールする必要がありました。私がついにAlexaを試し始めたとき、暗号化2.5または2.6で同じ500エラー(上記と同じ)が発生しました。したがって、それが2.1.4でなければならないことを読んで、その特定のバージョンをインストールしようとすると、常にこのエラーが発生しました。

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

多くのことを試した後、私はこの投稿( https://github.com/pyca/cryptography/issues/3489 )で特定の推奨事項を試しました。エクスポートCPPFLAGSおよびLDFLAGSを試してもうまくいかなかったようですが、次のようになりました

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"

以前に試したもの、つまりbopen link opensslとCPPFLAGSとLDFLAGSの設定が最終結果に影響を与えたかどうかはわかりません。ただし、投稿のようにopensslの更新は行いませんでした。それが役に立てば幸いですが、私は知識の立場から操作しておらず、ポストにさらに示されているようにopsensslの手動インストールを実行するスキルがあるかどうか確信が持てませんでした。

私はほとんどあきらめたので、これが役に立てば幸いです。

ところで:ngrokのウェブインターフェース/インスペクターを使用すると本当に便利です。つまり、Amazonのリクエストを何度も繰り返し再生できることは、暗号化の問題の前に他のエラーを犯したため、非常に便利でした。

1
Simon F

このリンクを参照すると、問題を解決するのに役立ちました。 https://github.com/pyca/cryptography/issues/3489

基本的に、opensslをMacで$ brew link opensslでリンクし、cryptography == 2.1.4をインストールすることで、問題は解決しました。

0
Shivam Kohli