初心者がプロキシ環境下でPythonを使ってAPIを叩く

##pythonとやらでAPIを叩きたい
めでたくpythonデビューしたpythonを触って2日目の超初心者が、
プロキシ環境化でえんやこらとAPIを叩こうとするメモ。
##まずは基本の環境構築
私のpythonデビュー1日目の環境を流用しています。
https://qiita.com/akimoto__ri/items/5d4711c279d111622117
APIだけ叩きたいならpostgres以外があれば大丈夫。たぶん。
##必要なモジュール
**requests**
https://requests-docs-ja.readthedocs.io/en/latest/
普通にpipと叩いてinstallしようとすると、無事にこけます。
いろいろ試してみたけれど、プロキシで引っかかっていました。

プロキシ環境化でインストールしたい場合は以下のようにを実行する必要がありました。
`pip3 install requests --proxy ***`
これで無事にrequestsモジュールを入れることができました。
##今回使うAPI
**Darksky**
https://darksky.net/dev

お天気APIのDarkSkyを今回使用することにします。
無料登録をするとすぐにAPIが発行され、緯度経度を持たせて投げることでその地点の天気情報が手に入ります。
「TRY FOR FREE」から簡単に登録が可能です。
メールアドレスとパスワードを登録すると、SecurityキーとSample APIが発行されます。
今回はこの時発行されたAPIURLをそのまま使ってみることにしました。
登録直後画面、「Sample API Call」にサンプルが発行されています。

試しにAPIURLをPostmanで投げてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353603/4752658e-8c1d-972a-3bf0-00552b9007f6.png)
取れました。初期URLの緯度経度はなぜかアルカトラズに指定されています。
##pythonで実装
今回はAPIを投げて取るだけの簡単実装です。
シンプルにソースを書きました。

```python:PythonTest.py
import requests
import json

# HTTPS　API
url = 'https://api.darksky.net/forecast/****************/37.8267,-122.4233'
headers = {'units': 'si' , 'lang': 'ja' , 'exclude': 'alerts,flags'}

request = requests.session()
res = request.get(url , headers=headers)
lists = json.loads(res.text)
print(lists)
```
これをコマンドプロンプトから実行してみる。

```console:console
C:\pythonDirectry python PythonTest.py
Traceback (most recent call last):
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\contrib\pyopenssl.py", line 453, in wrap_socket
    cnx.do_handshake()
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1915, in do_handshake
    self._raise_ssl_error(self._ssl, result)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\OpenSSL\SSL.py", line 1639, in _raise_ssl_error
    raise SysCallError(errno, errorcode.get(errno))
OpenSSL.SSL.SysCallError: (10054, 'WSAECONNRESET')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connectionpool.py", line 839, in _validate_conn
    conn.connect()
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\connection.py", line 344, in connect
    ssl_context=context)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\util\ssl_.py", line 344, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "C:\Users\******\AppData\Local\Continuum\anaconda3\lib\site-packages\urllib3\contrib\pyopenssl.py", line 459, in wrap_socket
    raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: SysCallError(10054, 'WSAECONNRESET')",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

・・・・・・
```
もちゃくそに怒られてしまった。
SSLかあと思いつつ色々調べ、いろいろと試してみたが一向に解消しなかった。
##プロキシの再来
結果から言うと、原因はプロキシでした。
https://2.python-requests.org//en/master/user/advanced/#proxies
公式ドキュメントの通りにプロキシを引数として与える。

```python:PythonTest.rb
import requests
import json

# HTTPS　API
url = 'https://api.darksky.net/forecast/****************/37.8267,-122.4233'
headers = {'units': 'si' , 'lang': 'ja' , 'exclude': 'alerts,flags'}

proxies = {
  'http': 'http://******:8080',
  'https': 'http://******:8080',
}
request = requests.session()
res = request.get(url , headers=headers , proxies=proxies)
lists = json.loads(res.text)
print(lists)
```
コンソールから実行してみよう。

```console:console
C:\pythonDirectry python PythonTest.py
{"latitude":37.8267,"longitude":-122.4233,"timezone":"America/Los_Angeles","currently":{"time":1558333976,"summary":"Mostly Cloudy","icon":"partly-cloudy-night","nearestStormDistance":1,"nearestStormBearing":241,"precipIntensity":0,"precipProbability":0,"temperature":52.58,"apparentTemperature":52.58,"dewPoint":47.93,"humidity":0.84,"pressure":1012.05,"windSpeed":5.43,"windGust":5.43,"windBearing":273,"cloudCover":0.81,"uvIndex":0,"visibility":9.51,"ozone":437.9},"minutely":{"summary":"Mostly cloudy for the hour.","icon":"partly-cloudy-night","data":・・・・・・・・・・・
```


無事にできました。。。
よしよし。