跳到主要內容

Graph API基本原理

一個臉書應用程式,除了本身自己的功能外,會需要臉書的不過就是需要它的社交網路,取取資料、改改資料或貼貼資料。對使用Graph API而言,就是CRU(Create、Read、Update)。那Delete勒?我想除非是一個臉書功能相關的管理程式,像是Facebook手機版,否則不太會需要用到Delete。這些操作的內容,其實是對應到HTTP不同種類的request:

  • HTTP Get: Read。Graph API中最廣泛的使用,取資料就靠它。
  • HTTP Post: Create、Update、Delete。新增、修改、刪除資料都可以透過它,但大都用於新增與修改。
  • HTTP Delete: Delete。刪除資料就靠它,但並非所有的Client都支援Delete的Request,所以POST request也提供刪除的功能。

為了讓大家容易了解,接下來我會透過範例,並使用Graph API Explorer示範這些操作。

  • 我想知道我的好友中,有幾個裝這個應用程式。
  • 我要發佈訊息到塗鴉牆。
  • 我要刪除我發布的訊息。

HTTP Get

先前介紹Graph API所提到的操作,都是很單純的用HTTP Get去取得資料。今天在這我就介紹給大家一定會使用到的應用: 取得已安裝應用程式的朋友。在我的國軍登出倒數計時器APP中,提供了朋友的資訊,讓你知道有多少人安裝了這個APP。

除了主要功能會用到外,要邀請朋友當然也會需要去濾掉那些已經安裝的朋友們拉! 送禮物或索討禮物也會想先發給安裝的朋友們! 那我們該如何取到這樣的資訊呢?

「透過HTTP Get去取得朋友的清單,接著使用Field Selection功能去顯示出User Object的installed欄位。」

這個操作僅會使用到User的Object,包含friends connection與installed field。讓我們看看透過Explorer Query的結果:


如上圖所示,如果User的結果中有installed且為true,就代表它有安裝這個APP。

使用Graph API取資料,我認為要點是: 「先思考你要找的東西中心點為何? 它所對應的物件為何? 此中心點與要找的東西關聯性為何? 最後才看看你要的屬性為何?」

除了上述提到的Field Selection功能,Graph API還支援Paging、Locale、Search等功能。有興趣的鄉民可以至各連結或Document中研究與練習。

HTTP Post

常見如讚(like)、貼文(feed)、回文(comment)等,都是Post操作,使用也相當簡單。


假設我想告訴大家輔大操場有正妹,還要點讚推文好讓大家都看的到。我要做兩個Post操作: feed與like, 貼文(feed)的格式為:

https://graph.facebook.com/PROFILE_ID/feed

讚(like)的格式為:

https://graph.facebook.com/OBJECT_ID/likes

因為我要發佈到我的塗鴉牆,所以PROFILE_ID是我的ID或用me替代。接著新增一個field(Post操作才有),key為message,value就是把輔大有正妹的消息告訴大家。接著加上feed的connection:

在做完貼文的操作後,我們可以取得一個ID(這是PROFILE_ID和POST_ID串起來的),這就是OBJECT_ID。將它加上likes的connection:

最後到塗鴉牆上,就可以發現有幾個色坏(我除外)來點讚了:


當你想新增或修改什麼東西的時候,「先看看中心物件為何?再看看此中心物件與你要新增修改的關係為何?」。這樣子就可以透過文件看看該如何做,去達到你想要的結果:

像打卡中心就是自己(User Object),checkins就是關係connections。從文件中可以知道必須至少給它地點ID與座標所在的參數。

HTTP Delete

Delete也相當容易,直接指定OBJECT_ID即可。

https://graph.facebook.com/OBJECT_ID

像是要砍掉在Post範例中的貼文:


需要另外注意的是:有些刪除動作是要打斷connections。之前點讚是透過對某物件的likes connections做Post,收回讚就是對某物件的likes connections做Delete就可以了!

我認為訣竅是:「刪物件用ID,斷連結用ID+Connections。」

Summary

不管是先前的Graph API介紹或本篇文章,目的都是為了讓大家了解“根本”,其實早就有人將Graph API包裝成各自語言的API了。但API該如何使用,或是如何擴充API都必須了解Graph API之根本才行。希望Graph API介紹系列的文章能給予大家一些幫助。

Reference

留言

這個網誌中的熱門文章

Show NIC selection when setting the network command with the device option

 Problem  在answer file中設定網卡名稱後,安裝時會停在以下畫面: 所使用的command參數如下: network --onboot = yes --bootproto =dhcp --ipv6 =auto --device =eth1 Diagnostic Result 這樣的參數,以前試驗過是可以安裝完成的。因此在發生這個問題後,我檢查了它的debug console: 從console得知,eth1可能是沒有連接網路線或者是網路太慢而導致的問題。後來和Ivy再三確認,有問題的是有接網路線的網卡,且問題是發生在activate階段: Solution 我想既然有retry應該就有次數或者timeout限制,因此發現在Anaconda的說明文件中( link ),有提到dhcptimeout這個boot參數。看了一些人的使用範例,應該是可以直接串在isolinux.cfg中,如下: default linux ksdevice = link ip =dhcp ks =cdrom: / ks.cfg dhcptimeout = 90 然而我在RHEL/CentOS 6.7與6.8試驗後都無效。 因此我就拿了顯示的錯誤字串,問問Google大師,想找一下Anaconda source code來看一下。最後找到別人根據Anaconda code修改的版本: link ,關鍵在於setupIfaceStruct函式中的setupIfaceStruct與readNetConfig: setupIfaceStruct: 會在dhcp時設定dhcptimeout。 readNetConfig: 在writeEnabledNetInfo將timeout寫入dhclient config中;在wait_for_iface_activation內會根據timeout做retry。 再來從log與code可以得知,它讀取的檔案是answer file而不是boot command line。因此我接下來的測試,就是在answer file的network command上加入dhcptimeout: network --onboot = yes --bootproto =dhcp --ipv6 =auto --device =eth1 --dhcptimeo

解決RobotFramework從3.1.2升級到3.2.2之後,Choose File突然會整個Hand住的問題

考慮到自動測試環境的維護,我們很久以前就使用java去執行robot framework。前陣子開始處理從3.1.2升級到3.2.2的事情,主要先把明確的runtime語法錯誤與deprecate item處理好,這部分內容可以參考: link 。 直到最近才發現,透過SeleniumLibrary執行Choose File去上傳檔案的動作,會導致測試案例timeout。本篇文章主要分享心路歷程與解決方法,我也送了一條issue給robot framework: link 。 我的環境如下: RobotFramework: 3.2.2 Selenium: 3.141.0 SeleniumLibrary: 3.3.1 Remote Selenium Version: selenium-server-standalone-3.141.59 首先並非所有Choose File的動作都會hang住,有些測試案例是可以執行的,但是上傳一個作業系統ISO檔案一定會發生問題。後來我透過wireshark去比對新舊版本的上傳動作,因為我使用 Remote Selenium ,所以Selenium會先把檔案透過REST API發送到Remote Selenium Server上。從下圖我們可以發現,在3.2.2的最後一個TCP封包,比3.1.2大概少了500個bytes。 於是就開始了我trace code之路。包含SeleniumLibrary產生要送給Remote Selenium Server的request內容,還有HTTP Content-Length的計算,我都確認過沒有問題。 最後發現問題是出在socket API的使用上,就是下圖的這支code: 最後發現可能因為開始使用nio的方式送資料,但沒處理到尚未送完的資料內容,而導致發生問題。加一個loop去做計算就可以解決了。 最後我有把解法提供給robot framework官方,在他們出新的版本之前,我是將改完的_socket.py放在我們自己的Lib底下,好讓我們測試可以正常進行。(shutil.py應該也是為了解某個bug而產生的樣子..)

PostgreSQL - Unattended installation on windows

Introduction 要將別人軟體包裝到自己軟體中,不可或缺的東西就是Unattended installation。以Unattended installation來說,我們可以選擇透過Installer的silent mode安裝,也可以透過把目標軟體做成portable的版本。本篇文章分享這兩種方法,教導大家如何將PostgreSQL透過Unattended installation方式安裝到目標系統成為service。 Note. 本篇以PostgreSQL 10.7為例。 Install with installer Tips 安裝程式或反安裝程式的參數,除了可以直接上官網搜尋Installation User Guide以外,也可以直接使用help參數查詢: postgresql- 10.7 - 2 -windows-x64.exe --help Windows安裝程式主要有EnterpriseDB與BigSQL兩種。BigSQL版本安裝元件是透過網路下載且支援參數不如EnterpriseDB版本多,以我們需求來說,我們傾向於使用EnterpriseDB版本。接下來分享給大家安裝與反安裝方法。 Installation @ echo off set INSTALL_DIR =C:\postgres10 set INSTALLER =postgresql- 10.7 - 2 -windows-x64.exe   rem options for installation set SSMDB_SERVICE =postgresql- 10 set MODE =--unattendedmodeui none --mode unattended   set DB_PASSWD =--superpassword postgres set DB_PORT =--serverport 5432   set SERVICE_NAME =--servicename % SSMDB_SERVICE %   set PREFIX =--prefix "%INSTALL_DIR%" set DATA_DIR =--datadir "%INSTALL_DIR%\data"   set OPTIONS =