<Python, PyAutoGui, Selenium> 認証ウインドを乗り越える、、

ブラウザBrowserが出す認証ウインドAuthentication Requiredを通過する技。
ググるとこのウインドは、ブラウザが出すもので、Seleniumで制御できないっぽい。

ということで、PyAutoGuiで対応したっす。

ブラウザを画面いっぱいにして、
真ん中に現れる認証ウインドをクリック、
そして、タブで入力箇所を移動して、
IDとパスを入れる。
その後は、Seleniumに制御を戻す。

from selenium import webdriver
import pyautogui as pa

d = webdriver.Firefox()
d.maximize_window()

url = 'hoge.hoge.com'

w, h = pa.size()
pa.moveTo(x=w / 2, y=h / 2, duration=0.0)

#Open Browser 
d.get('')
time.sleep(2)

#Click Browser and Select URL entry
pa.click(x=w / 2, y=h / 2, clicks=2, button="left")
pa.press(keys="tab", presses=2)

#Input URL and Return "Enter" key
pa.typewrite(url, interval=0.0)
pa.press(keys="enter", presses=1)
time.sleep(2)

#Select Authentication Required popup window and enter user_id/password
pa.click(x=w / 2, y=h / 2, clicks=2, button="left")
pa.press(keys="tab", presses=4)
pa.typewrite('USER', interval=0.0)
pa.press(keys="tab", presses=1)
pa.typewrite('PASSWORD', interval=0.0)
pa.press(keys="enter", presses=1)
time.sleep(5)

#Get Target Page object by Selenium
url = 'http://hoge.hoge.com/hage/hagex/'
d.get(url)

ぼちぼち動いた。

<PyAutoGUI, Python> オートメーション

オートメーションautomation、、つまり、マウス、キーボードの自動操作。
PyAutoGUIでできる。

インストールした。

>pip install python3-xlib
>pip install pyautogui

マニュアル。
Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation

参考。
whitecat-student.hatenablog.com

<Python, BeautifulSoup> HTML属性をゲット

BeautifulSoupで、HTML属性attributeをげっちゅうする技。

こんなhtmlテキストがあったとして、、

In [1]: from bs4 import BeautifulSoup

In [2]: html = '''
   ...: <d>
   ...:   <name>Hage</name>
   ...:   <qty>10</qty>
   ...: </d>
   ...: <d>
   ...:   <name>Hige</name>
   ...:   <qty>20</qty>
   ...: </d>
   ...: <d>
   ...:   <name>Hoge</name>
   ...:   <qty>12</qty>
   ...: </d>
   ...: <d>
   ...:   <name>Haga</name>
   ...:   <qty hage='pikapika' hige='boubou'>15</qty>
   ...: </d>
   ...: '''

.findAll()<d>タグを抽出。

In [3]: BeautifulSoup(html, 'lxml').findAll('d')
Out[3]: 
[<d>
 <name>Hage</name>
 <qty>10</qty>
 </d>, <d>
 <name>Hige</name>
 <qty>20</qty>
 </d>, <d>
 <name>Hoge</name>
 <qty>12</qty>
 </d>, <d>
 <name>Haga</name>
 <qty hage="pikapika" hige="boubou">15</qty>
 </d>]

返しのリストの3番目を選択し、

In [4]: BeautifulSoup(html, 'lxml').findAll('d')[3]
Out[4]: 
<d>
<name>Haga</name>
<qty hage="pikapika" hige="boubou">15</qty>
</d>

で、もって、さらに<qty>タグを抽出し、

In [6]: BeautifulSoup(html, 'lxml').findAll('d')[3].findAll('qty')
Out[6]: [<qty hage="pikapika" hige="boubou">15</qty>]

で、.attrsでゲット。

In [8]: BeautifulSoup(html, 'lxml').findAll('d')[3].findAll('qty')[0].attrs
Out[8]: {'hage': 'pikapika', 'hige': 'boubou'}

In [9]: BeautifulSoup(html, 'lxml').findAll('d')[3].findAll('qty')[0].attrs['hage']
Out[9]: 'pikapika'

マニュアル。(日本語版)
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

英語。
Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

<Python, flask> test_client()

Flaskさんをやっていて、app.app_context()をやるがいいが、
実際の動作requestに対する応答を確認するいい方法がないかと思っていたら、ありました。
さすがっす。

app.test_client()らしいっす。

このまえ、かりかり作ったスクリプト(下)でちと実験。

github.com

In [1]: import restapi

In [3]: restapi.db.create_all()

In [5]: app = restapi.app.test_client()

In [6]: type(app)
Out[6]: flask.testing.FlaskClient

In [7]: dir(app)
Out[7]: 
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__enter__',
 '__eq__',
 '__exit__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'allow_subdomain_redirects',
 'application',
 'cookie_jar',
 'delete',
 'delete_cookie',
 'environ_base',
 'get',
 'head',
 'open',
 'options',
 'patch',
 'post',
 'preserve_context',
 'put',
 'resolve_redirect',
 'response_wrapper',
 'run_wsgi_app',
 'session_transaction',
 'set_cookie',
 'trace']

In [8]: app.get('/')
Out[8]: <Response streamed [404 NOT FOUND]>

In [11]: app.get('/sqlalc/1/Taro/Hage')
Out[11]: <Response streamed [403 FORBIDDEN]>

In [12]: app.put('/sqlalc/-/Taro/Hage')
Out[12]: <Response streamed [200 OK]>

In [13]: app.get('/sqlalc/1/Taro/Hage')
Out[13]: <Response streamed [200 OK]>

In [15]: r = app.get('/sqlalc/1/Taro/Hage')

In [17]: r.get_data()
Out[17]: b'{\n  "id": 1, \n  "looks": "Hage", \n  "name": "Taro", \n  "r": "GET success"\n}\n'

In [18]: r.get_data().decode('UTF-8')
Out[18]: '{\n  "id": 1, \n  "looks": "Hage", \n  "name": "Taro", \n  "r": "GET success"\n}\n'

In [19]: import json

In [20]: json.loads(r.get_data().decode('UTF-8'))
Out[20]: {'id': 1, 'looks': 'Hage', 'name': 'Taro', 'r': 'GET success'}

In [21]: r.status
Out[21]: '200 OK'

In [22]: r.status_code
Out[22]: 200

にゃるほど!

マニュアル。
API — Flask Documentation (0.12)

Testing Flask Applications — Flask Documentation (0.12)

お世話になったところ。

http://momijiame.tumblr.com/post/39324429279/python-の-flask-で作ったアプリケーションをテストする
momijiame.tumblr.com

追記。
app.app_context()からも順に呼べば、app.test_client()が呼べる。

In [23]: ctx = restapi.app.app_context()

In [25]: type(ctx)
Out[25]: flask.ctx.AppContext

In [26]: ctx.app.test_client()
Out[26]: <FlaskClient <Flask 'restapi'>>

In [27]: type(ctx.app.test_client())
Out[27]: flask.testing.FlaskClient

In [28]: type(app)
Out[28]: flask.testing.FlaskClient

<Bootstrap> Form

フォームFromのやり方。

参考。
qiita.com

マニュアル。
getbootstrap.com

<Python, flask> Flaskr

どうも、FlaskのドキュメントdocumentのページのFlaskrGithubの中身が異なるっぽい。
Github版は、Blueprint等々使ってて、初心者向けじゃなくなってる。。。 ち。。。

昔、mitsuhikoさんが作ったものは下記にあるっぽい。

https://github.com/pallets/flask/releases/tag/0.10.1

ドキュメントページ。
Tutorial — Flask Documentation (0.12)

<Python, flask> CORS対応。

クロスドメイン通信制約。
セキュリティの問題上、そのHTMLファイルが置かれているドメインのサーバとしか通信できないという制約。

qiita.com

で、jQuery ajaxjsonさんデータをGETするスクリプトを作ったが動かなかった。
ので、Flask-CORSを追加した。

stackoverflow.com

マニュアル。
Flask-CORS — Flask-Cors 3.0.3 documentation