google app engine python でリダイレクトのあるURLへログインする。

あけましておめでとうございます!

2017年末から2018年始にかけて、なやみ続けたログイン問題が解決できたので、書いてみる。
スクレイピングの場合でも使えそうな感じよ!
(GAEは、無料なのにあんまり使われてないな~ 上手くいかない時に情報が少なくて困る。)

・やりたいこと
 google app engine pythonで、???証券にログインして、自動売買させる。
・できなかったこと
 ログインができない。
・分かったこと
 リダイレクトしてる。
 リダイレクトしてる場合は、クッキーがうまく取得できない。
 だから、,follow_redirects=Falseをurlfetch.fetchに追加して、一旦クッキーだけもらう。
 次のurlfetch.fetchで、リダイレクト先のURLへクッキー付きでアクセスする。

#!/usr/bin/env python
# coding: UTF-8
#  http://www.apache.org/licenses/LICENSE-2.0

import webapp2
import Cookie
import urllib
from google.appengine.api import urlfetch

#http://qiita.com/amedama/items/b856b2f30c2f38665701
from logging import getLogger,StreamHandler,DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)

id1 = "????"
pass1 = "????"
guid1 = "12345"


class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write('Hello, World!')

class Login(webapp2.RequestHandler):
	def createCookieHeader(self, cookie):
		cookieHeader = ""
		for value in cookie.values():
			cookieHeader += "%s=%s; " % (value.key, value.value)
		return cookieHeader

	def get(self):
		#ログオン時のクッキー取得で苦労した。
		#???証券は、ログオンURLがリダイレクトされる
		#リダイレクトされないように、urlfetch.fetchに、,follow_redirects=Falseを入れて、一旦cookieだけをもらう!(ココがみそ!)
		#↑でcookieを取得完了!
		#次にURLをリダイレクト先に変更して、cookie付き、,follow_redirects=Falseなしでアクセスしたら、OK
		
		USERAGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
		form_fields = {"ID": id1, "PASS": pass1, "GUID": guid1}
		
		#ログイン
		url_base = "https://????.co.jp"
		url = url_base + "/web/pc/Home/Login"
		self.cookie = Cookie.SimpleCookie() #create the cookie
		form_data = urllib.urlencode(form_fields)
		result = urlfetch.fetch(url=url,payload=form_data,method=urlfetch.POST,headers={'Cookie': self.createCookieHeader(self.cookie),'User-agent':USERAGENT},follow_redirects=False)
		cookie = result.headers.get('set-cookie', '')
		logger.debug("--[Only] get cookie")
		logger.debug("--login /web/pc/Home/Login [,follow_redirects=False]")
		logger.debug("--login url " + url)
		logger.debug("--result.status_code")
		logger.debug(result.status_code)
		logger.debug("--result.headers")
		logger.debug(result.headers)
		url_base = "https://????.co.jp"
		url = url_base + "/web/pc/Home"
		result = urlfetch.fetch(url=url,payload=form_data,method=urlfetch.POST,headers={'Cookie':cookie,'User-agent':USERAGENT})
		logger.debug("--use cookie and change url")
		logger.debug("--login /web/pc/Home")
		logger.debug("--login url " + url)
		logger.debug("--result.status_code")
		logger.debug(result.status_code)
		logger.debug("--result.headers")
		logger.debug(result.headers)
		self.response.write("result.content")
		self.response.write(result.content)#.decode('shift-jis'))


app = webapp2.WSGIApplication([
  ('/'      , MainPage),
  ('/login' , Login),
], debug=True)