HootsuiteController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Administrator
  5. * Date: 2019/11/27 0027
  6. * Time: 9:49
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Logics\Admin\HootsuiteLogic;
  11. use App\Http\Models\HootsuiteUser;
  12. use App\Http\Models\Site;
  13. use GuzzleHttp\Client;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Log;
  16. /**
  17. * Hootsuite社交信息
  18. * Class HootsuiteController
  19. * @package App\Http\Controllers\Admin
  20. */
  21. class HootsuiteController extends Controller
  22. {
  23. protected $logic;
  24. public function __construct(HootsuiteLogic $logic)
  25. {
  26. $this->logic = $logic;
  27. }
  28. //绑定站点
  29. public function bindSite(Request $request)
  30. {
  31. // $hootsuiteId = $request->input('hootsuiteId');
  32. // $siteId = $request->input('siteId');
  33. // if (!$hootsuiteId || !$siteId) {
  34. // return response()->json(['message' => '参数错误'], 400);
  35. // }
  36. // if (HootsuiteUser::query()->where(['site_id' => $siteId])->exists()) {
  37. // return response()->json(['message' => '该站点已绑定其他hootsuite'], 400);
  38. // }
  39. // $hootsuiteUser = HootsuiteUser::query()->find($hootsuiteId);
  40. // if (!$hootsuiteUser) {
  41. // return response()->json(['message' => 'hootsuite信息不存在'], 400);
  42. // }
  43. // $hootsuiteUser->site_id = $siteId;
  44. // $hootsuiteUser->save();
  45. // return response()->json(['message' => '操作成功']);
  46. $hootsuiteId = $request->input('hootsuiteId');
  47. $siteId = $request->input('siteId');
  48. if (!$hootsuiteId || !$siteId) {
  49. return response()->json(['message' => '参数错误'], 400);
  50. }
  51. // if (HootsuiteUser::query()->where(['site_id' => $siteId])->exists()) {
  52. // return response()->json(['message' => '该站点已绑定其他hootsuite'], 400);
  53. // }
  54. //
  55. $hootsuiteUser = HootsuiteUser::query()->find($hootsuiteId);
  56. if($hootsuiteUser['site_id']!='' || $hootsuiteUser['site_id'] !='' || !empty($hootsuiteUser['site_id'])){
  57. return response()->json(['message' => '该站点已绑定其他hootsuite'], 400);
  58. }
  59. if (!$hootsuiteUser) {
  60. return response()->json(['message' => 'hootsuite信息不存在'], 400);
  61. }
  62. $hootsuiteUser->site_id = $siteId;
  63. $hootsuiteUser->save();
  64. return response()->json(['message' => '操作成功']);
  65. }
  66. //绑定多个社交
  67. public function bindSocialIds(Request $request)
  68. {
  69. $socialIds = $request->input('socialIds');
  70. $site = Site::query()->where(['id' => $request->input('siteId')])->first();
  71. if (!$site) {
  72. return response()->json(['message' => '站点信息不存在'], 400);
  73. }
  74. $site->social_ids = json_encode($socialIds);
  75. $site->save();
  76. return response()->json(['message' => '操作成功']);
  77. }
  78. //获取token
  79. public function getToken(Request $request)
  80. {
  81. $client = new Client();
  82. $authorization = base64_encode(sprintf('%s:%s', $this->logic->clientId, $this->logic->clientSecret));
  83. try {
  84. $response = $client->request('POST', 'https://platform.hootsuite.com/oauth2/token', [
  85. 'headers' => [
  86. 'Authorization' => 'Basic ' . $authorization
  87. ],
  88. 'form_params' => [
  89. 'grant_type' => 'authorization_code',
  90. 'code' => $request->input('code'),
  91. 'redirect_uri' => 'https://admin.yinqingli.com/admin/socials/hootsuite',
  92. 'scope' => $request->input('scope') ?? 'offline',
  93. ]
  94. ]);
  95. $result = json_decode($response->getBody()->getContents(), true);
  96. $meResponse = $client->request('GET', 'https://platform.hootsuite.com/v1/me', [
  97. 'headers' => [
  98. 'Authorization' => sprintf('Bearer %s', $result['access_token'])
  99. ]
  100. ]);
  101. $meResult = json_decode($meResponse->getBody()->getContents(), true);
  102. $socialResponse = $client->request('GET', 'https://platform.hootsuite.com/v1/socialProfiles', [
  103. 'headers' => [
  104. 'Authorization' => sprintf('Bearer %s', $result['access_token'])
  105. ]
  106. ]);
  107. $socialResult = json_decode($socialResponse->getBody()->getContents(), true);
  108. $user = HootsuiteUser::query()->where(['identify' => $meResult['data']['id']])->first();
  109. if (!$user) {
  110. HootsuiteUser::query()->create([
  111. 'identify' => $meResult['data']['id'],
  112. 'email' => $meResult['data']['email'],
  113. 'full_name' => $meResult['data']['fullName'],
  114. 'access_token' => $result['access_token'],
  115. 'refresh_token' => $result['refresh_token'],
  116. 'access_token_expired' => time() + intval($result['expires_in']) - 120,
  117. 'social_profiles' => $socialResult['data']
  118. ]);
  119. } else {
  120. $user->update([
  121. 'access_token' => $result['access_token'],
  122. 'refresh_token' => $result['refresh_token'],
  123. 'access_token_expired' => time() + intval($result['expires_in']) - 120,
  124. 'social_profiles' => $socialResult['data']
  125. ]);
  126. }
  127. return response()->json([
  128. 'code' => 200,
  129. 'authInfo' => $result,
  130. 'meInfo' => $meResult
  131. ]);
  132. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  133. return response()->json([
  134. 'code' => 400,
  135. 'message' => var_export($exception->getMessage(), 1)
  136. ]);
  137. }
  138. }
  139. //获取社交列表
  140. public function getSocialList(Request $request)
  141. {
  142. $siteId = $request->input('siteId');
  143. $client = new Client();
  144. $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  145. if (!$user) {
  146. return response()->json(['message' => '用户信息不存在', 'code' => 400]);
  147. }
  148. $accessToken = $this->logic->accessToken($user);
  149. try {
  150. $response = $client->request('GET', 'https://platform.hootsuite.com/v1/socialProfiles', [
  151. 'headers' => [
  152. 'Authorization' => sprintf('Bearer %s', $accessToken)
  153. ]
  154. ]);
  155. $result = json_decode($response->getBody()->getContents(), true);
  156. $user->social_profiles = $result['data'];
  157. $user->save();
  158. dd($result);
  159. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  160. return '请求错误';
  161. }
  162. }
  163. //调度消息
  164. public function scheduleMessage(Request $request)
  165. {
  166. $remoteImg = $request->input('remoteImg');
  167. $siteId = $request->input('siteId');
  168. $sendAt = $request->input('sendAt'); // $sendAt = '2020-06-01 12:12:12';
  169. $text = $request->input('content');
  170. $socialIds = $request->input('socialIds'); // ['128172427', '128172414']
  171. if (!$siteId || !$sendAt || !$text || !is_array($socialIds)) {
  172. return response()->json(['message' => '参数错误', 'code' => 400]);
  173. }
  174. $sendTime = date('Y-m-d\TH:i:s\Z', strtotime($sendAt));
  175. $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  176. if (!$user) {
  177. return response()->json(['message' => '用户信息不存在', 'code' => 400]);
  178. }
  179. try {
  180. $accessToken = $this->logic->accessToken($user);
  181. } catch (\Throwable $throwable) {
  182. Log::error(var_export($throwable->getMessage(), 1));
  183. return response()->json(['code' => 400, 'message' => 'access_token获取失败']);
  184. }
  185. if ($remoteImg) {
  186. try {
  187. $mediaId = $this->logic->uploadMedia($remoteImg, $accessToken);
  188. $mediaList = [
  189. ['id' => $mediaId]
  190. ];
  191. sleep(4); //必须要sleep 不延迟 hootsuite 会报错 猜测是创建上传之后 hootsuite mediaId 要过段时间才可用
  192. } catch (\Throwable $throwable) {
  193. Log::warning('remoteImg error');
  194. Log::warning(var_export($throwable->getMessage(), 1));
  195. }
  196. }
  197. $client = new Client();
  198. try {
  199. $response = $client->request('POST', 'https://platform.hootsuite.com/v1/messages', [
  200. 'headers' => [
  201. 'Authorization' => sprintf('Bearer %s', $accessToken)
  202. ],
  203. 'json' => [
  204. 'text' => $text,
  205. 'socialProfileIds' => $socialIds,
  206. 'scheduledSendTime' => $sendTime,
  207. 'media' => $mediaList ?? []
  208. ]
  209. ]);
  210. $result = json_decode($response->getBody()->getContents(), true);
  211. return response()->json($result);
  212. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  213. Log::error(var_export($exception->getMessage(), 1));
  214. Log::error(var_export('mediaId=' . ($mediaId ?? ''), 1));
  215. return response()->json(['code' => 400, 'message' => 'GuzzleException']);
  216. }
  217. }
  218. //检索消息
  219. public function retrieveMessage(Request $request)
  220. {
  221. $siteId = $request->input('siteId');
  222. if (!$siteId ) {
  223. return response()->json(['message' => '参数错误', 'code' => 400]);
  224. }
  225. $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  226. if (!$user) {
  227. return response()->json(['message' => '用户信息不存在', 'code' => 400]);
  228. }
  229. try {
  230. $accessToken = $this->logic->accessToken($user);
  231. } catch (\Throwable $throwable) {
  232. Log::error(var_export($throwable->getMessage(), 1));
  233. return response()->json(['code' => 400, 'message' => 'access_token获取失败']);
  234. }
  235. $client = new Client();
  236. try {
  237. $response = $client->get('https://platform.hootsuite.com/v1/messages/{msgId}', [
  238. 'headers' => [
  239. 'Authorization' => sprintf('Bearer %s', $accessToken)
  240. ]
  241. ]);
  242. $result = json_decode($response->getBody()->getContents(), true);
  243. return response()->json($result);
  244. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  245. return response()->json(['code' => 400, 'message' => 'GuzzleException']);
  246. }
  247. }
  248. //为了测试
  249. public function uploadMedia(Request $request)
  250. {
  251. if ($request->input('dd')) {
  252. $remoteImg = 'https://www.kamcappower.com/uploads/image/20190613/14/medical.jpg';
  253. } else {
  254. // $remoteImg='./demo.jpg';
  255. $remoteImg = 'http://kamcappower.com/uploads/image/20190628/11/application-prospect-of-supercapacitors-in-smart-grid.jpg';
  256. }
  257. $mime = image_type_to_mime_type(exif_imagetype($remoteImg));
  258. $fileStr = file_get_contents($remoteImg);
  259. $fileSize = strlen($fileStr);
  260. $user = HootsuiteUser::query()->where(['site_id' => 4])->first();
  261. if (!$user) {
  262. return response()->json(['message' => '用户信息不存在', 'code' => 400]);
  263. }
  264. $accessToken = $this->logic->accessToken($user);
  265. $client = new Client();
  266. $response = $client->request('POST', 'https://platform.hootsuite.com/v1/media', [
  267. 'headers' => [
  268. 'Authorization' => sprintf('Bearer %s', $accessToken)
  269. ],
  270. 'json' => [
  271. 'sizeBytes' => $fileSize,
  272. 'mimeType' => $mime
  273. ]
  274. ]);
  275. $result = json_decode($response->getBody()->getContents(), true);
  276. $uploadUrl = $result['data']['uploadUrl'];
  277. // $mediaId = $result['data']['id'];
  278. $data = fopen($remoteImg, 'r');
  279. $uploadResponse = $client->request('PUT', $uploadUrl, [
  280. 'headers' => [
  281. 'Content-Length' => $fileSize,
  282. 'Content-Type' => $mime
  283. ],
  284. 'body' => $fileStr,
  285. ]);
  286. $code = $uploadResponse->getStatusCode();
  287. if ($code == 200) {
  288. dd($result, $uploadResponse->getBody()->getContents());
  289. } else {
  290. throw new \Exception($code);
  291. }
  292. }
  293. public function uploadMediaBak(Request $request)
  294. {
  295. $fileImage = $request->file('imageFile');
  296. $siteId = $request->input('siteId');
  297. $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  298. if (!$user) {
  299. return response()->json(['message' => '用户信息不存在', 'code' => 400]);
  300. }
  301. $accessToken = $this->logic->accessToken($user);
  302. $mediaFile = $fileImage->getRealPath();
  303. $client = new Client();
  304. try {
  305. $response = $client->request('POST', 'https://platform.hootsuite.com/v1/media', [
  306. 'headers' => [
  307. 'Authorization' => sprintf('Bearer %s', $accessToken)
  308. ],
  309. 'json' => [
  310. 'sizeBytes' => filesize($mediaFile),
  311. 'mimeType' => mime_content_type($mediaFile)
  312. ]
  313. ]);
  314. $result = json_decode($response->getBody()->getContents(), true);
  315. $uploadUrl = $result['data']['uploadUrl'];
  316. // $mediaId = $result['data']['id'];
  317. $data = fopen($mediaFile, 'r');
  318. $uploadResponse = $client->request('PUT', $uploadUrl, [
  319. 'headers' => [
  320. 'Content-Length' => filesize($mediaFile),
  321. 'Content-Type' => mime_content_type($mediaFile)
  322. ],
  323. 'body' => $data,
  324. ]);
  325. $code = $uploadResponse->getStatusCode();
  326. dd($result['data'], $code);
  327. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  328. dd($exception->getMessage());
  329. }
  330. }
  331. public function retrieveAllMessage(Request $request)
  332. {
  333. $siteId = $request->input('siteId');
  334. $user = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  335. if (!$user) {
  336. return response()->json(['message' => '用户信息不存在', 'code' => 400]);
  337. }
  338. $accessToken = $this->logic->accessToken($user);
  339. $query = [
  340. 'startTime' => date(DATE_ISO8601, strtotime('-4 week')),
  341. 'endTime' => date(DATE_ISO8601)
  342. // 'socialProfileIds',
  343. // 'state',
  344. // 'limit'
  345. ];
  346. $client = new Client();
  347. try {
  348. $response = $client->request('GET', 'https://platform.hootsuite.com/v1/messages', [
  349. 'headers' => [
  350. 'Authorization' => sprintf('Bearer %s', $accessToken)
  351. ],
  352. 'query' => $query
  353. ]);
  354. $result = json_decode($response->getBody()->getContents(), true);
  355. dd($result['data']);
  356. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  357. dd($exception->getMessage());
  358. }
  359. }
  360. }