| 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());        }    }}
 |