{"id":29625,"date":"2021-06-20T18:16:00","date_gmt":"2021-06-20T15:16:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29625"},"modified":"2021-10-17T16:14:47","modified_gmt":"2021-10-17T13:14:47","slug":"compartir-publicacion-en-linkedin-usando-la-api-de-linkedin-y-php","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/es\/compartir-publicacion-en-linkedin-usando-la-api-de-linkedin-y-php\/","title":{"rendered":"Compartir publicaci\u00f3n en LinkedIn usando la API de LinkedIn y PHP"},"content":{"rendered":"<p>\u00bfQuieres saber c\u00f3mo compartir publicaciones en LinkedIn usando PHP? En este art\u00edculo, le muestro c\u00f3mo enviar una publicaci\u00f3n en LinkedIn usando la API de LinkedIn y PHP.<\/p>\n<p>Compartir publicaciones en las redes sociales le ayuda a atraer m\u00e1s tr\u00e1fico y p\u00fablico a su sitio web. LinkedIn es una red profesional, por lo que tendr\u00eda muchas posibilidades de obtener lectores genuinos.<\/p>\n<p>Si est\u00e1 ejecutando un sitio web, publicar un enlace manualmente en LinkedIn no es una buena elecci\u00f3n. Siempre es mejor tener un sistema automatizado que env\u00ede una publicaci\u00f3n en su feed de manera program\u00e1tica.<\/p>\n<p>LinkedIn proporciona una <a href=\"https:\/\/docs.microsoft.com\/en-us\/linkedin\/marketing\/integrations\/community-management\/shares\/share-api#post-shares\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API para compartir<\/a> mediante la cual puede publicar un enlace junto con el t\u00edtulo, la descripci\u00f3n y la imagen en su feed.<\/p>\n<p>En este tutorial, repasaremos todos los pasos necesarios para compartir una publicaci\u00f3n en LinkedIn. Esto incluir\u00e1 cosas como crear una aplicaci\u00f3n de LinkedIn, generar un token de acceso, obtener una identificaci\u00f3n de perfil de LinkedIn y, finalmente, enviar una publicaci\u00f3n en LinkedIn.<\/p>\n<h3>Crear aplicaci\u00f3n de LinkedIn<\/h3>\n<p>Para comenzar con la API compartida de LinkedIn, primero debe crear la aplicaci\u00f3n con su cuenta de LinkedIn. La integraci\u00f3n de las API de LinkedIn requiere una identificaci\u00f3n de cliente y un secreto de cliente. Tambi\u00e9n debe establecer una URL de redireccionamiento autorizada en su aplicaci\u00f3n.<\/p>\n<p>Para prop\u00f3sitos de prueba, usar\u00e9 la URL de mi servidor local. Debe ajustar esta URL seg\u00fan su flujo.<\/p>\n<ul>\n<li>Vaya a la <a href=\"https:\/\/www.linkedin.com\/developers\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">red de desarrolladores de LinkedIn<\/a>.<\/li>\n<li>Haga clic en el bot\u00f3n &#8216;Crear aplicaci\u00f3n&#8217;.<\/li>\n<li>Complete la configuraci\u00f3n seg\u00fan las pautas de LinkedIn.<\/li>\n<li>Agregue <a href=\"http:\/\/localhost\/linkedin\/callback.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http: \/\/localhost\/linkedin\/callback.php<\/a> en el campo URL de redireccionamiento autorizado.<\/li>\n<li>En la pesta\u00f1a &#8216;Productos&#8217;, seleccione el producto &#8216;Iniciar sesi\u00f3n con LinkedIn&#8217;.<\/li>\n<li>Copie el ID de cliente y las claves secretas del cliente.<\/li>\n<\/ul>\n<h3>Genere un token de acceso de la cuenta de LinkedIn<\/h3>\n<p>Un token de acceso es un identificador que se requiere para realizar operaciones de API en la cuenta del usuario. Compartir publicaciones mediante programaci\u00f3n en LinkedIn requiere un token de acceso.<\/p>\n<p>Para generar un token de acceso, debe autorizar su cuenta. Durante este proceso, necesitamos enviar solicitudes HTTP al punto final de las API. Vamos a instalar la biblioteca Guzzle que nos permite enviar solicitudes HTTP y recibir la respuesta.<\/p>\n<p>Ejecute el siguiente comando en el directorio ra\u00edz de su proyecto para instalar la biblioteca Guzzle.<\/p>\n<pre><code>composer require guzzlehttp\/guzzle<\/code><\/pre>\n<p>A continuaci\u00f3n, cree un <code>config.php<\/code>archivo y pase las credenciales en el archivo como se muestra a continuaci\u00f3n.<\/p>\n<pre><code>&lt;?php\ndefine('CLIENT_ID', 'YOUR_CLIENT_ID');\ndefine('CLIENT_SECRET', 'YOUR_CLIENT_SECRET');\ndefine('REDIRECT_URL', 'http:\/\/localhost\/linkedin\/callback.php');\ndefine('SCOPES', 'r_emailaddress,r_liteprofile,w_member_social');<\/code><\/pre>\n<p>Aseg\u00farese de reemplazar los marcadores de posici\u00f3n con valores reales. Aqu\u00ed, configuro la URL de mi servidor local como &#8216;REDIRECT_URL&#8217;. En su caso, esta URL es diferente. A la constante &#8216;SCOPES&#8217;, he pasado los permisos predeterminados que son suficientes para nuestro objetivo final.<\/p>\n<h4>Cree una URL de autorizaci\u00f3n<\/h4>\n<p>Para obtener su token de acceso, debe crear una URL de autorizaci\u00f3n. Esta URL requiere un client_id y redirect_uri como par\u00e1metro adicional. La URL de autorizaci\u00f3n lo lleva al sitio web de LinkedIn donde debe completar la autenticaci\u00f3n. Despu\u00e9s de completar la autenticaci\u00f3n, lo redireccionar\u00e1 de nuevo a la URL de devoluci\u00f3n de llamada.<\/p>\n<p>Creemos <code>index.php<\/code>y agreguemos el c\u00f3digo para la URL de autorizaci\u00f3n de la siguiente manera.<\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\n\u00a0\u00a0\n$url = \"https:\/\/www.linkedin.com\/oauth\/v2\/authorization?response_type=code&amp;client_id=\".CLIENT_ID.\"&amp;redirect_uri=\".REDIRECT_URL.\"&amp;scope=\".SCOPES;\n?&gt;\n\u00a0\u00a0\n&lt;a href=\"&lt;?php echo $url; ?&gt;\"&gt;Login with LinkedIn&lt;\/a&gt;<\/code><\/pre>\n<h4>C\u00f3digo de autorizaci\u00f3n de intercambio para un token de acceso<\/h4>\n<p>Como se dijo despu\u00e9s de completar la autorizaci\u00f3n, lo redireccionar\u00e1 nuevamente a la URL de redireccionamiento junto con el C\u00f3digo de autorizaci\u00f3n. En el archivo de devoluci\u00f3n de llamada, tenemos que escribir un c\u00f3digo que env\u00eda una solicitud POST con los par\u00e1metros requeridos a la API de LinkedIn y recibe un token de acceso.<\/p>\n<p><strong>callback.php<\/strong><\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\nrequire_once 'vendor\/autoload.php';\nuse GuzzleHttpClient;\n\u00a0\u00a0\ntry {\n\u00a0\u00a0\u00a0\u00a0$client = new Client(['base_uri' =&gt; 'https:\/\/www.linkedin.com']);\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/oauth\/v2\/accessToken', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'form_params' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"grant_type\" =&gt; \"authorization_code\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"code\" =&gt; $_GET['code'],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"redirect_uri\" =&gt; REDIRECT_URL,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"client_id\" =&gt; CLIENT_ID,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"client_secret\" =&gt; CLIENT_SECRET,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\u00a0\u00a0$data = json_decode($response-&gt;getBody()-&gt;getContents(), true);\n\u00a0\u00a0\u00a0\u00a0$access_token = $data['access_token']; \/\/ store this token somewhere\n} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n}<\/code><\/pre>\n<p>Al recibir el token de acceso, gu\u00e1rdelo en un lugar seguro. Puede almacenarlo en la base de datos. LinkedIn no genera tokens de acceso de larga duraci\u00f3n. Tiene una validez de 60 d\u00edas. Debe volver a generar un token de acceso antes de que caduque siguiendo el proceso anterior nuevamente. Es algo feo, pero actualmente, los tokens de actualizaci\u00f3n program\u00e1tica (que se utilizan para regenerar los tokens de acceso en segundo plano) est\u00e1n disponibles solo para un conjunto limitado de socios. Puede leer m\u00e1s sobre esto en la <a href=\"https:\/\/docs.microsoft.com\/en-us\/linkedin\/shared\/authentication\/authorization-code-flow?context=linkedin\/context#step-5-refresh-access-token\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n de LinkedIn<\/a>.<\/p>\n<h4>Obtenga su ID de LinkedIn usando API<\/h4>\n<p>Obtuviste el token de acceso de tu cuenta de LinkedIn. La siguiente parte es obtener su ID de LinkedIn. Esta identificaci\u00f3n es necesaria para compartir una publicaci\u00f3n en LinkedIn. Obtenga este ID enviando una solicitud GET al punto final de la API de LinkedIn \/ v2 \/ me.<\/p>\n<pre><code>&lt;?php\nrequire_once 'config.php';\nrequire_once 'vendor\/autoload.php';\nuse GuzzleHttpClient;\n\u00a0\u00a0\n$access_token = 'YOUR_ACCESS_TOKEN';\ntry {\n\u00a0\u00a0\u00a0\u00a0$client = new Client(['base_uri' =&gt; 'https:\/\/api.linkedin.com']);\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('GET', '\/v2\/me', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'headers' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer \". $access_token,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\u00a0\u00a0$data = json_decode($response-&gt;getBody()-&gt;getContents(), true);\n\u00a0\u00a0\u00a0\u00a0$linkedin_profile_id = $data['id']; \/\/ store this id somewhere\n} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage();\n}<\/code><\/pre>\n<p>Como un token de acceso, debe almacenar este ID de LinkedIn. Necesitaremos tanto el token de acceso como el ID de LinkedIn en el siguiente paso.<\/p>\n<h3>Enviar publicaci\u00f3n en LinkedIn usando la API de LinkedIn y PHP<\/h3>\n<p>Ahora nuestro \u00faltimo paso es enviar una publicaci\u00f3n en LinkedIn. La <a href=\"https:\/\/docs.microsoft.com\/en-us\/linkedin\/marketing\/integrations\/community-management\/shares\/share-api#post-shares\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">documentaci\u00f3n de Share API<\/a> explica el formato de solicitud necesario. Tomando una referencia de \u00e9l, nuestro c\u00f3digo PHP ser\u00eda el siguiente:<\/p>\n<pre><code>&lt;?php\nrequire_once 'vendor\/autoload.php';\nuse GuzzleHttpClient;\n\u00a0\u00a0\n$link = 'YOUR_LINK_TO_SHARE';\n$access_token = 'YOUR_ACCESS_TOKEN';\n$linkedin_id = 'YOUR_LINKEDIN_ID';\n$body = new stdClass();\n$body-&gt;content = new stdClass();\n$body-&gt;content-&gt;contentEntities[0] = new stdClass();\n$body-&gt;text = new stdClass();\n$body-&gt;content-&gt;contentEntities[0]-&gt;thumbnails[0] = new stdClass();\n$body-&gt;content-&gt;contentEntities[0]-&gt;entityLocation = $link;\n$body-&gt;content-&gt;contentEntities[0]-&gt;thumbnails[0]-&gt;resolvedUrl = \"THUMBNAIL_URL_TO_POST\";\n$body-&gt;content-&gt;title = 'YOUR_POST_TITLE';\n$body-&gt;owner = 'urn:li:person:'.$linkedin_id;\n$body-&gt;text-&gt;text = 'YOUR_POST_SHORT_SUMMARY';\n$body_json = json_encode($body, true);\n\u00a0\u00a0\ntry {\n\u00a0\u00a0\u00a0\u00a0$client = new Client(['base_uri' =&gt; 'https:\/\/api.linkedin.com']);\n\u00a0\u00a0\u00a0\u00a0$response = $client-&gt;request('POST', '\/v2\/shares', [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'headers' =&gt; [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Authorization\" =&gt; \"Bearer \". $access_token,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Content-Type\"\u00a0 =&gt; \"application\/json\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"x-li-format\"\u00a0\u00a0 =&gt; \"json\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'body' =&gt; $body_json,\n\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0if ($response-&gt;getStatusCode() !== 201) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo 'Error: '. $response-&gt;getLastBody()-&gt;errors[0]-&gt;message;\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0echo 'Post is shared on LinkedIn successfully.';\n} catch(Exception $e) {\n\u00a0\u00a0\u00a0\u00a0echo $e-&gt;getMessage(). ' for link '. $link;\n}<\/code><\/pre>\n<p>En el c\u00f3digo anterior, debe reemplazar los marcadores de posici\u00f3n con los valores reales. Despu\u00e9s de llamar al punto final de la API \/ v2 \/ shares, obtendr\u00e1 un c\u00f3digo HTTP &#8216;201&#8217;. Significa que la publicaci\u00f3n se crea (se comparte) en LinkedIn.<\/p>\n<h4>Art\u00edculos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/como-implementar-el-inicio-de-sesion-con-linkedin-en-un-sitio-web-con-php\/\" title=\"C\u00f3mo implementar el inicio de sesi\u00f3n con LinkedIn en un sitio web con PHP\">C\u00f3mo implementar el inicio de sesi\u00f3n con LinkedIn en un sitio web con PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/iniciar-sesion-con-linkedin-en-laravel-usando-laravel-socialite\/\" title=\"Iniciar sesi\u00f3n con LinkedIn en Laravel usando Laravel Socialite\">Iniciar sesi\u00f3n con LinkedIn en Laravel usando Laravel Socialite<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/es\/como-integrar-la-api-de-google-sheets-con-php\/\" title=\"C\u00f3mo integrar la API de Google Sheets con PHP\">C\u00f3mo integrar la API de Google Sheets con PHP<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQuieres compartir una publicaci\u00f3n en LinkedIn a trav\u00e9s de API? En este art\u00edculo, escribiremos un script PHP que enviar\u00e1 una publicaci\u00f3n en LinkedIn junto con<\/p>\n","protected":false},"author":1,"featured_media":20147,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[271],"tags":[849],"class_list":["post-29625","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/29625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/comments?post=29625"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/posts\/29625\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media\/20147"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/media?parent=29625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/categories?post=29625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/es\/wp-json\/wp\/v2\/tags?post=29625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}