| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 | <?phpnamespace 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        ));    }}
 |