2019年6月18日 星期二

Google API 筆記 - 使用 Google OAuth 2.0 與 IdToken 和 People API 取得 Email address

大概在 2015 年開發的 Google OAuth2 登入流程 已經需要更新了。當初一直靠 Google Plus API 取得用戶的 Email (GMail) 資訊,結果 Google+ APIs 已經在 2019/03/07 領便當了
https://developers.google.com/+/integrations-shutdown
停用 Google+ 整合服務
2019 年 3 月 7 日起,所有網站上與行動應用程式中的 Google+ 整合功能將全部停止運作。詳細情形如下:
網路整合 (例如外掛程式與互動訊息) 將停止提供服務。如果網站擁有者未採取任何行動,網站的版面配置和/或功能可能會受到影響。
行動應用程式整合 (例如 +1 按鈕、分享到 Google+ 與應用程式活動) 將停止運作。
我們將從 1 月下旬起逐漸停用相關功能。最早從 2019 年 1 月 29 日起,網站與行動應用程式整合功能會偶爾發生失敗的情形。
我們強烈建議開發人員儘快從其網站上和/或行動應用程式中移除相關程式碼。我們也將陸續停用 Google+ API 和 Google+ 登入功能。詳情請參閱這份額外
通知。
雖然我們即將停用 Google+ 一般使用者版本,但我們同時致力為企業機構 提供 Google+ 服務。Google+ 即將換上全新風貌並加入新功能,如需詳細資訊, 請參閱這篇網誌文章
原先是靠這 Google Plus API 取得 Email address:

<?php
$profile_ret = @json_decode(file_get_contents('https://www.googleapis.com/plus/v1/people/me?'.http_build_query( array(
'access_token' => $access_token,
))), true);


現在就改靠 People API:https://developers.google.com/people/api/rest/v1/people/get

<?php
$profile_ret =  @json_decode(file_get_contents('https://people.googleapis.com/v1/people/me?'.http_build_query( array(
'personFields' => 'names,nicknames,emailAddresses,coverPhotos,photos',
'access_token' => $access_token,
))), true);


在 2019 年 06 月,這隻 Google Plus api : https://www.googleapis.com/plus/v1/people/me 仍正常工作著,說不定它就真的是一直從 People API 服務著。

除此之外,原先 Google OAuth2 已經推薦改用 IdToken 進行認證,若是走 IdToken 時,可以在當下就拿到 Email Address 了:

<?php

require_once 'vendor/autoload.php';

$client = new Google_Client();
$client->setClientId($oauth_project_client_id);
$client->setClientSecret($oauth_project_secret_key);
$client->setAccessType("offline");
$client->addScope(['email','profile']);
$client->setRedirectUri($oauth_callback_url);

$token = $client->fetchAccessTokenWithAuthCode($code);
$token_data = $client->verifyIdToken();

$uid = $token_data['sub'];
$email = isset($token_data['email_verified']) && $token_data['email_verified'] ?$token_data['email'] : NULL;


如此就搞定取得用戶 Email address 的項目了!

其他筆記:

$ curl -s 'https://people.googleapis.com/v1/people/me?personFields=names%2Cnicknames%2CemailAddresses%2CcoverPhotos&access_token=USER_ACCESS_TOKEN'
{
  "resourceName": "people/UID",
  "etag": "XXXXXXXXXXXX",
  "names": [
    {
      "metadata": {
        "primary": true,
        "source": {
          "type": "PROFILE",
          "id": "UID"
        }
      },
      "displayName": "NICKNAME",
      "familyName": "LAST_NAME",
      "givenName": "FIRST_NAME",
      "displayNameLastFirst": "LAST_NAME, FIRST_NAME"
    }
  ],
  "coverPhotos": [
    {
      "metadata": {
        "primary": true,
        "source": {
          "type": "PROFILE",
          "id": "UID"
        }
      },
      "url": "https://XXX.googleusercontent.com/cXXXXXXX",
      "default": true
    }
  ],
  "emailAddresses": [
    {
      "metadata": {
        "primary": true,
        "verified": true,
        "source": {
          "type": "ACCOUNT",
          "id": "UID"
        }
      },
      "value": "[email protected]"
    }
  ]
}

2019年6月15日 星期六

透過 BuyAndShip 購買 Amazon JP 的 Kindle Paperwhite 完整教學

Kindle Paperwhite

大概十年前,在工作上也算半隻腳踏入電子書領域,那時已經拿著幾台 Kindle 把玩,但最後投入了 iPad 懷抱 XD 在 2010 買了 iPad,沒想到 2019 年終於買一台 Kindle 來用用。這是台 Amazon JP 牌的 Kindle ,預設的商城是 Amazon JP。

事隔 10 年,拿到 Kindle 時,真的覺得很小台。記得 10 年前還沒這麼小?可能是當時有實體 keyboard 吧。長大概是兩張名片長,寬是兩張名片寬再多一點。

Kindle Paperwhite 02

這次是第一使用 BuyAndShip 服務,因為 Amazon JP Kindle 只能送貨到日本當地,就試試看在日本有倉庫的 BuyAndShip 國際網購代運。他是香港的公司,在世界幾處有倉庫,像我想買 Amazon JP Kindle 且Amazon JP把此商品限定寄送日本當地時,就把收信人填寫 BuyAndShip 在日本倉庫的地址,收信人則帶有自己在 BuyAndShip 的帳號資訊(姓名 + BuyAndShip 代號)。當 BuyAndShip 日本倉庫收件後,會立即再運到香港。BuyAndShip 用戶在填集運單發貨到台灣宅配收工。

整個 BuyAndShip 是秤重計費的。最近 BuyAndShip 台灣有活動,新建帳戶有 120 點數(若透過推薦人,首次交易完14天後又可以再多 200 點數),一點代表一塊台幣,而 120 點足以支付一磅的商品,而 Kindle 是 0.8 磅!若 Amazon JP 寄送到日本當地免運,那就沒有其他費用要支出,全程只有 Amazon JP 刷卡費(+銀行信用卡國際費用),理論上境外商品進台灣還有關稅問題,但這段我不是很懂,BuyAndShip.com.tw 在官網上說台灣的關稅他都包了 XD

www.buyandship.com.tw

整個流程:

1. 註冊 BuyAndShip 帳號( 若想再拿額外 200 點數,請點此 https://www.buyandship.com.tw/invite/2793172439/ 並且在推薦欄位上寫 2793172439

BuyAndShip 推薦朋友

2. 完成帳號註冊後,可在海外倉庫地址上,取得倉庫資訊,網頁上都有範例請你填寫收件人的方式,以及倉庫地址等等:

BuyAndShip 海外倉庫地址

後續就是 Amazon JP 為例,在此就不多提 Amazon JP 帳號的註冊等(其實有些可以台灣收件的商品,就可以不用靠 BuyAndShip 了)。接著在 Amazon JP 購物時,就填寫寄送到 BuyAndShip 倉庫,主要是收件人和地址要有 BuyAndShip 個人代號。

接著 Amazon JP 發貨後,會顯示是靠哪家公司寄送以及貨品追蹤碼:

AmazonJP發貨追蹤碼資訊

如此剩下的事就都在 BuyAndShip 網站了!首先填寫申報貨件

01申報貨件

02申報貨件確認

03完成申報貨件

如此就完成第一階段的任務,接下來就是等待,等待貨品寄送到日本倉庫!這時我覺得 BuyAndShip 最方便的地方是每一步都會有狀態回報。當商品寄送到倉庫後,除了 Amazon JP 可以查看送貨情況外,當然 BuyAndShip 也會更新狀態,將貨件狀態更改為海外入庫,而後續也不用做什麼,會自動再轉成準備海外出庫,進入海外出庫後,下一步就是香港倉庫:

04海外入庫

05海外出庫

在香港倉庫時,就可以填寫轉運單,這時就會挑選要宅配回台灣哪裡了,在此步就會要付錢給 BuyAndShip 囉!由於創建帳號有 120 點,就在此用點數支付完畢:

06香港倉庫

填寫完就進入轉運單追蹤:

08準備發貨-黑貓宅配

一開始還不會有宅配的資訊,大概過個1~2天就會出現(此例使用黑貓宅急便),雖然有單號了,還是查不到(因為黑貓只是把寄貨單發到各處,不代表已經被黑貓收件),如此,可以什麼都不管了,只等著黑貓寄貨到家囉。

收到商品後,看起來 BuyAndShip 也沒拆開,直接在包一層就寄出去了!

BuyAndShip

拆開後都是 Amazon JP 的包裝封套,拆開後是 Amazon JP 對商品的保護:

Kindle Paperwhite 04

Kindle Paperwhite 05

經過這次試用 BuyAndShip 後,覺得令人不安的地方都有被 BuyAndShip 不斷更新貨品狀態而解決了!加上在首次使用靠 120 點數而不用付費,更是降低戒心 XD 往後若有不能直寄台灣的商品,就還會再來用用看的。目前比較搞不懂的還是進台灣的關稅問題,目前 BuyAndShip 都說會自行吸收處理,未免太佛心了吧 :P 但 BuyAndShip 有限制商品大小,應當也是種自保機制。

2019年6月2日 星期日

[書] Zero to One 再讀一次

Zero to One

當年跟風買了這本書,印象中是 2016 年。不過,一直有其他事中斷而沒看完。這次一口氣把它解決了!這其實不會很多,才兩百五十頁的量。

在看玩這本書之前,我反而先看完了很多類似概念的書籍,若要說最相關的大概屬這本吧
這次讀後感最深的反而是:
  • 真正處於優勢的公司,會刻意裝傻裝嫩來持續壟斷市場
  • 樂觀主義+確定的未來、樂觀主義+不確定的未來
    • 樂觀主義+確定的未來:會大膽衝刺嘗試新東西
    • 樂觀主義+不確定的未來:專研營運效率的最佳化(追求已知的 CP值)
  • 公司的經營上可分成所有權(股權)、經營權(日常營運)、控制權(督導公司),若有人身兼兩職就容易有紛爭
    • 新創:創辦人、員工、董事會
    • 草創:創辦人、創辦人、創投
  • 行銷與產品,兩者產出的品質都很重要
    • 第一次得知行銷重要剛好都是在 2014 年,在聽以前的老闆談論 OnePlus 興起的過程,另一個案例則是大自己一歲的學長成功透過眾籌推銷產品,拿了錢後才開始做產品!
    • 兩者重要的意義是,不能擺爛 XD 不能想靠行銷來掩飾掉產品的缺點,也不能因為自認產品好而就不花心力行銷
    • 行銷成本可細分成:病毒式行銷(1美金)、市場行銷(100美金)、死亡地帶、個人銷售(一萬美金)、複雜銷售(100萬美金),其中死亡地帶是指 100~10000 美金之間,很難評估該怎樣行銷的處境,屬於銷售瓶頸
  • 打造美好的未來
    • 歷史上的軌跡總是興衰交替著,這跟其他書籍分享的概念很像,如何抓到機會就看個人的本領了 XD
看完這本書後,心情比當年更沉靜許多,當年的情緒噴張,非常想衝出個大事業,但隨著經歷的增加,真的,一切都是默默努力順勢而來的成果,急不得的。像在李笑來的書裡就很明確地在談論要重視自身發展,也就是 “專注力 > 時間 > 金錢” 的概念。若擺在面對新興產業的發展時,就會明瞭此刻的無力是因為過去自己的能力並沒有相對應的累積或是舞台還沒出現,應當繼續專注自己的發展(想要的未來),不是到處跟風(包含從技術角度學了一卡車的新東西,某個角度來說,該成果無法在未來產生價值也是種時間浪費)

最後,這本書是在 2014 年 10 月出第一版的,書後面談論了幾間公司(都是 Paypal 幫),其中特斯拉的情況剛好很好玩,書裡提到他的盛況,但最近剛好是特斯拉的慘況 XD 股價跌回 2016 年了:

TSLA stock

2019年5月19日 星期日

Javascript 開發筆記 - 強制 HTTPS 瀏覽機制

HTTPS redirect

用 Blogger 搭配自訂網域時,可以靠 cloudflare 提供免費的 SSL 憑證,以此提供免費的 HTTPS 加密瀏覽體驗,然而,在 Blogger.com 使用 HTTPS 時,有個選項詢問是否開啟 HTTPS 重新導向,若採用 blogspot.com 網域是可以打開的,但使用自訂網域則不適合導向,會產生 loop。

這時就靠 javascript 躲在 <HEAD> 來做事吧

<script>

if (location.protocol != 'https:') {
location.href = 'https:' + window.location.href.substring(window.location.protocol.length);
}

</script>

Google Adsense 無效流量 排除方式

Adesne 無效流量

Google Adsense 有自己一套的無效流量判斷方式(黑盒子),在今年三月時,忽然發現無效流量大量提升,由於有追蹤各大服務的廣告單元,幾乎可以判定某個服務全部都被判定為無效流量,該廣告單元的收入全部歸零。

這時只好寄信煩一下 Google Adsense 支援小組,負責回應的,可以透露無效流量由高到底的廣告單元,如此就能證實自己的猜想,緊接著要想想到底該怎樣解決。

由於 Google Adsense 為了避免亂買流量、亂跟人行銷合作。因此並不透露什麼判定規則,只會像 NPC 回饋:
  • 用戶來自哪里?
  • 用戶如何與我的應用進行互動?
  • 用戶在我的應用中查看了哪些屏幕?
後來想了一陣子後,想到的“網域切換"的行爲,會不會被誤判成無效流量(買流量),事實證明真的解掉了!而我一開始則不斷抱怨服務已經超過半年沒改版,怎會突然被判定成無效流量?最終 Google Adsense 支援小組則是回饋:不是誤判,而是 Google Adsense 判斷機制變嚴格了!

此例被判定成無效流量的情境:
  1. 為了做服務轉移,從 A Domain 轉換到 B Domain 來維護,其中 A Domain 還富有 Session 等大量追蹤機制初始化
  2. A 跟 B Domain 都有註冊到 Google Adsense 
  3. 服務使用時,會很快從 A Domain 轉址到 B Domain
後續排除的解法就轉址時,從原本要進入 A Domain 內的 PHP Code 處理,改移至到 Web server rewrite rules 來排除,加速更快的跳轉,也避開 A Domain 的 session 初始化。