123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2019/11/27 0027
- * Time: 9:49
- */
- namespace App\Http\Controllers\Admin;
- use App\Http\Controllers\Controller;
- use App\Http\Logics\Admin\HootsuiteLogic;
- use App\Http\Models\HootsuiteUser;
- use App\Http\Models\Site;
- use GuzzleHttp\Client;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Log;
- /**
- * Hootsuite社交信息
- * Class HootsuiteController
- * @package App\Http\Controllers\Admin
- */
- class HootsuiteController extends Controller
- {
- protected $logic;
- public function __construct(HootsuiteLogic $logic)
- {
- $this->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());
- }
- }
- }
|