GAEでInvalidURLError

pythongaeflask
TwitterBotでマルコフ連鎖でもやるかーと思って作った。ローカル環境は正しく動くのにGAEに上げてURL叩いてもエラー吐く。原因もわからない。なんでだろ。

exception InvalidURLError()
要求の URL が有効な URL ではないか、サポートされていないメソッドを使用しています。サポートされているのは http と https URL のみです。

へぇ。

GAE上のエラー

E 10-08 12:39AM 08.344
Traceback (most recent call last):
E 10-08 12:39AM 08.344
File "/base/python_runtime/python_dist/lib/python2.5/wsgiref/handlers.py", line 92, in run
E 10-08 12:39AM 08.345
self.result = application(self.environ, self.start_response)
E 10-08 12:39AM 08.345
File "/base/data/home/apps/funya/2.345348482295564051/flask.py", line 644, in __call__
E 10-08 12:39AM 08.345
return self.wsgi_app(environ, start_response)
E 10-08 12:39AM 08.346
File "/base/data/home/apps/funya/2.345348482295564051/werkzeug/wsgi.py", line 406, in __call__
E 10-08 12:39AM 08.346
return self.app(environ, start_response)
E 10-08 12:39AM 08.347
File "/base/data/home/apps/funya/2.345348482295564051/flask.py", line 610, in wsgi_app
E 10-08 12:39AM 08.347
rv = self.dispatch_request()
E 10-08 12:39AM 08.348
File "/base/data/home/apps/funya/2.345348482295564051/flask.py", line 529, in dispatch_request
E 10-08 12:39AM 08.348
return self.view_functions[endpoint](**values)
E 10-08 12:39AM 08.348
File "/base/data/home/apps/funya/2.345348482295564051/application.py", line 88, in twi_markov
E 10-08 12:39AM 08.348
context = markov(morph(sentence = context))
E 10-08 12:39AM 08.350
File "/base/data/home/apps/funya/2.345348482295564051/markov.py", line 15, in morph
E 10-08 12:39AM 08.351
c = urlfetch.fetch(urllib.unquote(query),deadline=10)
E 10-08 12:39AM 08.351
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 241, in fetch
E 10-08 12:39AM 08.352
return rpc.get_result()
E 10-08 12:39AM 08.352
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 501, in get_result
E 10-08 12:39AM 08.352
return self.__get_result_hook(self)
E 10-08 12:39AM 08.352
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 319, in _get_fetch_result
E 10-08 12:39AM 08.353
raise InvalidURLError(str(err))
E 10-08 12:39AM 08.353
InvalidURLError: ApplicationError: 1

markov.py

# coding:utf-8
import urllib,urllib2
from BeautifulSoup import BeautifulSoup
import random
from google.appengine.api import urlfetch 

appid = "登録したID"
pageurl = "http://jlp.yahooapis.jp/MAService/V1/parse"

def morph(sentence = None, appid=appid, results="ma", app_filter="1|2|3|4|5|6|7|8|9|10|11|12|13"):
    ret = {}
    sentence = urllib.quote_plus(sentence.encode('utf-8'))
    query = "%s?appid=%s&results=%s&filter=%s&sentence=%s" % (pageurl, appid, results, app_filter, sentence)
    #c = urllib2.urlopen(query)
    c = urlfetch.fetch(urllib.unquote(query),deadline=10)
    soup = BeautifulSoup(c.read())
    surfaces = []
    for w in soup.ma_result.word_list:
        surfaces.append(w.surface.string)
    return surfaces

def markov(word_list=None):
    MAXGEN = 15
    nonword = "\n"
    w1 = w2 = nonword
    markov = {}
    content = ""
    for word in word_list:
        if not markov.has_key((w1,w2)):
            markov[(w1,w2)] = []
        markov[(w1,w2)].append(word)
        w1,w2 = w2,word
    if not markov.has_key((w1,w2)):
        markov[(w1,w2)] = []

    markov[(w1,w2)].append(nonword)
    w1 = w2 = nonword
    for i in range(MAXGEN):
        suf = markov[(w1,w2)]
        r = random.randint(0,len(suf) - 1)
        t = suf[r]
        if t == nonword:
            break
        content = content + t
        w1,w2 = w2,t
    return content

if __name__=='__main__':
    sentence = u'日本語入力テスト'
    surfaces = morph(sentence,appid=appid)
    for word in surfaces:
        print word

application.py

#coding: utf-8
from flask import Flask
app = Flask(__name__)
app.debug = True

from google.appengine.ext import db
from google.appengine.api import urlfetch

from flask import redirect, url_for, request, render_template, abort, flash, get_flashed_messages
import tweepy
import random
from markov import markov , morph

CONSUMER_KEY = '登録したの'
CONSUMER_SECRET = '登録したの'
TOKEN_KEY = '登録したの'
TOKEN_SECRET = '登録したの'

class Contexts(db.Model):
    context = db.StringProperty()

@app.route('/')
def index():
    return 'Hello'

@app.route('/post_form/')
def post_form(context=None):
    return render_template('form.html')

@app.route('/post_update/',methods=['GET','POST'])
def post_update():
    if request.method == 'POST':
        context = request.form['context']
        update(context)
        return redirect(url_for('post_form'))
    return 'Sample'

@app.route('/rnd_update/')
def rnd_update():
    query = Contexts.all()
    results = query.fetch(1000)
    result = results[random.randint(0,len(results)-1)]
    update(result.context)
    return result.context

@app.route('/insert_form/',methods=['GET','POST'])
def insert_form(context = None):
    if request.method == 'POST':
        context_str = request.form['context']
        cont = Contexts(context=context_str)
        db.put(cont)
    else:
        pass
    return render_template('insert_form.html')

@app.route('/update/')
def update(context = None,consumer_key = CONSUMER_KEY, \
    consumer_secret = CONSUMER_SECRET,token_key = TOKEN_KEY, token_secret = TOKEN_SECRET):
    if context != None:
        context = context.encode('utf-8')
        auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
        auth.set_access_token(token_key,token_secret)
        api = tweepy.API(auth)
        api.update_status(context)
        return True
    return False

def get_API(consumer_key = CONSUMER_KEY,consumer_secret=CONSUMER_SECRET,\
    token_key = TOKEN_KEY,token_secret = TOKEN_SECRET):
    api = None
    auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
    auth.set_access_token(token_key,token_secret)
    api = tweepy.API(auth)
    return api

@app.route('/markov/')
def twi_markov(context = None):
    api = get_API()
    timeline = api.friends_timeline(count=5)
    context = timeline[random.randint(0,len(timeline) -1 )].text
    for tweet in timeline:
        context = context + tweet.text
    context = markov(morph(sentence = context))
    context.replace('@',' ')
    #update(context = context)
    return context
    

# set the secret key.  keep this really secret:
app.secret_key = 'キー'

if __name__ == '__main__':
    app.run()
  • 追記

よくわかんないけど今もう一回上げなおしたら動いた。とりあえずcronまわしてしばらく様子見。application.pyの

#update..

の部分のコメントアウト外しただけなんだけどなー