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..
の部分のコメントアウト外しただけなんだけどなー