@@ -40,6 +40,11 @@ Password:
40
40
{'avatar_url': 'https://avatars.githubusercontent.com/u/2401856?v=3', ...}
41
41
```
42
42
43
+ > [ note]
44
+ > Tento příklad pracuje přímo se jménem a heslem.
45
+ > To se většinou nedělá a webové API to často ani nepodporují.
46
+ > Pokud na GitHub používáte dvoufaktorovou autentizaci, příklad nebude fungovat.
47
+
43
48
Příklady použití pro další HTTP metody najdete v [ dokumentaci] .
44
49
45
50
[ dokumentaci ] : http://docs.python-requests.org/en/master/user/quickstart/
@@ -73,140 +78,23 @@ k testování HTTP dotazů:
73
78
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Cookie': 'mipyt=best', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.19.1', 'X-Test': 'true', 'X-Test2': 'true'}}
74
79
```
75
80
76
- ## Twitter API
77
-
78
- Pro reálné použití si ukážeme, jak se dá pomocí requests získat seznam tweetů.
79
- Nebudeme samozřejmě nic parsovat z HTML stránek, ale použijeme [ API Twitteru] .
80
-
81
- ``` pycon
82
- >>> r = session.get(' https://api.twitter.com/1.1/search/tweets.json' )
83
- >>> r.json()
84
- {'errors': [{'code': 215, 'message': 'Bad Authentication data.'}]}
85
- ```
86
-
87
- Jak můžete vidět v odpovědi, Twitter API neumožňuje data číst bez autentizace.
88
- Jak se autentizovat byste při troše hledání našli v dokumentaci, ale protože
89
- tu nevyučujeme úvod do OAuthu, ale Python, rozhodli jsme se vám to zjednodušit.
81
+ ## GitHub API
90
82
91
- Nemáte-li na Twitter účet, vytvořte si ho. Můžete vytvořit nějaký * dummy* účet,
92
- který dál nebudete používat. Budete ale potřebovat ověřitelné telefonní číslo.
93
-
94
- Po přihlášení na Twitter jděte na [ apps.twitter.com] a vytvořte aplikaci
95
- (URL si můžete vymyslet, třeba ` http://invalid ` ).
96
- Po vytvoření najdete na kartě * Keys and Access Tokens* ** API Key** a ** API Secret** .
97
- Pozor, jedná se prakticky o hesla k vašemu Twitter účtu,
98
- a proto by je nikdo kromě vás neměl vidět.
83
+ Podíváme se teď, podobně jako v úvodním příkladu, na [ GitHub API] ,
84
+ které má poměrně jednoduchou autentizaci (od GitHubu přímo
85
+ získáte token). Stačí jít do [ nastavení] a vyrobit nový token
86
+ (zatím není třeba zaškrtávat žádná oprávnění).
99
87
100
88
> [ warning] Ochrana přihlašovacích tokenů
101
- > Ještě jednou – * API Key * a * API Secret * se chovají jako hesla .
102
- > Nikomu je nesmíte ukazovat!
103
- > Stane-li se přesto, že se k nim dostane někdo nepovolaný, na kartě
104
- > * Keys and Access Tokens * je můžete zrušit .
89
+ > Váš token je něco jako vaše heslo .
90
+ > Nikomu je nesmíte ukazovat a nesmíte jej dát do Gitu.
91
+ > Stane-li se přesto, že se k němu dostane někdo nepovolaný,
92
+ > můžete jej v [ nastavení ] opět smazat .
105
93
106
- Prozatím klíče nastavte do proměnných, později je schováme například do
94
+ Pomocí tokenu můžete z GitHubu získávat informace.
95
+ Prozatím token nastavte do proměnné, později jej schováme například do
107
96
konfiguračního souboru.
108
97
109
- ``` pycon
110
- >>> api_key = ' D4HJp6PKmpon9eya1b2c3d4e5'
111
- >>> api_secret = ' rhvasRMhvbuHJpu4MIuAb4WO50gnoQa1b2c3d4e5f6g7h8i9j0'
112
- ```
113
-
114
- Pomocí těchto kódů je potřeba si od Twitter API vyžádat přístupový token.
115
- Používá se k tomu běžné HTTP přihlášení ([ HTTP Basic authentication] ),
116
- kde je ` api_key ` použit jako uživatelské jméno a ` api_secret ` jako heslo.
117
-
118
- Pro běžné HTTP přihlášení se v knihovně requests používá
119
- ` requests.auth.HTTPBasicAuth ` :
120
-
121
- [ HTTP Basic authentication ] : https://cs.wikipedia.org/wiki/Basic_access_authentication
122
-
123
- ``` pycon
124
- >>> r = session.post(' https://api.twitter.com/oauth2/token' ,
125
- auth=requests.auth.HTTPBasicAuth(api_key, api_secret),
126
- data={'grant_type': 'client_credentials'})
127
- >>>
128
- >>> r.json()
129
- {'token_type': 'bearer', 'access_token': 'AAAAAAAAAAAAAAAAAAAAAHhKXAAAAAAAaA1abB2bcC3cdD4deE5efF6fgG7ghH8hiI9ijJ0ja1b2c3d4e5f6g7h8i9j0a1b2c3d4e5f6g7h8i9j0'}
130
- >>> bearer_token = r.json()[' access_token' ]
131
- ```
132
-
133
- Parametr ` auth ` v příkladu výše je autentizační funkce, která nějakým způsobem
134
- modifikuje HTTP požadavek za účelem autentizace, většinou přidává specifické
135
- hlavičky.
136
- ` requests.auth.HTTPBasicAuth ` zde dle specifikace zakóduje jméno a heslo pomocí
137
- algoritmu base64 a přidá hlavičku ` Authorization ` .
138
-
139
- Základní HTTP přihlášení je tak běžné, že pro něj Requests mají zkratku –
140
- místo ` HTTPBasicAuth ` se dá použít jen dvojice (jméno, heslo):
141
-
142
- ``` pycon
143
- >>> r = session.post(' https://api.twitter.com/oauth2/token' ,
144
- auth=(api_key, api_secret),
145
- data={'grant_type': 'client_credentials'})
146
- ```
147
-
148
- Pro další komunikaci s Twitter API je nutné přidat hlavičku se získaným tokenem.
149
- Jelikož používáte session, není nutné to dělat u každého požadavku zvlášť,
150
- ale je možné nastavit autentizační funkci pro celou session.
151
-
152
- ``` pycon
153
- >>> def bearer_auth (req ):
154
- ... req.headers[' Authorization' ] = ' Bearer ' + bearer_token
155
- ... return req
156
- ...
157
- >>> session.auth = bearer_auth
158
- ```
159
-
160
- Pak už by mělo API fungovat.
161
- Použijeme [ API pro vyhledávání tweetů] [ Search API ] :
162
-
163
- ``` pycon
164
- >>> r = session.get(
165
- ... ' https://api.twitter.com/1.1/search/tweets.json' ,
166
- ... params= {' q' : ' #python' },
167
- ... )
168
- >>> for tweet in r.json()[' statuses' ]:
169
- ... print (tweet[' text' ])
170
- ...
171
- Once a framework decides to abstract the HTML layer from you. Customizing your UI becomes sorcery. #django #Python
172
- ...
173
- ```
174
-
175
- Zde je pro zjednodušení k dispozici celá funkce pro vytvoření autentizované
176
- * session* :
177
-
178
- ``` python
179
- import requests
180
-
181
- def twitter_session (api_key , api_secret ):
182
- session = requests.Session()
183
-
184
- r = session.post(' https://api.twitter.com/oauth2/token' ,
185
- auth = (api_key, api_secret),
186
- data = {' grant_type' : ' client_credentials' })
187
-
188
- bearer_token = r.json()[' access_token' ]
189
-
190
- def bearer_auth (req ):
191
- req.headers[' Authorization' ] = ' Bearer ' + bearer_token
192
- return req
193
-
194
- session.auth = bearer_auth
195
- return session
196
- ```
197
-
198
- [ API Twitteru ] : https://dev.twitter.com/rest/public
199
- [ apps.twitter.com ] : https://apps.twitter.com/
200
- [ Search API ] : https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets.html
201
-
202
- ### GitHub API
203
-
204
- Podíváme se i na [ GitHub API] , které má jednodušší autentizaci (od GitHubu přímo
205
- získáte token). Stačí jít do [ nastavení] a vyrobit nový token
206
- (zatím není třeba zaškrtávat žádná oprávnění).
207
- Token je opět třeba patřičně chránit.
208
-
209
- Pomocí tokenu pak můžete z GitHubu získávat informace.
210
98
Tímto kódem lze například získat popis přihlášeného uživatele, tedy sebe sama.
211
99
212
100
``` pycon
@@ -222,9 +110,33 @@ Tímto kódem lze například získat popis přihlášeného uživatele, tedy se
222
110
>>> r.json()
223
111
```
224
112
113
+ Funkce ` session.auth ` v příkladu výše je autentizační funkce,
114
+ která nějakým způsobem modifikuje HTTP požadavek za účelem autentizace,
115
+ většinou přidává specifické hlavičky (jak je tomu i zde).
116
+ Lze ji nastavit buďto na celé session nebo předat argumentem ` auth ` s každým
117
+ požadavkem.
118
+
119
+ Existují předpřipravené funkce v modulu ` requests.auth ` , například
120
+ ` requests.auth.HTTPBasicAuth ` provádí základní HTTP přihlášení.
121
+ Dle specifikace zakóduje jméno a heslo pomocí
122
+ algoritmu base64 a přidá hlavičku ` Authorization ` .
123
+
124
+ [ Základní HTTP přihlášení] ( https://cs.wikipedia.org/wiki/Basic_access_authentication )
125
+ je tak běžné, že pro něj Requests mají zkratku –
126
+ místo ` HTTPBasicAuth ` se dá použít i dvojice (jméno, heslo):
127
+
128
+ ``` pycon
129
+ >>> requests.get(' https://httpbin.org/basic-auth/AzureDiamond/hunter2' ,
130
+ auth=requests.auth.HTTPBasicAuth('AzureDiamond', 'hunter2'))
131
+ >>>
132
+ >>> requests.get(' https://httpbin.org/basic-auth/AzureDiamond/hunter2' ,
133
+ auth=('AzureDiamond', 'hunter2'))
134
+ ```
135
+
225
136
> [ note]
226
- > Všimněte si hlavičky ` User-Agent ` . Ta je potřeba při komunikaci s GitHub API
227
- > explicitně nastavit. Nastavení na objektu session zajistí, že tato hlavička
137
+ > Všimněte si také hlavičky ` User-Agent ` .
138
+ > Ta je potřeba při komunikaci s GitHub API explicitně nastavit.
139
+ > Nastavení na objektu session zajistí, že tato hlavička
228
140
> bude ve všech požadavcích.
229
141
230
142
Pokud budete chtít něco provést, například dát hvězdičku repozitáři s těmito
@@ -264,18 +176,13 @@ My ale věříme, že ji odebrat nechcete :)
264
176
[ Dokumentace ] : https://developer.github.com/v3/
265
177
[ GitHub API ] : https://developer.github.com/v3
266
178
267
-
268
- ### Chraňte své tokeny
179
+ ## Chraňte své tokeny
269
180
270
181
Když ukládáte skript do gitu, mějte na paměti, že tokeny a klíče do něj nikdy
271
182
nepatří. Můžete je uložit do konfiguračního souboru, který bude gitem ignorován,
272
183
například takhle:
273
184
274
185
``` ini
275
- [twitter]
276
- key = D4HJp6PKmpon9eya1b2c3d4e5
277
- secret = rhvasRMhvbuHJpu4MIuAb4WO50gnoQa1b2c3d4e5f6g7h8i9j0
278
-
279
186
[github]
280
187
token = d7313dab254b7fd0d0f3ec3cbf754b3abce462d5
281
188
```
@@ -288,8 +195,8 @@ A následně konfiguraci načtete pomocí modulu
288
195
>>> config = configparser.ConfigParser()
289
196
>>> with open (' auth.cfg' ) as f:
290
197
... config.read_file(f)
291
- >>> config[' twitter ' ][' key ' ]
292
- D4HJp6PKmpon9eya1b2c3d4e5
198
+ >>> config[' github ' ][' token ' ]
199
+ 'd7313dab254b7fd0d0f3ec3cbf754b3abce462d5'
293
200
```
294
201
295
202
Do souboru ` .gitignore ` pak musíte přidat název ignorovaného souboru, např.:
0 commit comments