発生しているエラーメッセージ

```

         Traceback (most recent call last):
      File "/Users/username/flilhack/\u540d\u79f0\u672a\u8a2d\u5b9a\u30d5\u30a9\u30eb\u30bf\u3099/tes.py", line 27, in <module>
        print(get_spreadsheet_data())
      File "/Users/username/flilhack/\u540d\u79f0\u672a\u8a2d\u5b9a\u30d5\u30a9\u30eb\u30bf\u3099/tes.py", line 23, in get_spreadsheet_data
        wsheet        = gfile.get_worksheet(0)
      File "/Users/username/anaconda3/lib/python3.6/site-packages/gspread/v4/models.py", line 138, in get_worksheet
        sheet_data = self.fetch_sheet_metadata()
      File "/Users/username/anaconda3/lib/python3.6/site-packages/gspread/v4/models.py", line 120, in fetch_sheet_metadata
        r = self.client.request('get', url, params=params)
      File "/Users/username/anaconda3/lib/python3.6/site-packages/gspread/v4/client.py", line 67, in request
        endpoint, json=json, params=params, data=data, files=files
      File "/Users/username/anaconda3/lib/python3.6/site-packages/requests/sessions.py", line 521, in get
        return self.request('GET', url, **kwargs)
      File "/Users/username/anaconda3/lib/python3.6/site-packages/requests/sessions.py", line 508, in request
        resp = self.send(prep, **send_kwargs)
      File "/Users/username/anaconda3/lib/python3.6/site-packages/requests/sessions.py", line 618, in send
        r = adapter.send(request, **kwargs)
      File "/Users/username/anaconda3/lib/python3.6/site-packages/requests/adapters.py", line 407, in send
        self.cert_verify(conn, request.url, verify, cert)
      File "/Users/username/anaconda3/lib/python3.6/site-packages/requests/adapters.py", line 226, in cert_verify
        "invalid path: {0}".format(cert_loc))
    OSError: Could not find a suitable TLS CA certificate bundle, invalid path: /Users/username/anaconda3/lib/python3.6/site-packages/certifi/cacert.pem
    [Finished in 0.597s]
    tes.py26:1
    LFUTF-8Python0 files3 updates
    
    oauth2client.client.HttpAccessTokenRefreshError
    
```

* * *

該当のソースコード(Python3)

```

    import gspread
    from oauth2client.service_account import ServiceAccountCredentials
    
    def get_spreadsheet_data():
        doc_id        = '[spreadsheet URL のid]'
        json_key_path = '/Users/username/Downloads/My Project-a5bcde8be455.json'
        scope         = ['https://spreadsheets.google.com/feeds']
        credentials   =  ServiceAccountCredentials.from_json_keyfile_name(json_key_path, scope)
        gclient       = gspread.authorize(credentials)
        gfile         = gclient.open_by_key(doc_id)
        wsheet        = gfile.get_worksheet(0)
        records       = wsheet.get_all_records(head=1)
        return records
    
    print(get_spreadsheet_data())
    
```

* * *

試したこと

似たようなエラーがないかを確認したところ、スタックオーバーフローの本家の方で時刻のズレが原因ということを発見いたしました。わたしは現在Mac10.13.3を使用しており、日付と時刻の環境設定から自動設定にて設定しております.
手動設定なども試しましたが解決には至りませんでした。

* * *

使用環境

  * OS Mac10.13.3
  * Python3
  * Atom
CC BY-SA 3.0
2018-04-05T03:58:13.773
42943
2018-04-06T08:49:35.177
2018-04-05T08:48:06.767
27824
27824
question
python
Python3でサーバ時刻と現在時刻のずれで発生すると思われるエラーを解決したい
少し書く時間がないのですが、こちらも参照してください。  
<https://stackoverflow.com/questions/49356116/mac-py2app-not-finding-cacert-
pem>  
これは、[最近修正された](https://github.com/requests/requests/issues/4369)requets内のバグですが、まだリリースされたバージョンでは修正を行っていません。もしあなたがrequestsの開発バージョンを使ってOKなら、github
repoからインストールすることができますよ。

> This was a bug in requests that was recently fixed but has not made it to a
> release version yet. If you are ok with using a development version of
> requests, you can install from the github repo (upgrading if already
> present) so that when you build your app you have the latest version with
> this fix:
```

    pip install -U https://github.com/requests/requests/zipball/master
    
```

また、  
<https://stackoverflow.com/questions/46119901/python-requests-cant-find-a-
folder-with-a-certificate-when-converted-to-exe>

> I ran into this problem as well. It looks like it comes from the certificate
> bundle cacert.pem not being included in the requests package directory when
> the program is compiled. The requests module uses the function
> certifi.core.where to determine the location of cacert.pem. Overriding this
> function and overriding the variables set by this function seems to fix the
> problem.

自分のプログラムの初めにこのコードを追加しましたとあります。

I added this code to the beginning of my program:

```

    import sys, os
    
    
    def override_where():
        """ overrides certifi.core.where to return actual location of cacert.pem"""
        # change this to match the location of cacert.pem
        return os.path.abspath("cacert.pem")
    
    
    # is the program compiled?
    if hasattr(sys, "frozen"):
        import certifi.core
    
        os.environ["REQUESTS_CA_BUNDLE"] = override_where()
        certifi.core.where = override_where
    
        # delay importing until after where() has been replaced
        import requests.utils
        import requests.adapters
        # replace these variables in case these modules were
        # imported before we replaced certifi.core.where
        requests.utils.DEFAULT_CA_BUNDLE_PATH = override_where()
        requests.adapters.DEFAULT_CA_BUNDLE_PATH = override_where()
    
```

(前の投稿↓）  
日本語では、[[Python] gspreadでGoogle
Spreadsheetにアクセスするまでのトラブルシューティング](https://qiita.com/vmmhypervisor/items/c8ef0ad87318656facb2)が良いようです。

詳細についてはまた更新しますが、解決を願います。

[Access Token and Refresh token giving invalid grant in Google Plus in
Python?](https://stackoverflow.com/questions/30115933/access-token-and-
refresh-token-giving-invalid-grant-in-google-plus-in-
python/30117441#30117441)に解法が書いてあると皆いっているようです。私は使ったことがないのでわかりませんが、結構な人がおっしゃっているみたいなのでそうなのでしょう。  
ほかにも回答がありましたが、これに信用度が10ついていましたので引っ張ってみました。  
何か心当たりはありませんか？

無効な`grant error`は二つの共通する原因を有する。  
1.あなたのサーバーの時計が[NTP](https://en.wikipedia.org/wiki/Network_Time_Protocol)と同時的に進行しないためである。  
(解決法:そのサーバーの時刻を調べ、もし不一致ならばそれを治しましょう。)  
2.`refresh token limit`を超えてしまった。  
(解決法:あなたがすることは何もない。使用上それ以上の`refresh token`は持つことが出来ない。)  
アプリケーションは多様な`refresh
token`を要求することができる。例えば、これはあるユーザーが多様なマシンに一つのアプリケーションをインストールしたいときなんかに有効である。この場合、二つの`refresh
token`が要求されるけれども、それぞれの一つインストールに使われるものとする。`refresh
token`の数が、その制限を超えると、古い`token`は、無効になってしまいます。もしそのアプリケーションが無効化された`refresh
token`を使おうと試みるならば、ある`invalid_grant error`
という反応が返ってきます。それぞれ単独のペア、`OAuth2.0`クライアントのための制限は25 `refresh tokens`
です。(この制限は、変わりやすいことを覚えておいてください。）もしそのアプリケーションが、`refresh
tokens`を、同じ`Client/Account`ペアのために要求するのであれば、一度26回目の`token`が発行されると、以前発行された最初の`token`は無効になってしまうでしょう。27番目の`token`は、このように、以前の2番目の無効になった`token`になってしまいます。  

> Invalid_grant error has two common causes.  
>  1.Your server’s clock is not in sync with NTP. (Solution: check the server
> time if its incorrect fix it. )  
>  2.The refresh token limit has been exceeded. (Solution: Nothing you can do
> they cant have more refresh tokens in use) Applications can request multiple
> refresh tokens. For example, this is useful in situations where a user wants
> to install an application on multiple machines. In this case, two refresh
> tokens are required, one for each installation. When the number of refresh
> tokens exceeds the limit, older tokens become invalid. If the application
> attempts to use an invalidated refresh token, an invalid_grant error
> response is returned. The limit for each unique pair of OAuth 2.0 client and
> is 25 refresh tokens (note that this limit is subject to change). If the
> application continues to request refresh tokens for the same Client/Account
> pair, once the 26th token is issued, the 1st refresh token that was
> previously issued will become invalid. The 27th requested refresh token
> would invalidate the 2nd previously issued token and so on.

それから、じゃあどうすれば、NTPと合わせられるのか？ということについて本家で調べてみたら、  
[Synchronize the server clock to an NTP
server](https://stackoverflow.com/questions/13177055/synchronize-the-server-
clock-to-an-ntp-
server)に行き当たり、<https://stackoverflow.com/questions/21791193/php-microtime-
drift-external-ntp-service/21805579#21805579>で答えを書いたとおっしゃってました。  
`php`が、本来の分野らしいのですが、共通の解法が匂えばいいかなと思って載せてみました。  
何か参考になれば幸いです。  
  
**追記：**  
もう見られたことだろうと思うのですが、日付時刻調整の解説サイトです。  
[日付と時刻の設定](https://pc-karuma.net/mac-date-time/)  
や  
[PCの時刻合わせに公開NTPサーバーを使う](http://neoblog.itniti.net/time-adjustment-open-ntp/)

[すべての時計を合わせたい](http://easy.mri.co.jp/19991026.html)
CC BY-SA 3.0
2018-04-05T04:39:00.003
42945
2018-04-06T08:49:35.177
2018-04-06T08:49:35.177
24284
24284
42943
answer