2020年10月29日 星期四

Laravel & Google BigQuery

 

因為最近要從Firebase Cloud Message發出訊息通知,並要將發送的結果撈出,所以做了點筆記。免得以後忘記。

安裝官方版套件:
  • 安裝:
            在Laravel 安裝 官方版BigQuery套件 composer require google/cloud-bigquery
    
  • 認證方式: 
      有兩種方式可以設定認證方式
      use Google\Cloud\BigQuery\BigQueryClient;

      // Authenticating with keyfile data.
        $bigquery= new BigQueryClient([
        'keyFile' => json_decode(file_get_contents('/path/to/keyfile.json'), true)
        ]);

        // Authenticating with a keyfile path.
        $bigquery= new BigQueryClient([
        'keyFilePath' => '/path/to/keyfile.json'
        ]);

        另外還需要提供Google Cloud project ID才能往下做下去.
        // Providing the Google Cloud project ID.
        $bigquery= new BigQueryClient([
        'projectId' => 'myProject'
        ]);
    
  • 範例:
         public function run_query(){
            $bigQuery = new BigQueryClient([
                'keyFilePath' => "../".env('GOOGLE_APPLICATION_CREDENTIALS'),
                'projectId' => "project_id",
            ]);
        
            // 统计消息指向的非重复应用实例(instance)的数量
            $query = "SELECT COUNT(DISTINCT instance_id)
            FROM `project_id.firebase_messaging.data`
            WHERE
            _PARTITIONTIME = TIMESTAMP('2020-10-27')
            AND event = 'MESSAGE_ACCEPTED';";
        
            $queryJobConfig = $bigQuery->query($query);
            
            $queryResults = $bigQuery->runQuery($queryJobConfig);
        
            foreach ($queryResults as $row) {
                print_r($row);
            }
        }

將內容抓出後可能會看到一些欄位與相關的單詞,可以參考下面的表格內容:
_PARTITIONTIME时间戳此伪代码列包含数据加载当天的起始的时间戳(采用世界协调时间 (UTC))。对于 YYYYMMDD 分区的情况,此伪代码列包含值 TIMESTAMP('YYYY-MM-DD')。
event_timestamp时间戳服务器记录的事件时间戳
project_numberINTEGER发送消息的项目的唯一编号
message_idSTRING消息 ID 用于标识消息。消息 ID 根据应用 ID 和时间戳生成,在某些情况下可能不是全局唯一的。
instance_idSTRING消息发送到的应用的实例 ID(如有)
message_typeSTRING消息的类型。可以是通知消息或数据消息。主题用于标识主题或广告系列发送的原始消息;后续消息则为通知消息或数据消息。
sdk_platformSTRING接收消息的应用所在的平台
app_nameSTRINGAndroid 应用的软件包名称或 iOS 应用的软件包 ID
collapse_keySTRING标识一组可折叠消息的折叠键。若未连接设备,则仅具有给定折叠键的最后一条消息将排队等待最终传送。
优先级INTEGER消息的优先级。有效值包括“normal”(普通)和“high”(高)。在 iOS 中,这些值相当于 APNs 优先级中的 5 和 10
ttlINTEGER此参数指定设备离线后消息在 FCM 存储中保留的时长(以秒为单位)
topicSTRING消息发送到主题的名称(如适用)
bulk_idINTEGER标识一组相关消息(例如向某个特定主题发送的一组消息)的批量 ID
事件STRING事件的类型。可能的值包括:MESSAGE_ACCEPTED:FCM 服务器收到消息,且请求有效;
MESSAGE_DELIVERED:消息已发送到设备上的应用的 FCM SDK。默认情况下,此字段不会被传播。要启用此功能,请按照 [`setDeliveryMetricsExportToBigQuery(boolean)`](https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessaging#public-void-setdeliverymetricsexporttobigquery-boolean-enable)) 中的说明进行操作。

MISSING_REGISTRATIONS:由于注册缺失,请求被拒绝;
UNAUTHORIZED_REGISTRATION:消息被拒绝,因为发送者无权向注册发送消息;
MESSAGE_RECEIVED_INTERNAL_ERROR:处理消息请求时发生不明错误;
MISMATCH_SENDER_ID:由于发送消息的发送者 ID 与声明的端点 ID 消息不匹配,发送消息的请求被拒绝;
QUOTA_EXCEEDED:由于配额不足,发送消息的请求被拒绝;
INVALID_REGISTRATION:由于注册无效,发送消息的请求被拒绝;
INVALID_PACKAGE_NAME:由于软件包的名称无效,发送消息的请求被拒绝;
INVALID_APNS_CREDENTIAL:由于 APNS 证书无效,发送消息的请求被拒绝;
INVALID_PARAMETERS:由于参数无效,发送消息的请求被拒绝;
PAYLOAD_TOO_LARGE:由于负载超出限制,发送消息的请求被拒绝;
AUTHENTICATION_ERROR:由于出现身份验证错误,发送消息的请求被拒绝(请检查用于发送消息的 API 密钥);
INVALID_TTL:由于 TTL 无效,发送消息的请求被拒绝。
analytics_label字符串借助 HTTP v1 API 时,可以在发送消息时设置分析标签,以便标记消息以供分析之用
  • 參考網址: