質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

2回答

3238閲覧

TweepyでSSLCertVerificationErrorが表示される

nn_

総合スコア22

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2022/01/20 03:07

編集2022/01/20 09:52

SSLについては全く分からないので、ご容赦いただければと思います。
よろしくお願いいたします。

エラーメッセージと解決したいこと

Tweepyを使用してTwitter APIからツイートを取得するため、JupyterLab上でツイートの取得を試みました。しかしSSLCertVerificationErrorが表示されるため、ツイートが取得できません。解決方法をご教授いただけますでしょうか。
環境、コード、エラーメッセージは以下の通りです。Twitter APIの利用申請は完了し承認されています。

【環境】
ソフト:JupyterLab(サーバー:Google Chrome)
OS:Windows10
PC:会社支給
接続:自宅からVPN(テレワーク)

【コード】
参考URL:https://qiita.com/kitarikes/items/543ab75a379f0bf903cc

import tweepy consumer_key = "APIから取得したもの" consumer_secret = "APIから取得したもの" access_token = "APIから取得したもの" access_token_secret = "APIから取得したもの" proxy = "http://[ユーザーID]:[パスワード]@[プロキシサーバのアドレス]:[ポート番号]" auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth, proxy=proxy) q = "teratail" nitems = 5 tweets = tweepy.Cursor(api.search_tweets, q=q, lang="ja").items(nitems) for tweet in tweets: print(tweet)

【エラーメッセージ】
※最大文字数を超えたので、後半部分は補足に追記します。

--------------------------------------------------------------------------- SSLCertVerificationError Traceback (most recent call last) ~\Miniconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 695 if is_new_proxy_conn and http_tunnel_required: --> 696 self._prepare_proxy(conn) 697 ~\Miniconda3\lib\site-packages\urllib3\connectionpool.py in _prepare_proxy(self, conn) 963 --> 964 conn.connect() 965 ~\Miniconda3\lib\site-packages\urllib3\connection.py in connect(self) 410 --> 411 self.sock = ssl_wrap_socket( 412 sock=conn, ~\Miniconda3\lib\site-packages\urllib3\util\ssl_.py in ssl_wrap_socket(sock, keyfile, certfile, cert_reqs, ca_certs, server_hostname, ssl_version, ciphers, ssl_context, ca_cert_dir, key_password, ca_cert_data, tls_in_tls) 448 if send_sni: --> 449 ssl_sock = _ssl_wrap_socket_impl( 450 sock, context, tls_in_tls, server_hostname=server_hostname ~\Miniconda3\lib\site-packages\urllib3\util\ssl_.py in _ssl_wrap_socket_impl(sock, ssl_context, tls_in_tls, server_hostname) 492 if server_hostname: --> 493 return ssl_context.wrap_socket(sock, server_hostname=server_hostname) 494 else: ~\Miniconda3\lib\ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session) 499 # ctx._wrap_socket() --> 500 return self.sslsocket_class._create( 501 sock=sock, ~\Miniconda3\lib\ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session) 1039 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets") -> 1040 self.do_handshake() 1041 except (OSError, ValueError): ~\Miniconda3\lib\ssl.py in do_handshake(self, block) 1308 self.settimeout(None) -> 1309 self._sslobj.do_handshake() 1310 finally: SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131) During handling of the above exception, another exception occurred: MaxRetryError Traceback (most recent call last) ~\Miniconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 438 if not chunked: --> 439 resp = conn.urlopen( 440 method=request.method, ~\Miniconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw) 754 --> 755 retries = retries.increment( 756 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] ~\Miniconda3\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace) 573 if new_retry.is_exhausted(): --> 574 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 575 MaxRetryError: HTTPSConnectionPool(host='api.twitter.com', port=443): Max retries exceeded with url: /1.1/search/tweets.json?q=teratail&lang=ja (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)'))) During handling of the above exception, another exception occurred: SSLError Traceback (most recent call last) ~\Miniconda3\lib\site-packages\tweepy\api.py in request(self, method, endpoint, endpoint_parameters, params, headers, json_payload, parser, payload_list, payload_type, post_data, files, require_auth, return_cursors, upload_api, use_cache, **kwargs) 215 try: --> 216 resp = self.session.request( 217 method, url, params=params, headers=headers, ~\Miniconda3\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json) 541 send_kwargs.update(settings) --> 542 resp = self.send(prep, **send_kwargs) 543 ~\Miniconda3\lib\site-packages\requests\sessions.py in send(self, request, **kwargs) 654 # Send the request --> 655 r = adapter.send(request, **kwargs) 656 ~\Miniconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 513 # This branch is for urllib3 v1.22 and later. --> 514 raise SSLError(e, request=request) 515 SSLError: HTTPSConnectionPool(host='api.twitter.com', port=443): Max retries exceeded with url: /1.1/search/tweets.json?q=teratail&lang=ja (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)'))) During handling of the above exception, another exception occurred: TweepyException Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_13316/2438765585.py in <module> 16 tweets = tweepy.Cursor(api.search_tweets, q=q, lang="ja").items(nitems) 17 ---> 18 for tweet in tweets: 19 print(tweet) ~\Miniconda3\lib\site-packages\tweepy\cursor.py in __next__(self) 84 85 def __next__(self): ---> 86 return self.next() 87 88 def next(self): ~\Miniconda3\lib\site-packages\tweepy\cursor.py in next(self) 284 if self.current_page is None or self.page_index == len(self.current_page) - 1: 285 # Reached end of current page, get the next page... --> 286 self.current_page = next(self.page_iterator) 287 while len(self.current_page) == 0: 288 self.current_page = next(self.page_iterator) ~\Miniconda3\lib\site-packages\tweepy\cursor.py in __next__(self) 84 85 def __next__(self): ---> 86 return self.next() 87 88 def next(self): ~\Miniconda3\lib\site-packages\tweepy\cursor.py in next(self) 165 166 if self.index >= len(self.results) - 1: --> 167 data = self.method(max_id=self.max_id, parser=RawParser(), *self.args, **self.kwargs) 168 169 model = ModelParser().parse( ~\Miniconda3\lib\site-packages\tweepy\api.py in wrapper(*args, **kwargs) 31 @functools.wraps(method) 32 def wrapper(*args, **kwargs): ---> 33 return method(*args, **kwargs) 34 wrapper.pagination_mode = mode 35 return wrapper ~\Miniconda3\lib\site-packages\tweepy\api.py in wrapper(*args, **kwargs) 44 kwargs['payload_list'] = payload_list 45 kwargs['payload_type'] = payload_type ---> 46 return method(*args, **kwargs) 47 wrapper.payload_list = payload_list 48 wrapper.payload_type = payload_type ~\Miniconda3\lib\site-packages\tweepy\api.py in search_tweets(self, q, **kwargs) 1266 https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets 1267 """ -> 1268 return self.request( 1269 'GET', 'search/tweets', endpoint_parameters=( 1270 'q', 'geocode', 'lang', 'locale', 'result_type', 'count', ~\Miniconda3\lib\site-packages\tweepy\api.py in request(self, method, endpoint, endpoint_parameters, params, headers, json_payload, parser, payload_list, payload_type, post_data, files, require_auth, return_cursors, upload_api, use_cache, **kwargs) 220 ) 221 except Exception as e: --> 222 raise TweepyException(f'Failed to send request: {e}').with_traceback(sys.exc_info()[2]) 223 224 if 200 <= resp.status_code < 300:

解決法についてのお願い

おそらく以下のコードでSSLサーバ証明書の検証を無効にすれば取得できるかと思いますが、セキュリティの関係上使用したくないと考えています(Twitter APIにもSSLが必要と書いてあるので、それを無視するのは良くないとも思います)。
そのため、SSLの検証が通るような方法をご教授いただけますでしょうか。

【使用したくないコード】
参考URL:https://qiita.com/hrappuccino/items/84e3a5113b871037024a

import os os.environ["CURL_CA_BUNDLE"] = ""

その他

・Twitter APIのkey、プロキシの設定は間違っていないと思います。
・会社のPCからGoogle Chromeで、Twitterにログインは可能です。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nn_

2022/01/20 03:11

エラーメッセージの続きです。よろしくお願いいたします。 ``` ~\Miniconda3\lib\site-packages\tweepy\api.py in request(self, method, endpoint, endpoint_parameters, params, headers, json_payload, parser, payload_list, payload_type, post_data, files, require_auth, return_cursors, upload_api, use_cache, **kwargs) 214 # Execute request 215 try: --> 216 resp = self.session.request( 217 method, url, params=params, headers=headers, 218 data=post_data, files=files, json=json_payload, ~\Miniconda3\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json) 540 } 541 send_kwargs.update(settings) --> 542 resp = self.send(prep, **send_kwargs) 543 544 return resp ~\Miniconda3\lib\site-packages\requests\sessions.py in send(self, request, **kwargs) 653 654 # Send the request --> 655 r = adapter.send(request, **kwargs) 656 657 # Total elapsed time of the request (approximately) ~\Miniconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies) 512 if isinstance(e.reason, _SSLError): 513 # This branch is for urllib3 v1.22 and later. --> 514 raise SSLError(e, request=request) 515 516 raise ConnectionError(e, request=request) TweepyException: Failed to send request: HTTPSConnectionPool(host='api.twitter.com', port=443): Max retries exceeded with url: /1.1/search/tweets.json?q=teratail&lang=ja (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)'))) ```
guest

回答2

0

自己解決

自分で調べて、SSLの検証を無効にすることなく何とかなりそうです。解決方法ついては伏せさせてください。申し訳ありません。

投稿2022/01/26 15:33

nn_

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

会社支給のPCでVPNに入って、そこから社外に接続するのであれば、接続してよいかどうか、接続する場合の設定を会社のシステム管理部門に問い合わせるべきです。
Tweetを取得するのが業務の一部なら、教えてくれるはずです。
勝手にやった場合、最悪は懲戒免職の可能性があります。

投稿2022/01/20 03:40

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nn_

2022/01/20 03:48 編集

ご指摘ありがとうございます。 会社支給のPCでVPNから社外に接続するというのは、Twitterに限らずということでしょうか。それについては承認されており、Twitter以外のサイトにも常時アクセスしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問