{"id":341205,"date":"2022-11-14T15:00:20","date_gmt":"2022-11-14T15:00:20","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=341205"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=341205","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0434\u043b\u044f API \u0422\u043e\u043a\u0438\u0439\u0441\u043a\u043e\u0439 \u0444\u043e\u043d\u0434\u043e\u0432\u043e\u0439 \u0431\u0438\u0440\u0436\u0438 \u043d\u0430 Golang<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/698740\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/_z\/pj\/nn\/_zpjnngh-0vz2vtkszldd6iafg4.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/_z\/pj\/nn\/_zpjnngh-0vz2vtkszldd6iafg4.jpeg\" data-blurred=\"true\"\/><\/div>\n<p><\/a><br \/>  \u0426\u0435\u043b\u0435\u0432\u044b\u043c REST API \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/jpx.gitbook.io\/j-quants-api-en\/api-reference\/\">jquants-api<\/a>, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/698090\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439<\/a> \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u042f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430 Golang, \u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0443\u044e\u0441\u044f Golang-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u043d\u0430 <a href=\"https:\/\/github.com\/hellonico\/jquants-api-go\">GitHub<\/a>.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f API \u0438 \u043c\u043e\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0426\u0435\u043b\u0438<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c:  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u0444\u0430\u0439\u043b edn, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c jquants-api-jvm.<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0435\u0441\u0442 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0435\u0441\u0442 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 ID.<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0435\u0441\u0442 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430 ID \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/li>\n<li>\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430 GitHub.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Go \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043b\u043e\u0433\u0438\u043d\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a API<\/font><\/h2>\n<p>  \u041c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 TDD, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u0444\u0430\u0439\u043b edn, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c jquants-api-jvm.<\/p>\n<p>  \u0412 \u0444\u0430\u0439\u043b\u0435 helper_test.go \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0435\u043b\u0435\u0442 \u0442\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>PrepareLogin<\/em>.<\/p>\n<pre><code class=\"go\">package jquants_api_go  import ( \"fmt\" \"os\" \"testing\" )  func TestPrepareLogin(t *testing.T) { PrepareLogin(os.Getenv(\"USERNAME\"), os.Getenv(\"PASSWORD\")) }<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0435\u0440\u0451\u043c USERNAME \u0438 PASSWORD \u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>os.GetEnv<\/code>.<\/p>\n<p>  \u0417\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b <code>helper.go<\/code>. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Login.<\/li>\n<li>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 EDN.<\/li>\n<\/ul>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Login \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"go\">type Login struct { \u00a0\u00a0\u00a0\u00a0UserName string `edn:\"mailaddress\"` \u00a0\u00a0\u00a0\u00a0Password string `edn:\"password\"` }<\/code><\/pre>\n<p>  \u0410 \u0432\u044b\u0437\u043e\u0432 <code>edn.Marshal<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 byte[], \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u0444\u0430\u0439\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>writeConfigFile<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>os.WriteFile<\/code> \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u043c \u043f\u043e\u0441\u043b\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 EDN.<\/p>\n<pre><code class=\"go\">func writeConfigFile(file string, content []byte) { \u00a0\u00a0\u00a0\u00a0os.WriteFile(getConfigFile(file), content, 0664) }<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 EDN, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u0444\u0430\u0439\u043b <code>go.mod<\/code>:<\/p>\n<pre><code class=\"bash\">require olympos.io\/encoding\/edn v0.0.0-20201019073823-d3554ca0b0a3<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0442\u0435\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 jquants API:<\/p>\n<pre><code class=\"bash\">export USERNAME=\"youremail@you.com\" export PASSWORD=\"yourpassword\"<\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c <code>go test<\/code> \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"bash\">PASS ok  \u00a0\u00a0\u00a0\u00a0github.com\/hellonico\/jquants-api-go\u00a0\u00a0\u00a0\u00a01.012s<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 <code>login.edn<\/code> \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"bash\">cat ~\/.config\/jquants\/login.edn<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">{:mailaddress \"youremail@you.com\" :password \"yourpassword\"}<\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Login \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 jQuants API \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f RefreshToken<\/font><\/h2>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0431\u0443\u0434\u0435\u0442 <code>TestRefreshToken<\/code>. \u041e\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 POST \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 API \u0442\u043e\u043a\u0435\u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u041c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0444\u0430\u0439\u043b <code>helper_test.go<\/code> \u043d\u043e\u0432\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code class=\"go\">func TestRefreshToken(t *testing.T) { \u00a0\u00a0\u00a0\u00a0token, _ := GetRefreshToken() \u00a0\u00a0\u00a0\u00a0fmt.Printf(\"%s\\n\", token) }<\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>GetRefreshToken<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ul>\n<li>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0432 \u0444\u0430\u0439\u043b \u0440\u0430\u043d\u0435\u0435, \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 JSON.<\/li>\n<li>\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 URL \u0438 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 JSON \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e body.<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441.<\/li>\n<li>API \u0432\u0435\u0440\u043d\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 RefreshToken.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0444\u0430\u0439\u043b EDN.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>GetUser<\/code> \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435. \u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>Login<\/code>, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>edn.Unmarshall()<\/code> \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"go\">func GetUser() Login { \u00a0\u00a0\u00a0\u00a0s, _ := os.ReadFile(getConfigFile(\"login.edn\")) \u00a0\u00a0\u00a0\u00a0var user Login \u00a0\u00a0\u00a0\u00a0edn.Unmarshal(s, &amp;user) \u00a0\u00a0\u00a0\u00a0return user }<\/code><\/pre>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\/\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Login \u0432 \u0444\u0430\u0439\u043b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 EDN, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 JSON.<\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Login \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c:<\/p>\n<pre><code class=\"go\">type Login struct { \u00a0\u00a0\u00a0\u00a0UserName string `edn:\"mailaddress\" json:\"mailaddress\"` \u00a0\u00a0\u00a0\u00a0Password string `edn:\"password\" json:\"password\"` }<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0439 API \u0442\u043e\u043a\u0435\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 EDN, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code>Login<\/code>:<\/p>\n<pre><code class=\"go\">type RefreshToken struct { \u00a0\u00a0\u00a0\u00a0RefreshToken string `edn:\"refreshToken\" json:\"refreshToken\"` }<\/code><\/pre>\n<p>  \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>GetRefreshToken<\/code>:<\/p>\n<pre><code class=\"go\">func GetRefreshToken() (RefreshToken, error) { \u00a0\u00a0\u00a0\u00a0\/\/ \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0432 \u0444\u0430\u0439\u043b, \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0435\u0433\u043e \u0432 \u0432\u0438\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 json \u00a0\u00a0\u00a0\u00a0var user = GetUser() \u00a0\u00a0\u00a0\u00a0data, err := json.Marshal(user)  \u00a0\u00a0\u00a0\u00a0\/\/ \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 http-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 url \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 json, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 body \u00a0\u00a0\u00a0\u00a0url := fmt.Sprintf(\"%s\/token\/auth_user\", BASE_URL) \u00a0\u00a0\u00a0\u00a0req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(data)) \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u00a0\u00a0\u00a0\u00a0client := http.Client{} \u00a0\u00a0\u00a0\u00a0res, err := client.Do(req)      \/\/ API \u0432\u0435\u0440\u043d\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 RefreshToken \u00a0\u00a0\u00a0\u00a0var rt RefreshToken \u00a0\u00a0\u00a0\u00a0json.NewDecoder(res.Body).Decode(&amp;rt)  \u00a0\u00a0\u00a0\u00a0\/\/ \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u044d\u0442\u043e\u0442 \u0442\u043e\u043a\u0435\u043d \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u0430 EDN \u00a0\u00a0\u00a0\u00a0encoded, err := edn.Marshal(&amp;rt) \u00a0\u00a0\u00a0\u00a0writeConfigFile(REFRESH_TOKEN_FILE, encoded)  \u00a0\u00a0\u00a0\u00a0return rt, err }<\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>go test<\/code> \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 refreshToken, \u043d\u043e \u0442\u0435\u0441\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e!<\/p>\n<pre><code class=\"bash\">{eyJjdHkiOiJKV1QiLC...}  PASS ok  \u00a0\u00a0\u00a0\u00a0github.com\/hellonico\/jquants-api-go\u00a0\u00a0\u00a0\u00a03.231s<\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 ID<\/font><\/h2>\n<p>  \u0418\u0437 Refresh Token \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c IdToken, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043a\u0435\u043d, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a jquants API. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043a\u0430\u043a \u0443 <code>GetRefreshToken<\/code>, \u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>IdToken<\/code> \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\/\u0438\u0437 edn\/json.<\/p>\n<pre><code class=\"go\">type IdToken struct { \u00a0\u00a0\u00a0\u00a0IdToken string `edn:\"idToken\" json:\"idToken\"` }<\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">func GetIdToken() (IdToken, error) { \u00a0\u00a0\u00a0\u00a0var token = ReadRefreshToken()  \u00a0\u00a0\u00a0\u00a0url := fmt.Sprintf(\"%s\/token\/auth_refresh?refreshtoken=%s\", BASE_URL, token.RefreshToken)  \u00a0\u00a0\u00a0\u00a0req, err := http.NewRequest(http.MethodPost, url, nil) \u00a0\u00a0\u00a0\u00a0client := http.Client{} \u00a0\u00a0\u00a0\u00a0res, err := client.Do(req)  \u00a0\u00a0\u00a0\u00a0var rt IdToken \u00a0\u00a0\u00a0\u00a0json.NewDecoder(res.Body).Decode(&amp;rt)  \u00a0\u00a0\u00a0\u00a0encoded, err := edn.Marshal(&amp;rt) \u00a0\u00a0\u00a0\u00a0writeConfigFile(ID_TOKEN_FILE, encoded)  \u00a0\u00a0\u00a0\u00a0return rt, err }<\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a<\/font><\/h2>\n<p>  \u041c\u044b \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u044f\u0434\u0440\u0430 \u043a\u043e\u0434\u0430 \u043e\u0431\u0451\u0440\u0442\u043a\u0438, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IdToken \u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u0437 HTTP API \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GET-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 HTTP.<\/p>\n<p>  \u041f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u0435\u0435, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d ID \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 EDN.<\/li>\n<li>\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 URL \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u0430\u0442.<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 idToken.<\/li>\n<li>\u041f\u0430\u0440\u0441\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u0440\u0435\u0437\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 Quote.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e (nul) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<pre><code class=\"go\">func TestDaily(t *testing.T) { \u00a0\u00a0\u00a0\u00a0var quotes = Daily(\"86970\", \"\", \"20220929\", \"20221003\") \u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0if quotes.DailyQuotes == nil { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0t.Failed() \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0for _, quote := range quotes.DailyQuotes { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fmt.Printf(\"%s,%f\\n\", quote.Date, quote.Close) \u00a0\u00a0\u00a0\u00a0} }<\/code><\/pre>\n<p>  \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f <code>func Daily<\/code> \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"go\">func Daily(code string, date string, from string, to string) DailyQuotes { \u00a0\u00a0\u00a0\u00a0\/\/ \u0447\u0442\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 id \u00a0\u00a0\u00a0\u00a0idtoken := ReadIdToken()  \u00a0\u00a0\u00a0\u00a0\/\/ \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 url \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u00a0\u00a0\u00a0\u00a0baseUrl := fmt.Sprintf(\"%s\/prices\/daily_quotes?code=%s\", BASE_URL, code) \u00a0\u00a0\u00a0\u00a0var url string \u00a0\u00a0\u00a0\u00a0if from != \"\" &amp;&amp; to != \"\" { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url = fmt.Sprintf(\"%s&amp;from=%s&amp;to=%s\", baseUrl, from, to) \u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url = fmt.Sprintf(\"%s&amp;date=%s\", baseUrl, date) \u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c idToken \u00a0\u00a0\u00a0\u00a0res := sendRequest(url, idtoken.IdToken)  \u00a0\u00a0\u00a0\u00a0\/\/ \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u00a0\u00a0\u00a0\u00a0var quotes DailyQuotes \u00a0\u00a0\u00a0\u00a0err_ := json.NewDecoder(res.Body).Decode(&amp;quotes) \u00a0\u00a0\u00a0\u00a0Check(err_) \u00a0\u00a0\u00a0\u00a0return quotes }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b:<\/p>\n<ul>\n<li>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 sendRequest \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439.<\/li>\n<li>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 DailyQuotes \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442.<\/li>\n<\/ul>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 sendRequest. \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u0451\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>http.Header<\/code>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432. \u0417\u0430\u0442\u0435\u043c \u043e\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 GET \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<pre><code class=\"go\">func sendRequest(url string, idToken string) *http.Response {  \u00a0\u00a0\u00a0\u00a0req, _ := http.NewRequest(http.MethodGet, url, nil) \u00a0\u00a0\u00a0\u00a0req.Header = http.Header{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\": {\"Bearer \" + idToken}, \u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0client := http.Client{}  \u00a0\u00a0\u00a0\u00a0res, _ := client.Do(req) \u00a0\u00a0\u00a0\u00a0return res }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0443 \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u0442\u0438\u0440\u043e\u0432\u043e\u043a. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u043c GoLand, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e JSON \u0432 \u0444\u0430\u0439\u043b \u043d\u0430 Go \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u043f\u0440\u043e\u0441\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c JSON \u0432 \u043a\u043e\u0434 \u043d\u0430 Go!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/jy\/7y\/nv\/jy7ynv4r3vvwspitffeclwnh62c.png\" data-src=\"https:\/\/habrastorage.org\/webt\/jy\/7y\/nv\/jy7ynv4r3vvwspitffeclwnh62c.png\"\/><\/div>\n<p>  \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n<pre><code class=\"go\">type Quote struct { \u00a0\u00a0\u00a0\u00a0Code             string   `json:\"Code\"` \u00a0\u00a0\u00a0\u00a0Close            float64  `json:\"Close\"` \u00a0\u00a0\u00a0\u00a0Date             JSONTime `json:\"Date\"` \u00a0\u00a0\u00a0\u00a0AdjustmentHigh   float64  `json:\"AdjustmentHigh\"` \u00a0\u00a0\u00a0\u00a0Volume           float64  `json:\"Volume\"` \u00a0\u00a0\u00a0\u00a0TurnoverValue    float64  `json:\"TurnoverValue\"` \u00a0\u00a0\u00a0\u00a0AdjustmentClose  float64  `json:\"AdjustmentClose\"` \u00a0\u00a0\u00a0\u00a0AdjustmentLow    float64  `json:\"AdjustmentLow\"` \u00a0\u00a0\u00a0\u00a0Low              float64  `json:\"Low\"` \u00a0\u00a0\u00a0\u00a0High             float64  `json:\"High\"` \u00a0\u00a0\u00a0\u00a0Open             float64  `json:\"Open\"` \u00a0\u00a0\u00a0\u00a0AdjustmentOpen   float64  `json:\"AdjustmentOpen\"` \u00a0\u00a0\u00a0\u00a0AdjustmentFactor float64  `json:\"AdjustmentFactor\"` \u00a0\u00a0\u00a0\u00a0AdjustmentVolume float64  `json:\"AdjustmentVolume\"` }  type DailyQuotes struct { \u00a0\u00a0\u00a0\u00a0DailyQuotes []Quote `json:\"daily_quotes\"` }<\/code><\/pre>\n<p>  \u0425\u043e\u0442\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c Dates \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0412\u0441\u0451, \u0447\u0442\u043e \u0438\u0434\u0451\u0442 \u0434\u0430\u043b\u0435\u0435, \u0432\u0437\u044f\u0442\u043e \u0438\u0437 <a href=\"https:\/\/kenzo0107.github.io\/2020\/05\/19\/2020-05-20-go-json-time\/\">\u043f\u043e\u0441\u0442\u0430<\/a> \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u044b JSON.<\/p>\n<p>  \u0422\u0438\u043f JSONTime \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0434\u0430\u0442\u0443 \u043a\u0430\u043a 64-\u0431\u0438\u0442\u043d\u043e\u0435 integer, \u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c JSONTime \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f\/\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f JSONTime. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0435 \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e JSON, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0438\u043b\u0438 integer.<\/p>\n<pre><code class=\"go\">type JSONTime int64  \/\/ String \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 unix \u0432 string func (t JSONTime) String() string { \u00a0\u00a0\u00a0\u00a0tm := t.Time() \u00a0\u00a0\u00a0\u00a0return fmt.Sprintf(\"\\\"%s\\\"\", tm.Format(\"2006-01-02\")) }  \/\/ Time \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 time.Time. func (t JSONTime) Time() time.Time { \u00a0\u00a0\u00a0\u00a0return time.Unix(int64(t), 0) }  \/\/ UnmarshalJSON \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 string \u0438 int JSON func (t *JSONTime) UnmarshalJSON(buf []byte) error { \u00a0\u00a0\u00a0\u00a0s := bytes.Trim(buf, `\"`) \u00a0\u00a0\u00a0\u00a0aa, _ := time.Parse(\"20060102\", string(s)) \u00a0\u00a0\u00a0\u00a0*t = JSONTime(aa.Unix()) \u00a0\u00a0\u00a0\u00a0return nil }<\/code><\/pre>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \u0441 <code>go test<\/code>.<\/p>\n<pre><code class=\"go\">\"2022-09-29\",1952.000000 \"2022-09-30\",1952.500000 \"2022-10-03\",1946.000000 PASS ok  \u00a0\u00a0\u00a0\u00a0github.com\/hellonico\/jquants-api-go\u00a0\u00a0\u00a0\u00a01.883s<\/code><\/pre>\n<p>  \u041d\u0430\u0448 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0433\u043e\u0442\u043e\u0432, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a \u043d\u0435\u043c\u0443 CI.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f CircleCI<\/font><\/h2>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0445\u043e\u0436\u0430 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 CircleCI \u043f\u043e <a href=\"https:\/\/circleci.com\/blog\/continuous-integration-for-go-applications\/\">\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441 Golang<\/a>.<\/p>\n<p>  \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0437 Docker \u0434\u043e <code>1.17<\/code>.<\/p>\n<pre><code class=\"plaintext\">version: 2.1 jobs:   build:     working_directory: ~\/repo     docker:       - image: cimg\/go:1.17.9     steps:       - checkout       - restore_cache:           keys:             - go-mod-v4-{{ checksum \"go.sum\" }}       - run:           name: Install Dependencies           command: go get .\/...       - save_cache:           key: go-mod-v4-{{ checksum \"go.sum\" }}           paths:             - \"\/go\/pkg\/mod\"       - run: go test -v<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 CircleCI:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gq\/ef\/1t\/gqef1t0ar6ompymvvfyk_w82onk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/gq\/ef\/1t\/gqef1t0ar6ompymvvfyk_w82onk.png\"\/><\/div>\n<p>  \u0422\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b USERNAME \u0438 PASSWORD \u0432 helper_test.go can \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a Environment Variables \u043f\u0440\u043e\u0435\u043a\u0442\u0430 CircleCI:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/x0\/ea\/kv\/x0eakvovhd7_5rppg3visoh1gbs.png\" data-src=\"https:\/\/habrastorage.org\/webt\/x0\/ea\/kv\/x0eakvovhd7_5rppg3visoh1gbs.png\"\/><\/div>\n<p>  \u041b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0442\u0432\u044c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 CircleCI (\u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e), \u0438 \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yp\/ny\/ap\/ypnyap6fr8snmdgsltre38ijg8c.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yp\/ny\/ap\/ypnyap6fr8snmdgsltre38ijg8c.png\"\/><\/div>\n<p>  \u041d\u0430\u0448\u0430 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0435\u0451 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 GitHub<\/font><\/h2>\n<p>  \u041f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043d\u0430\u0448 \u0444\u0430\u0439\u043b go.mod \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<pre><code class=\"bash\">module github.com\/hellonico\/jquants-api-go  go 1.17  require olympos.io\/encoding\/edn v0.0.0-20201019073823-d3554ca0b0a3<\/code><\/pre>\n<p>  \u0423\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 git tag. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c git tag \u0438 \u0437\u0430\u043f\u0443\u0448\u0438\u043c \u0435\u0433\u043e \u0432 GitHub \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"bash\">git tag v0.6.0 git push --tags<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442 \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0435\u0451 \u0432 <code>go.mod<\/code>.<\/p>\n<pre><code class=\"bash\">require github.com\/hellonico\/jquants-api-go v0.6.0<\/code><\/pre>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/font><\/h2>\n<p>  \u041d\u0430\u0448\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u043e\u0434\u0443\u043b\u044f flag, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043e\u0431\u0451\u0440\u0442\u043a\u0438.<\/p>\n<pre><code class=\"go\">package main  import ( \u00a0\u00a0\u00a0\u00a0\"flag\" \u00a0\u00a0\u00a0\u00a0\"fmt\" \u00a0\u00a0\u00a0\u00a0jquants \"github.com\/hellonico\/jquants-api-go\" )  func main() {  \u00a0\u00a0\u00a0\u00a0code := flag.String(\"code\", \"86970\", \"Company Code\") \u00a0\u00a0\u00a0\u00a0date := flag.String(\"date\", \"20220930\", \"Date of the quote\") \u00a0\u00a0\u00a0\u00a0from := flag.String(\"from\", \"\", \"Start Date for date range\") \u00a0\u00a0\u00a0\u00a0to := flag.String(\"to\", \"\", \"End Date for date range\") \u00a0\u00a0\u00a0\u00a0refreshToken := flag.Bool(\"refresh\", false, \"refresh RefreshToken\") \u00a0\u00a0\u00a0\u00a0refreshId := flag.Bool(\"id\", false, \"refresh IdToken\")  \u00a0\u00a0\u00a0\u00a0flag.Parse()  \u00a0\u00a0\u00a0\u00a0if *refreshToken { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0jquants.GetRefreshToken() \u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0if *refreshId { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0jquants.GetIdToken() \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0var quotes = jquants.Daily(*code, *date, *from, *to)  \u00a0\u00a0\u00a0\u00a0fmt.Printf(\"[%d] Daily Quotes for %s \\n\", len(quotes.DailyQuotes), *code) \u00a0\u00a0\u00a0\u00a0for _, quote := range quotes.DailyQuotes { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fmt.Printf(\"%s,%f\\n\", quote.Date, quote.Close) \u00a0\u00a0\u00a0\u00a0}  }<\/code><\/pre>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c CLI \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>go build<\/code>.<\/p>\n<pre><code class=\"bash\">go build<\/code><\/pre>\n<p>  \u0418 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:  <\/p>\n<ul>\n<li>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 ID.<\/li>\n<li>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0441 \u043a\u043e\u0434\u043e\u043c 86970 \u0441 20221005 \u043f\u043e 20221010.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"bash\">.\/jquants-example --id --refresh --from=20221005 --to=20221010 --code=86970  Code: 86970 and Date: 20220930 [From: 20221005 To: 20221010] [3] Daily Quotes for 86970  \"2022-10-05\",2016.500000 \"2022-10-06\",2029.000000 \"2022-10-07\",1992.500000<\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430. \u041c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f <code>statements<\/code> \u0438 <code>listedInfo<\/code>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e JQuants API, \u043d\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/github.com\/hellonico\/jquants-api-go\">\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0435<\/a>.<\/p>\n<blockquote><p><b><font color=\"#3AC1EF\"><a href=\"https:\/\/inlnk.ru\/dn6PzK\">Telegram-\u043a\u0430\u043d\u0430\u043b \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044f\u043c\u0438<\/a> \u0438 <a href=\"https:\/\/inlnk.ru\/ZZMz0Y\">\u0443\u044e\u0442\u043d\u044b\u0439 \u0447\u0430\u0442<\/a><\/font><\/b><\/p><\/blockquote>\n<p><a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=pishem_obyortku_dlya_api_tokijskoj_fondovoj_birzhi_na_golang\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sz\/7j\/pf\/sz7jpfj8i1pa6ocj-eia09dev4q.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sz\/7j\/pf\/sz7jpfj8i1pa6ocj-eia09dev4q.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/698740\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/698740\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/698740\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/_z\/pj\/nn\/_zpjnngh-0vz2vtkszldd6iafg4.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/_z\/pj\/nn\/_zpjnngh-0vz2vtkszldd6iafg4.jpeg\" data-blurred=\"true\"\/><\/div>\n<p><\/a><br \/>  \u0426\u0435\u043b\u0435\u0432\u044b\u043c REST API \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/jpx.gitbook.io\/j-quants-api-en\/api-reference\/\">jquants-api<\/a>, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/698090\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439<\/a> \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u042f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430 Golang, \u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u0435\u0447\u0435\u0440, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0443\u044e\u0441\u044f Golang-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u043d\u0430 <a href=\"https:\/\/github.com\/hellonico\/jquants-api-go\">GitHub<\/a>.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0432\u043a\u0440\u0430\u0442\u0446\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f API \u0438 \u043c\u043e\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u043f\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-341205","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/341205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=341205"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/341205\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=341205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=341205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=341205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}