這是我在已經抵達,迄今:
{-# LANGUAGE OverloadedStrings #-}
import Data.Yaml
import Control.Monad
import Data.ByteString.Char8 (pack, unpack)
import Data.Monoid
import Network.Google.OAuth2
import Network.HTTP.Conduit
import Network.HTTP.Types (hAuthorization)
import qualified Data.ByteString.Char8 as B8
import qualified Data.ByteString.Lazy.Char8 as L8
data OAuth2Credentials = OAuth2Credentials {
getClientID :: String,
getClientSecret :: String
} deriving (Show, Eq)
instance FromJSON OAuth2Credentials where
parseJSON (Object value) = OAuth2Credentials <$>
value .: "clientID" <*>
value .: "clientSecret"
parseJSON _ = mzero
parseOAuth2Credentials :: String -> Maybe OAuth2Credentials
parseOAuth2Credentials source = Data.Yaml.decode $ pack source
main :: IO()
main = do
source <- readFile "analytics-credentials.yml"
let creds = parseOAuth2Credentials source
case creds of
Just creds -> do
let client = OAuth2Client (getClientID creds) (getClientSecret creds)
token <- getAccessToken client authScope (Just tokenCacheFile)
request <- parseUrl analyticsQueryURL
response <- withManager $ httpLbs $ authorize token request
L8.putStrLn $ responseBody response
Nothing -> return()
where
authorize token request = request { requestHeaders = [(hAuthorization, B8.pack $ "Bearer " <> token)] }
analyticsQueryURL = "…"
authScope = ["https://www.google.com/analytics/feeds/"]
tokenCacheFile = "analytics-token.yml"
不完全捲曲和不完全簡單,但最初的基於瀏覽器的令牌生成後的訪問令牌在文件和後續請求緩存不需要任何人機交互。
您是否正在使用* just * curl進行此操作,或者您是否更加廣泛地詢問如何從命令行執行此操作(可能需要多次往返),而無需通過基於瀏覽器的用戶名/密碼流每一次?如果你用* curl做這個問題,答案是這是不可能的。 –
不能夠使用一個單一的捲曲電話很爛,但我可以理解。更復雜的命令行解決方案將如何顯示,您可以將其添加爲答案嗎?謝謝! – zoul
這可能有助於您的研究https://developers.google.com/identity/protocols/OAuth2ForDevices?hl=en它仍然會來來回回,一旦設置它相對容易,說一個PHP腳本,但與直線捲曲你會遇到很多來回的令牌。 – williamvicary