logic = $logic; } //绑定站点 public function bindSite(Request $request) { // $hootsuiteId = $request->input('hootsuiteId'); // $siteId = $request->input('siteId'); // if (!$hootsuiteId || !$siteId) { // return response()->json(['message' => '参数错误'], 400); // } // if (HootsuiteUser::query()->where(['site_id' => $siteId])->exists()) { // return response()->json(['message' => '该站点已绑定其他hootsuite'], 400); // } // $hootsuiteUser = HootsuiteUser::query()->find($hootsuiteId); // if (!$hootsuiteUser) { // return response()->json(['message' => 'hootsuite信息不存在'], 400); // } // $hootsuiteUser->site_id = $siteId; // $hootsuiteUser->save(); // return response()->json(['message' => '操作成功']); $hootsuiteId = $request->input('hootsuiteId'); $siteId = $request->input('siteId'); if (!$hootsuiteId || !$siteId) { return response()->json(['message' => '参数错误'], 400); } // if (HootsuiteUser::query()->where(['site_id' => $siteId])->exists()) { // return response()->json(['message' => '该站点已绑定其他hootsuite'], 400); // } // $hootsuiteUser = HootsuiteUser::query()->find($hootsuiteId); if($hootsuiteUser['site_id']!='' || $hootsuiteUser['site_id'] !='' || !empty($hootsuiteUser['site_id'])){ return response()->json(['message' => '该站点已绑定其他hootsuite'], 400); } if (!$hootsuiteUser) { return response()->json(['message' => 'hootsuite信息不存在'], 400); } $hootsuiteUser->site_id = $siteId; $hootsuiteUser->save(); return response()->json(['message' => '操作成功']); } //绑定多个社交 public function bindSocialIds(Request $request) { $socialIds = $request->input('socialIds'); $site = Site::query()->where(['id' => $request->input('siteId')])->first(); if (!$site) { return response()->json(['message' => '站点信息不存在'], 400); } $site->social_ids = json_encode($socialIds); $site->save(); return response()->json(['message' => '操作成功']); } //获取token public function getToken(Request $request) { $client = new Client(); $authorization = base64_encode(sprintf('%s:%s', $this->logic->clientId, $this->logic->clientSecret)); try { $response = $client->request('POST', 'https://platform.hootsuite.com/oauth2/token', [ 'headers' => [ 'Authorization' => 'Basic ' . $authorization ], 'form_params' => [ 'grant_type' => 'authorization_code', 'code' => $request->input('code'), 'redirect_uri' => 'https://admin.yinqingli.com/admin/socials/hootsuite', 'scope' => $request->input('scope') ?? 'offline', ] ]); $result = json_decode($response->getBody()->getContents(), true); $meResponse = $client->request('GET', 'https://platform.hootsuite.com/v1/me', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $result['access_token']) ] ]); $meResult = json_decode($meResponse->getBody()->getContents(), true); $socialResponse = $client->request('GET', 'https://platform.hootsuite.com/v1/socialProfiles', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $result['access_token']) ] ]); $socialResult = json_decode($socialResponse->getBody()->getContents(), true); $user = HootsuiteUser::query()->where(['identify' => $meResult['data']['id']])->first(); if (!$user) { HootsuiteUser::query()->create([ 'identify' => $meResult['data']['id'], 'email' => $meResult['data']['email'], 'full_name' => $meResult['data']['fullName'], 'access_token' => $result['access_token'], 'refresh_token' => $result['refresh_token'], 'access_token_expired' => time() + intval($result['expires_in']) - 120, 'social_profiles' => $socialResult['data'] ]); } else { $user->update([ 'access_token' => $result['access_token'], 'refresh_token' => $result['refresh_token'], 'access_token_expired' => time() + intval($result['expires_in']) - 120, 'social_profiles' => $socialResult['data'] ]); } return response()->json([ 'code' => 200, 'authInfo' => $result, 'meInfo' => $meResult ]); } catch (\GuzzleHttp\Exception\GuzzleException $exception) { return response()->json([ 'code' => 400, 'message' => var_export($exception->getMessage(), 1) ]); } } //获取社交列表 public function getSocialList(Request $request) { $siteId = $request->input('siteId'); $client = new Client(); $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first(); if (!$user) { return response()->json(['message' => '用户信息不存在', 'code' => 400]); } $accessToken = $this->logic->accessToken($user); try { $response = $client->request('GET', 'https://platform.hootsuite.com/v1/socialProfiles', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $accessToken) ] ]); $result = json_decode($response->getBody()->getContents(), true); $user->social_profiles = $result['data']; $user->save(); dd($result); } catch (\GuzzleHttp\Exception\GuzzleException $exception) { return '请求错误'; } } //调度消息 public function scheduleMessage(Request $request) { $remoteImg = $request->input('remoteImg'); $siteId = $request->input('siteId'); $sendAt = $request->input('sendAt'); // $sendAt = '2020-06-01 12:12:12'; $text = $request->input('content'); $socialIds = $request->input('socialIds'); // ['128172427', '128172414'] if (!$siteId || !$sendAt || !$text || !is_array($socialIds)) { return response()->json(['message' => '参数错误', 'code' => 400]); } $sendTime = date('Y-m-d\TH:i:s\Z', strtotime($sendAt)); $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first(); if (!$user) { return response()->json(['message' => '用户信息不存在', 'code' => 400]); } try { $accessToken = $this->logic->accessToken($user); } catch (\Throwable $throwable) { Log::error(var_export($throwable->getMessage(), 1)); return response()->json(['code' => 400, 'message' => 'access_token获取失败']); } if ($remoteImg) { try { $mediaId = $this->logic->uploadMedia($remoteImg, $accessToken); $mediaList = [ ['id' => $mediaId] ]; sleep(4); //必须要sleep 不延迟 hootsuite 会报错 猜测是创建上传之后 hootsuite mediaId 要过段时间才可用 } catch (\Throwable $throwable) { Log::warning('remoteImg error'); Log::warning(var_export($throwable->getMessage(), 1)); } } $client = new Client(); try { $response = $client->request('POST', 'https://platform.hootsuite.com/v1/messages', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $accessToken) ], 'json' => [ 'text' => $text, 'socialProfileIds' => $socialIds, 'scheduledSendTime' => $sendTime, 'media' => $mediaList ?? [] ] ]); $result = json_decode($response->getBody()->getContents(), true); return response()->json($result); } catch (\GuzzleHttp\Exception\GuzzleException $exception) { Log::error(var_export($exception->getMessage(), 1)); Log::error(var_export('mediaId=' . ($mediaId ?? ''), 1)); return response()->json(['code' => 400, 'message' => 'GuzzleException']); } } //检索消息 public function retrieveMessage(Request $request) { $siteId = $request->input('siteId'); if (!$siteId ) { return response()->json(['message' => '参数错误', 'code' => 400]); } $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first(); if (!$user) { return response()->json(['message' => '用户信息不存在', 'code' => 400]); } try { $accessToken = $this->logic->accessToken($user); } catch (\Throwable $throwable) { Log::error(var_export($throwable->getMessage(), 1)); return response()->json(['code' => 400, 'message' => 'access_token获取失败']); } $client = new Client(); try { $response = $client->get('https://platform.hootsuite.com/v1/messages/{msgId}', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $accessToken) ] ]); $result = json_decode($response->getBody()->getContents(), true); return response()->json($result); } catch (\GuzzleHttp\Exception\GuzzleException $exception) { return response()->json(['code' => 400, 'message' => 'GuzzleException']); } } //为了测试 public function uploadMedia(Request $request) { if ($request->input('dd')) { $remoteImg = 'https://www.kamcappower.com/uploads/image/20190613/14/medical.jpg'; } else { // $remoteImg='./demo.jpg'; $remoteImg = 'http://kamcappower.com/uploads/image/20190628/11/application-prospect-of-supercapacitors-in-smart-grid.jpg'; } $mime = image_type_to_mime_type(exif_imagetype($remoteImg)); $fileStr = file_get_contents($remoteImg); $fileSize = strlen($fileStr); $user = HootsuiteUser::query()->where(['site_id' => 4])->first(); if (!$user) { return response()->json(['message' => '用户信息不存在', 'code' => 400]); } $accessToken = $this->logic->accessToken($user); $client = new Client(); $response = $client->request('POST', 'https://platform.hootsuite.com/v1/media', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $accessToken) ], 'json' => [ 'sizeBytes' => $fileSize, 'mimeType' => $mime ] ]); $result = json_decode($response->getBody()->getContents(), true); $uploadUrl = $result['data']['uploadUrl']; // $mediaId = $result['data']['id']; $data = fopen($remoteImg, 'r'); $uploadResponse = $client->request('PUT', $uploadUrl, [ 'headers' => [ 'Content-Length' => $fileSize, 'Content-Type' => $mime ], 'body' => $fileStr, ]); $code = $uploadResponse->getStatusCode(); if ($code == 200) { dd($result, $uploadResponse->getBody()->getContents()); } else { throw new \Exception($code); } } public function uploadMediaBak(Request $request) { $fileImage = $request->file('imageFile'); $siteId = $request->input('siteId'); $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first(); if (!$user) { return response()->json(['message' => '用户信息不存在', 'code' => 400]); } $accessToken = $this->logic->accessToken($user); $mediaFile = $fileImage->getRealPath(); $client = new Client(); try { $response = $client->request('POST', 'https://platform.hootsuite.com/v1/media', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $accessToken) ], 'json' => [ 'sizeBytes' => filesize($mediaFile), 'mimeType' => mime_content_type($mediaFile) ] ]); $result = json_decode($response->getBody()->getContents(), true); $uploadUrl = $result['data']['uploadUrl']; // $mediaId = $result['data']['id']; $data = fopen($mediaFile, 'r'); $uploadResponse = $client->request('PUT', $uploadUrl, [ 'headers' => [ 'Content-Length' => filesize($mediaFile), 'Content-Type' => mime_content_type($mediaFile) ], 'body' => $data, ]); $code = $uploadResponse->getStatusCode(); dd($result['data'], $code); } catch (\GuzzleHttp\Exception\GuzzleException $exception) { dd($exception->getMessage()); } } public function retrieveAllMessage(Request $request) { $siteId = $request->input('siteId'); $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first(); if (!$user) { return response()->json(['message' => '用户信息不存在', 'code' => 400]); } $accessToken = $this->logic->accessToken($user); $query = [ 'startTime' => date(DATE_ISO8601, strtotime('-4 week')), 'endTime' => date(DATE_ISO8601) // 'socialProfileIds', // 'state', // 'limit' ]; $client = new Client(); try { $response = $client->request('GET', 'https://platform.hootsuite.com/v1/messages', [ 'headers' => [ 'Authorization' => sprintf('Bearer %s', $accessToken) ], 'query' => $query ]); $result = json_decode($response->getBody()->getContents(), true); dd($result['data']); } catch (\GuzzleHttp\Exception\GuzzleException $exception) { dd($exception->getMessage()); } } }