123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- <?php
- namespace App\Http\Controllers\Admin;
- use App\Http\Logics\Admin\SocialLogic;
- use App\Http\Models\HootsuiteUser;
- use App\Http\Models\Site;
- use App\Http\Models\Social;
- use Facebook\Facebook;
- use GuzzleHttp\Client;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- use Illuminate\Support\Facades\Log;
- use Laravel\Socialite\Facades\Socialite;
- /**
- * 之前版本的社交管理 后被hootsuite替代
- * Class SocialController
- * @package App\Http\Controllers\Admin
- */
- class SocialController extends Controller
- {
- protected $logic;
- public function __construct(SocialLogic $logic)
- {
- $this->logic = $logic;
- }
- public function pin($siteId)
- {
- // $siteId = $request->input('siteId');
- $social = Social::query()->where(['site_id' => $siteId, 'type' => Social::PIN])->first();
- if (!$social) {
- return view('admin/errors/tips', [
- 'tips' => '社交信息不存在!!!'
- ]);
- }
- // $clientId = $social->app_id;
- // $clientSecret = $social->app_secret;
- // $redirectUrl = $social->redirect_url;
- // $config = new \SocialiteProviders\Manager\Config($clientId, $clientSecret, $redirectUrl);
- config([
- 'services.pinterest' => [
- 'client_id' => $social->app_id,
- 'client_secret' => $social->app_secret,
- 'redirect' => $social->redirect_url
- ]
- ]);
- // $user = Socialite::driver('pinterest')->setConfig($config)->user();
- $user = Socialite::driver('pinterest')->user();
- if (empty($user->token)) {
- return view('admin/errors/tips', [
- 'tips' => '用户令牌获取失败!!!'
- ]);
- }
- $social->token = $user->token;
- $social->save();
- return view('admin/errors/tips', [
- 'tips' => '授权成功'
- ]);
- }
- public function twitter(Request $request)
- {
- $user = Socialite::with('twitter')->user();
- if (empty($user->token) || empty($user->tokenSecret)) {
- return view('admin/errors/tips', [
- 'tips' => '用户令牌获取失败!!!'
- ]);
- }
- if (!$siteId = $request->input('siteId')) {
- return view('admin/errors/tips', [
- 'tips' => '未指定站点!!!'
- ]);
- }
- Social::query()->updateOrCreate([
- 'site_id' => $siteId,
- 'type' => Social::TWITTER
- ], [
- 'token' => $user->token,
- 'token_secret' => $user->tokenSecret
- ]);
- return view('admin/errors/tips', [
- 'tips' => '授权成功!!!!'
- ]);
- }
- public function linkedIn(Request $request)
- {
- $social = Social::query()->where(['type' => Social::LINKED, 'site_id' => 0])->first();
- if (!$social) {
- return view('admin/errors/tips', [
- 'tips' => '社交信息不存在!!!'
- ]);
- }
- config([
- 'services.linkedin.client_id' => $social->app_id,
- 'services.linkedin.client_secret' => $social->app_secret,
- 'services.linkedin.redirect' => sprintf('%s?siteId=%s', $social->redirect_url, $request->input('siteId')),
- ]);
- $user = Socialite::driver('LinkedIn')->stateless()->user();
- if (empty($user->token)) {
- return view('admin/errors/tips', [
- 'tips' => '授权失败!!!'
- ]);
- }
- $social->update([
- 'token' => $user->token,
- 'token_expired_at' => date('Y-m-d H:i:s', strtotime('+59 days'))
- ]);
- return view('admin/errors/tips', [
- 'tips' => '授权成功,有效期60天'
- ]);
- }
- public function facebook()
- {
- $user = Socialite::driver('facebook')->user();
- if (empty($user->token)) {
- return view('admin/errors/tips', [
- 'tips' => '用户令牌获取失败!!!'
- ]);
- }
- try {
- $allSites = Site::query()->select(['id', 'facebook_page', 'facebook_page_token', 'cn_title'])->get();
- $fb = new Facebook([
- 'app_id' => env('FACEBOOK_CLIENT_ID'),
- 'app_secret' => env('FACEBOOK_CLIENT_SECRET'),
- 'default_access_token' => $user->token, // optional
- ]);
- $invalidTokenSiteTitleList = [];
- foreach ($allSites as $site) {
- try {
- if (empty($site->facebook_page)) {
- continue;
- }
- $pageId = $site->facebook_page;
- $response = $fb->get(sprintf('/%s?fields=access_token', $pageId));
- $responseJson = json_decode($response->getBody(), true);
- if (empty($responseJson['access_token'])) {
- $invalidTokenSiteTitleList[] = ['title' => $site->cn_title, 'failed' => var_export($response->getBody(), 1)];
- Log::warning('facebook_page_token:' . var_export($response->getBody(), 1));
- }
- $pageToken = $responseJson['access_token'];
- $site->facebook_page_token = $pageToken;
- $site->save();
- } catch (\Throwable $throwable) {
- Log::warning(sprintf('facebook Auth%s', var_export($throwable->getMessage(), 1)));
- $invalidTokenSiteTitleList[] = [
- 'title' => $site->cn_title,
- 'failed' => var_export($throwable->getMessage(), 1)
- ];
- }
- }
- Social::query()->where(['type' => 'facebook'])->update([
- 'token' => $user->token,
- 'token_expired_at' => date('Y-m-d H:i:s', strtotime('+59 days')),
- 'page_token_expired_at' => date('Y-m-d H:i:s', strtotime('+59 days')),
- 'err' => json_encode($invalidTokenSiteTitleList)
- ]);
- return view('admin/errors/tips', [
- 'tips' => '授权成功,有效期60天<br>失败列表:' . json_encode($invalidTokenSiteTitleList)
- ]);
- } catch (\Throwable $throwable) {
- Log::warning(sprintf('facebook Auth%s', var_export($throwable->getMessage(), 1)));
- return view('admin/errors/tips', [
- 'tips' => '页面令牌获取失败!!!'
- ]);
- }
- }
- public function oauth(Request $request)
- {
- $siteId = $request->input('siteId');
- // ->scopes(['w_organization_social', 'r_organization_social', 'w_member_social','r_member_social'])
- $which = $request->input('which');
- switch ($which) {
- case 'pinterest': //pin的授权地址需要完全一样 例如 pin后台填的是baidu.com/api 则授权地址必须是是baidu.com/api
- if (!$siteId) {
- return view('admin/errors/tips', [
- 'tips' => '请选择参数'
- ]);
- }
- $social = Social::query()->where(['site_id' => $siteId, 'type' => Social::PIN])->first();
- if (!$social) {
- return view('admin/errors/tips', [
- 'tips' => '社交账号信息不存在'
- ]);
- }
- // $clientId = $social->app_id;
- // $clientSecret = $social->app_secret;
- // $redirectUrl = $social->redirect_url;
- // $config = new \SocialiteProviders\Manager\Config($clientId, $clientSecret, $redirectUrl);
- config([
- 'services.pinterest' => [
- 'client_id' => $social->app_id,
- 'client_secret' => $social->app_secret,
- 'redirect' => $social->redirect_url
- ]
- ]);
- // return Socialite::driver('pinterest')->setConfig($config)->scopes(['read_public', 'write_public'])->redirect();
- return Socialite::driver('pinterest')->scopes(['read_public', 'write_public'])->redirect();
- case 'linkedIn': //expiresIn: 5184000 60天
- $social = Social::query()->where(['site_id' => 0, 'type' => Social::LINKED])->first();
- if (!$social) {
- return view('admin/errors/tips', [
- 'tips' => '社交账号信息不存在'
- ]);
- }
- //UGC Post is an upcoming API that will eventually replace the Shares API.
- //https://docs.microsoft.com/en-us/linkedin/marketing/integrations/community-management/shares/ugc-post-api
- config([
- 'services.linkedin.client_id' => $social->app_id,
- 'services.linkedin.client_secret' => $social->app_secret,
- 'services.linkedin.redirect' => sprintf('%s?siteId=%s', $social->redirect_url, $siteId),
- ]);
- // return Socialite::driver('LinkedIn')->scopes(['w_member_social', 'w_organization_social'])->redirect();
- return Socialite::driver('LinkedIn')->scopes(['r_emailaddress', 'r_liteprofile', 'w_member_social', 'w_organization_social'])->redirect();
- // return Socialite::driver('LinkedIn')->scopes(['r_emailaddress', 'r_liteprofile', 'w_member_social','w_organization_social'])->redirect();
- case 'twitter': //twitter地址一样但是可以携带查询字符串 比如twitter 后台填的是baidu.com/api 但是baidu.com/api?siteId=1 也是可以的
- config([
- 'services.twitter.redirect' => sprintf(
- '%s?siteId=%s',
- config('services.twitter.redirect'),
- $siteId
- )
- ]);
- return Socialite::with('twitter')->redirect();
- break;
- case 'facebook':
- return Socialite::driver('facebook')->scopes(['manage_pages', 'publish_pages'])->redirect();
- default:
- break;
- }
- return view('admin/errors/tips', [
- 'tips' => '无授权类型'
- ]);
- }
- public function index(Request $request)
- {
- if (!$request->ajax()) {
- $allSite = Site::query()->select(['id', 'cn_title'])->get();
- return view('admin/social/index', ['sites' => $allSite]);
- }
- $keyword = $request->input('keyword');
- $builder = HootsuiteUser::query()->with('site');
- if ($keyword) {
- $siteIds = Site::query()->where('cn_title', 'like', '%' . $keyword . '%')
- ->orWhere('domain', 'like', '%' . $keyword . '%')->pluck('id')->toArray();
- $builder->where('email', 'like', '%' . $keyword . '%')->orWhereIn('site_id', $siteIds);
- }
- $result = $builder->orderByDesc('id')
- ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
- $items = $result->items();
- array_walk($items, function ($item) {
- $item->site_title = $item->site->cn_title??'未绑定';
- unset($item->role);
- });
- return response()->json([
- 'rows' => $items,
- 'total' => $result->total()
- ]);
- }
- public function hootsuite(Request $request)
- {
- $client = new Client();
- $url = sprintf('%s/admin/hootsuite/token', config('app.wall_url'));
- try {
- $response = $client->request('POST', $url, [
- 'form_params' => $request->input()
- ]);
- $result = $response->getBody()->getContents();
- dd($result);
- } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
- dd($exception->getMessage());
- }
- }
- public function hootsuiteAuth(){
- $client_id = 'c1ada351-6797-406e-8706-342af91ecad5';
- $redirect_uri = 'https://admin.yinqingli.com/admin/socials/hootsuite';
- $state = '';
- return redirect(sprintf(
- 'https://platform.hootsuite.com/oauth2/auth?response_type=code&client_id=%s&scope=offline&state=%s&redirect_uri=%s',
- $client_id,
- $state,
- $redirect_uri
- ));
- }
- }
|