SocialController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Logics\Admin\SocialLogic;
  4. use App\Http\Models\HootsuiteUser;
  5. use App\Http\Models\Site;
  6. use App\Http\Models\Social;
  7. use Facebook\Facebook;
  8. use GuzzleHttp\Client;
  9. use Illuminate\Http\Request;
  10. use App\Http\Controllers\Controller;
  11. use Illuminate\Support\Facades\Log;
  12. use Laravel\Socialite\Facades\Socialite;
  13. /**
  14. * 之前版本的社交管理 后被hootsuite替代
  15. * Class SocialController
  16. * @package App\Http\Controllers\Admin
  17. */
  18. class SocialController extends Controller
  19. {
  20. protected $logic;
  21. public function __construct(SocialLogic $logic)
  22. {
  23. $this->logic = $logic;
  24. }
  25. public function pin($siteId)
  26. {
  27. // $siteId = $request->input('siteId');
  28. $social = Social::query()->where(['site_id' => $siteId, 'type' => Social::PIN])->first();
  29. if (!$social) {
  30. return view('admin/errors/tips', [
  31. 'tips' => '社交信息不存在!!!'
  32. ]);
  33. }
  34. // $clientId = $social->app_id;
  35. // $clientSecret = $social->app_secret;
  36. // $redirectUrl = $social->redirect_url;
  37. // $config = new \SocialiteProviders\Manager\Config($clientId, $clientSecret, $redirectUrl);
  38. config([
  39. 'services.pinterest' => [
  40. 'client_id' => $social->app_id,
  41. 'client_secret' => $social->app_secret,
  42. 'redirect' => $social->redirect_url
  43. ]
  44. ]);
  45. // $user = Socialite::driver('pinterest')->setConfig($config)->user();
  46. $user = Socialite::driver('pinterest')->user();
  47. if (empty($user->token)) {
  48. return view('admin/errors/tips', [
  49. 'tips' => '用户令牌获取失败!!!'
  50. ]);
  51. }
  52. $social->token = $user->token;
  53. $social->save();
  54. return view('admin/errors/tips', [
  55. 'tips' => '授权成功'
  56. ]);
  57. }
  58. public function twitter(Request $request)
  59. {
  60. $user = Socialite::with('twitter')->user();
  61. if (empty($user->token) || empty($user->tokenSecret)) {
  62. return view('admin/errors/tips', [
  63. 'tips' => '用户令牌获取失败!!!'
  64. ]);
  65. }
  66. if (!$siteId = $request->input('siteId')) {
  67. return view('admin/errors/tips', [
  68. 'tips' => '未指定站点!!!'
  69. ]);
  70. }
  71. Social::query()->updateOrCreate([
  72. 'site_id' => $siteId,
  73. 'type' => Social::TWITTER
  74. ], [
  75. 'token' => $user->token,
  76. 'token_secret' => $user->tokenSecret
  77. ]);
  78. return view('admin/errors/tips', [
  79. 'tips' => '授权成功!!!!'
  80. ]);
  81. }
  82. public function linkedIn(Request $request)
  83. {
  84. $social = Social::query()->where(['type' => Social::LINKED, 'site_id' => 0])->first();
  85. if (!$social) {
  86. return view('admin/errors/tips', [
  87. 'tips' => '社交信息不存在!!!'
  88. ]);
  89. }
  90. config([
  91. 'services.linkedin.client_id' => $social->app_id,
  92. 'services.linkedin.client_secret' => $social->app_secret,
  93. 'services.linkedin.redirect' => sprintf('%s?siteId=%s', $social->redirect_url, $request->input('siteId')),
  94. ]);
  95. $user = Socialite::driver('LinkedIn')->stateless()->user();
  96. if (empty($user->token)) {
  97. return view('admin/errors/tips', [
  98. 'tips' => '授权失败!!!'
  99. ]);
  100. }
  101. $social->update([
  102. 'token' => $user->token,
  103. 'token_expired_at' => date('Y-m-d H:i:s', strtotime('+59 days'))
  104. ]);
  105. return view('admin/errors/tips', [
  106. 'tips' => '授权成功,有效期60天'
  107. ]);
  108. }
  109. public function facebook()
  110. {
  111. $user = Socialite::driver('facebook')->user();
  112. if (empty($user->token)) {
  113. return view('admin/errors/tips', [
  114. 'tips' => '用户令牌获取失败!!!'
  115. ]);
  116. }
  117. try {
  118. $allSites = Site::query()->select(['id', 'facebook_page', 'facebook_page_token', 'cn_title'])->get();
  119. $fb = new Facebook([
  120. 'app_id' => env('FACEBOOK_CLIENT_ID'),
  121. 'app_secret' => env('FACEBOOK_CLIENT_SECRET'),
  122. 'default_access_token' => $user->token, // optional
  123. ]);
  124. $invalidTokenSiteTitleList = [];
  125. foreach ($allSites as $site) {
  126. try {
  127. if (empty($site->facebook_page)) {
  128. continue;
  129. }
  130. $pageId = $site->facebook_page;
  131. $response = $fb->get(sprintf('/%s?fields=access_token', $pageId));
  132. $responseJson = json_decode($response->getBody(), true);
  133. if (empty($responseJson['access_token'])) {
  134. $invalidTokenSiteTitleList[] = ['title' => $site->cn_title, 'failed' => var_export($response->getBody(), 1)];
  135. Log::warning('facebook_page_token:' . var_export($response->getBody(), 1));
  136. }
  137. $pageToken = $responseJson['access_token'];
  138. $site->facebook_page_token = $pageToken;
  139. $site->save();
  140. } catch (\Throwable $throwable) {
  141. Log::warning(sprintf('facebook Auth%s', var_export($throwable->getMessage(), 1)));
  142. $invalidTokenSiteTitleList[] = [
  143. 'title' => $site->cn_title,
  144. 'failed' => var_export($throwable->getMessage(), 1)
  145. ];
  146. }
  147. }
  148. Social::query()->where(['type' => 'facebook'])->update([
  149. 'token' => $user->token,
  150. 'token_expired_at' => date('Y-m-d H:i:s', strtotime('+59 days')),
  151. 'page_token_expired_at' => date('Y-m-d H:i:s', strtotime('+59 days')),
  152. 'err' => json_encode($invalidTokenSiteTitleList)
  153. ]);
  154. return view('admin/errors/tips', [
  155. 'tips' => '授权成功,有效期60天<br>失败列表:' . json_encode($invalidTokenSiteTitleList)
  156. ]);
  157. } catch (\Throwable $throwable) {
  158. Log::warning(sprintf('facebook Auth%s', var_export($throwable->getMessage(), 1)));
  159. return view('admin/errors/tips', [
  160. 'tips' => '页面令牌获取失败!!!'
  161. ]);
  162. }
  163. }
  164. public function oauth(Request $request)
  165. {
  166. $siteId = $request->input('siteId');
  167. // ->scopes(['w_organization_social', 'r_organization_social', 'w_member_social','r_member_social'])
  168. $which = $request->input('which');
  169. switch ($which) {
  170. case 'pinterest': //pin的授权地址需要完全一样 例如 pin后台填的是baidu.com/api 则授权地址必须是是baidu.com/api
  171. if (!$siteId) {
  172. return view('admin/errors/tips', [
  173. 'tips' => '请选择参数'
  174. ]);
  175. }
  176. $social = Social::query()->where(['site_id' => $siteId, 'type' => Social::PIN])->first();
  177. if (!$social) {
  178. return view('admin/errors/tips', [
  179. 'tips' => '社交账号信息不存在'
  180. ]);
  181. }
  182. // $clientId = $social->app_id;
  183. // $clientSecret = $social->app_secret;
  184. // $redirectUrl = $social->redirect_url;
  185. // $config = new \SocialiteProviders\Manager\Config($clientId, $clientSecret, $redirectUrl);
  186. config([
  187. 'services.pinterest' => [
  188. 'client_id' => $social->app_id,
  189. 'client_secret' => $social->app_secret,
  190. 'redirect' => $social->redirect_url
  191. ]
  192. ]);
  193. // return Socialite::driver('pinterest')->setConfig($config)->scopes(['read_public', 'write_public'])->redirect();
  194. return Socialite::driver('pinterest')->scopes(['read_public', 'write_public'])->redirect();
  195. case 'linkedIn': //expiresIn: 5184000 60天
  196. $social = Social::query()->where(['site_id' => 0, 'type' => Social::LINKED])->first();
  197. if (!$social) {
  198. return view('admin/errors/tips', [
  199. 'tips' => '社交账号信息不存在'
  200. ]);
  201. }
  202. //UGC Post is an upcoming API that will eventually replace the Shares API.
  203. //https://docs.microsoft.com/en-us/linkedin/marketing/integrations/community-management/shares/ugc-post-api
  204. config([
  205. 'services.linkedin.client_id' => $social->app_id,
  206. 'services.linkedin.client_secret' => $social->app_secret,
  207. 'services.linkedin.redirect' => sprintf('%s?siteId=%s', $social->redirect_url, $siteId),
  208. ]);
  209. // return Socialite::driver('LinkedIn')->scopes(['w_member_social', 'w_organization_social'])->redirect();
  210. return Socialite::driver('LinkedIn')->scopes(['r_emailaddress', 'r_liteprofile', 'w_member_social', 'w_organization_social'])->redirect();
  211. // return Socialite::driver('LinkedIn')->scopes(['r_emailaddress', 'r_liteprofile', 'w_member_social','w_organization_social'])->redirect();
  212. case 'twitter': //twitter地址一样但是可以携带查询字符串 比如twitter 后台填的是baidu.com/api 但是baidu.com/api?siteId=1 也是可以的
  213. config([
  214. 'services.twitter.redirect' => sprintf(
  215. '%s?siteId=%s',
  216. config('services.twitter.redirect'),
  217. $siteId
  218. )
  219. ]);
  220. return Socialite::with('twitter')->redirect();
  221. break;
  222. case 'facebook':
  223. return Socialite::driver('facebook')->scopes(['manage_pages', 'publish_pages'])->redirect();
  224. default:
  225. break;
  226. }
  227. return view('admin/errors/tips', [
  228. 'tips' => '无授权类型'
  229. ]);
  230. }
  231. public function index(Request $request)
  232. {
  233. if (!$request->ajax()) {
  234. $allSite = Site::query()->select(['id', 'cn_title'])->get();
  235. return view('admin/social/index', ['sites' => $allSite]);
  236. }
  237. $keyword = $request->input('keyword');
  238. $builder = HootsuiteUser::query()->with('site');
  239. if ($keyword) {
  240. $siteIds = Site::query()->where('cn_title', 'like', '%' . $keyword . '%')
  241. ->orWhere('domain', 'like', '%' . $keyword . '%')->pluck('id')->toArray();
  242. $builder->where('email', 'like', '%' . $keyword . '%')->orWhereIn('site_id', $siteIds);
  243. }
  244. $result = $builder->orderByDesc('id')
  245. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  246. $items = $result->items();
  247. array_walk($items, function ($item) {
  248. $item->site_title = $item->site->cn_title??'未绑定';
  249. unset($item->role);
  250. });
  251. return response()->json([
  252. 'rows' => $items,
  253. 'total' => $result->total()
  254. ]);
  255. }
  256. public function hootsuite(Request $request)
  257. {
  258. $client = new Client();
  259. $url = sprintf('%s/admin/hootsuite/token', config('app.wall_url'));
  260. try {
  261. $response = $client->request('POST', $url, [
  262. 'form_params' => $request->input()
  263. ]);
  264. $result = $response->getBody()->getContents();
  265. dd($result);
  266. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  267. dd($exception->getMessage());
  268. }
  269. }
  270. public function hootsuiteAuth(){
  271. $client_id = 'c1ada351-6797-406e-8706-342af91ecad5';
  272. $redirect_uri = 'https://admin.yinqingli.com/admin/socials/hootsuite';
  273. $state = '';
  274. return redirect(sprintf(
  275. 'https://platform.hootsuite.com/oauth2/auth?response_type=code&client_id=%s&scope=offline&state=%s&redirect_uri=%s',
  276. $client_id,
  277. $state,
  278. $redirect_uri
  279. ));
  280. }
  281. }