| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <?php
- namespace app\adapter;
- // 头条-适配器
- use app\process\Http;
- use GuzzleHttp\Client;
- use support\think\Db;
- class ToutiaoAdapter
- {
- public function OAuth($callback)
- {
- $authCode = $callback['auth_code'];
- $cmid = $callback['state']['cmid'];
- $Account = Db::connect('db_advert')->name('ad_advertiser_app')->select()->toArray();
- $Account = array_column($Account, null, 'id');
-
- // 1. 根据cmid获取appid和secret
- $appId = $Account[$cmid]['app_id'];
- $secret = $Account[$cmid]['app_secret'];
- $tokenUrl = $Account[$cmid]['token_url'];
- // 2. 授权access_token 和 refresh_token
- $url = $tokenUrl;
- $header = ['Content-Type: application/json'];
- $request_data = json_encode([
- 'app_id'=>$appId,
- 'secret'=>$secret,
- 'grant_type'=>'auth_code',
- 'auth_code'=>$authCode,
- ]);
- $httpClient = new Client(['timeout' => 10]);
- $res = $httpClient->request('POST', $url, [
- 'json' => $request_data,
- 'headers' => $header,
- ]);
- $result = json_decode($res->getBody(), true);
- $data = $result['data'] ?? [];
-
- // 执行验证callback, 返回授权后的字段,跟数据库对应
- return [
- "advertiser_id" => $data['advertiser_id'],
- "advertiser_ids" => $data['advertiser_ids'],
- "access_token" => $data['access_token'],
- "refresh_token" => $data['refresh_token'],
- "refresh_token_expires_in" => $data['refresh_token_expires_in'],
- "expires_in" => $data['expires_in'],
- "cmid" => $cmid,
-
- ];
- }
- // 写入授权结果
- public function writeOAuthResult($data)
- {
- // 写入ad_advertiser_bm表
- if ($data['access_token']){
- $accounts = $data['advertiser_ids'];
- foreach($accounts as $account_id){
- $record = Db::connect('db_advert')->name('ad_advertiser_bm')
- ->where('advertiser_id', $account_id)
- ->find();
- if (!$record){
- $record = [
- 'advertiser_id' => $account_id,
- 'advertiser_name' => $account_id,
- 'access_token' => $data['access_token'],
- 'refresh_token' => $data['refresh_token'],
- ];
- Db::connect('db_advert')->name('ad_advertiser_bm')->insert($record);
- }else{
- Db::connect('db_advert')->name('ad_advertiser_bm')->where('advertiser_id', $account_id)->update([
- 'access_token' => $data['access_token'],
- 'refresh_token' => $data['refresh_token'],
- 'advertiser_id' => $account_id,
- 'advertiser_name' => $account_id,
- ]);
- }
- }
- }
- }
- // 获取子账号列表
- public function getSubAccounts($oathInfo)
- {
- $advertiserId = $oathInfo['advertiser_id'];
- $accessToken = $oathInfo['access_token'];
- $appId = $oathInfo['app_id'];
- // 根据授权返回的 advertiser_id 和 access_token 获取子账号列表
- $url = 'https://ad.oceanengine.com/open_api/2/majordomo/advertiser/select/';
- $header = [
- 'Access-Token' => $accessToken,
- 'Content-Type' => 'application/json',
- ];
- $requestData = [
- 'advertiser_id' => $advertiserId,
- ];
- $url = $url."?".http_build_query($requestData);
- $httpClient = new Client(['timeout' => 10]);
- $res = $httpClient->request('GET', $url, [
- 'headers' => $header,
- ]);
- $result = json_decode($res->getBody(), true);
- $list = $result['data']['list'] ?? [];
- $toutiaoAccountList = Db::connect('db_advert')->name('ad_advertiser_list')->where('media_id', 1)->select()->toArray();
- $toutiaoAccountMap = array_column($toutiaoAccountList, null, 'advertiser_id');
- foreach($list as $val){
- if(!isset($toutiaoAccountMap[$val['advertiser_id']])){
- Db::connect('db_advert')->name('ad_advertiser_list')->insert([
- 'advertiser_id' => $val['advertiser_id'],
- 'advertiser_name' => $val['advertiser_name'],
- 'app_id'=>$appId,
- 'bmid' => $advertiserId,
- 'media_id' => 1,
- ]);
- }
- }
- }
- // 刷新 token
- public function refreshToken($data)
- {
- $cmid = $data['cmid'];
- $advertiserId = $data['advertiser_id'];
- $accountApp = Db::connect('db_advert')->name('ad_advertiser_app')->where('id', $cmid)->find();
- $refreshToken = Db::connect('db_advert')->name('ad_advertiser_bm')->where('advertiser_id', $advertiserId)->value('refresh_token');
- if($refreshToken){
- $url = $accountApp['refresh_url'];
- $header = ['Content-Type: application/json'];
- $request_data = json_encode([
- 'app_id'=>$accountApp['app_id'],
- 'secret'=>$accountApp['app_secret'],
- 'grant_type'=>'refresh_token',
- 'refresh_token'=>$refreshToken
- ]);
- $httpClient = new Client(['timeout' => 10]);
- $res = $httpClient->request('POST', $url, [
- 'json' => $request_data,
- 'headers' => $header,
- ]);
- $result = json_decode($res->getBody(), true);
- $data = $result['data'] ?? [];
- // 更新管家的token相关
- if ($data['access_token']){
- Db::connect('db_advert')->name('ad_advertiser_bm')->where('advertiser_id', $advertiserId)->update([
- 'access_token' => $data['access_token'],
- 'refresh_token' => $data['refresh_token'],
- 'refresh_token_expires_in' => $data['refresh_token_expires_in'],
- 'expires_in' => $data['expires_in'],
- ]);
- }
- }
- return $data;
- }
- // 获取小时消耗
- public function getHourlyCost($advertiserId, $accessToken, $date): array
- {
- $page = 1;
- $data = [];
- do {
- $url = 'https://ad.oceanengine.com/open_api/v3.0/report/custom/get/';
- $request_data = [
- 'advertiser_id'=>$advertiserId,
- 'dimensions'=>json_encode(["cdp_project_id","cdp_project_name","ad_platform_cdp_project_action_track_url","ad_platform_cdp_project_download_url","stat_time_hour"]),
- 'metrics'=>json_encode(["stat_cost","show_cnt","click_cnt","convert_cnt"]),
- 'filters'=>'[{"operator":4,"values":["0"],"field":"stat_cost","type":3}]',
- 'start_time'=>$date,
- 'end_time'=>$date,
- 'order_by'=>json_encode([]),
- 'page'=>$page,
- 'page_size'=>100,
- ];
- $options = [
- "headers" => [
- 'Access-Token' => $accessToken,
- 'Content-Type' => 'application/json',
- ]
- ];
- $url = $url."?".http_build_query($request_data);
- $httpClient = new Client(['timeout' => 10]);
- $res = $httpClient->request('GET', $url, $options);
- $result = json_decode($res->getBody(), true);
- if (empty($result['data']['rows'])) {
- break;
- }
- $data = array_merge($data, $result['data']['rows']);
- $totalPage = $result['data']['page_info']['total_page'] ?? 1;
- $page++;
- } while ($page <= $totalPage);
- return $data;
- }
- // 获取媒体消耗
- public function getVideoCost($advertiserId, $accessToken, $date): array
- {
- $page = 1;
- $data = [];
- do {
- $url = 'https://ad.oceanengine.com/open_api/v3.0/report/custom/get/';
- $request_data = [
- 'advertiser_id'=>$advertiserId,
- 'dimensions'=>json_encode(["ad_platform_material_name","material_id","cdp_project_id","cdp_project_name","stat_time_day", "ad_platform_cdp_project_action_track_url"]),
- 'metrics'=>json_encode(["stat_cost","show_cnt","click_cnt","active","active_register","active_pay","valid_play","download_finish_cnt","total_play", "stat_pay_amount"]),
- 'filters'=>'[{"field":"image_mode","type":1,"operator":0,"values":["5","15"]},{"operator":4,"values":["0"],"field":"stat_cost","type":3}]',
- 'start_time'=>$date,
- 'end_time'=>$date,
- 'order_by'=>json_encode([]),
- 'page'=>1,
- 'page_size'=>100,
- ];
- $options = [
- "headers" => [
- 'Access-Token' => $accessToken,
- 'Content-Type' => 'application/json',
- ]
- ];
- $url = $url."?".http_build_query($request_data);
- $httpClient = new Client(['timeout' => 10]);
- $res = $httpClient->request('GET', $url, $options);
- $result = json_decode($res->getBody(), true);
- if (empty($result['data']['rows'])) {
- break;
- }
- $data = array_merge($data, $result['data']['rows']);
- $totalPage = $result['data']['page_info']['total_page'] ?? 1;
- $page++;
- } while ($page <= $totalPage);
- return $data;
- }
- public function getVideo($advertiserId, $accessToken, $materialIds): array
- {
- $url = 'https://api.oceanengine.com/open_api/2/file/video/get/';
- $request_data = [
- 'advertiser_id'=>$advertiserId,
- 'filtering' => json_encode([
- "material_ids" => $materialIds,
- ]),
- ];
- $options = [
- "headers" => [
- 'Access-Token' => $accessToken,
- 'Content-Type' => 'application/json',
- ]
- ];
- $url = $url."?".http_build_query($request_data);
- $httpClient = new Client(['timeout' => 10]);
- $res = $httpClient->request('GET', $url, $options);
- $result = json_decode($res->getBody(), true);
- return $result['data']['list'] ?? [];
- }
- }
|