La forma más sencilla:
https://www.addtoany.com/buttons/for/website
Generar el código y ponerlo en tu web (en el caso de Linkedin hace caso omiso a las metas de og, simplemente coge la primera imagen que encuentra)
Mostrando entradas con la etiqueta API Twitter. Mostrar todas las entradas
Mostrando entradas con la etiqueta API Twitter. Mostrar todas las entradas
Facebook, Twitter y Linkedin: Metas para compartir
<meta property="og:type" content="website"/>
<meta property='og:url' content='https://www.youtube.com/watch?v=Kvj_qEPgPps' />
<meta property="og:title" content="Atrápame si puedes (2002) de Steven Spielberg"/>
<meta property="og:description" content="Atrápame si puedes (2002) de Steven Spielberg">
<meta property="og:image" content="https://www.midominio.com/images/rrss/facebook.jpg">
<meta name="twitter:card" content="summary"/>
<meta name="twitter:url" content="https://www.youtube.com/watch?v=Kvj_qEPgPps"/>
<meta name="twitter:title" content="Atrápame si puedes (2002) de Steven Spielberg"/>
<meta name="twitter:description" content="Atrápame si puedes (2002) de Steven Spielberg"/>
<meta name="twitter:image" content="https://i2.ytimg.com/vi/Kvj_qEPgPps/default.jpg"/>
Información de Twitter:
https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/summary
Para Linkedin los metas son los mismos que Facebook pero es aconsejable también añadir:
<meta property="og:image:secure_url" content="https://www.midominio.com/images/rrss/linkedin.jpg">
Para chequearlo en FB:
https://developers.facebook.com/tools/debug/
Para chequearlo en Twitter:
https://cards-dev.twitter.com/validator
Para chequearlo en Linkedin:
https://www.linkedin.com/post-inspector/inspect/
Si en Twitter te diera el error de:
Fetching the page failed because it's denied by robots.txt
Para solucionarlo hay que poner en nuestro robots.txt:
User-agent: Twitterbot
allow:
Más información en: https://www.flimper.com/blog/es/que-es-open-graph-y-como-se-hace
Ejemplo de compartir vídeo de YouTube:
<a href="https://www.facebook.com/sharer/sharer.php?u=https://www.youtube.com/watch?v=Y8UFpmqYTMY">xxx</a>
<a href="https://twitter.com/intent/tweet?url=https://www.youtube.com/watch?v=Y8UFpmqYTMY&text=prueba">xxx</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://www.youtube.com/embed/Y8UFpmqYTMY">xxx</a>
<a href="https://api.whatsapp.com/send?text=https://www.youtube.com/watch?v=Y8UFpmqYTMY">xxx</a>
Ejemplo de compartir imagen:
<a href="https://www.facebook.com/sharer/sharer.php?u=https://www.midominio.com/imagenes/slide20191106105324.jpg">xxx</a>
<a href="https://twitter.com/intent/tweet?url=https://www.midominio.com/twitter.php?id=3">xxx</a>
En twitter.php debe tener los metas de twitter:
<?php
require("inc_config.php");
$sql = "SELECT * FROM mitabla where id = ".$id;
$db->query($sql);
$db->next_record();
$imagenShare = $base."imagenes/noticias/".$db->Record["imagen"];
$titleShare = $db->Record["titular"];
?>
<!DOCTYPE html>
<html>
<head>
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="@loquesea" />
<meta name="twitter:title" content="<?=$titleShare;?>" />
<meta name="twitter:description" content="<?=$titleShare;?>" />
<meta name="twitter:image" content="<?=$imagenShare;?>" />
<meta property="og:image:secure_url" content="<?=$imagenShare;?>">
</head>
<body>
<img src="<?=$imagenShare;?>">
</body>
</html>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://www.midominio.com/imagenes/slide20191105125558.jpg">xxx</a>
<a href="https://api.whatsapp.com/send?text=https://www.midominio.com/imagenes/slide20191105125558.jpg">xxx</a>
Añadir "Me Gusta" de Facebook y Twitter a cualquier página de tu web
<div style="background-color: #000;border: 1px solid #fff;padding: 10px;width:50%;margin:0 auto;">
<div>
<?php
$linkFacebook = $_SERVER["REQUEST_URI"];
$urlTotalTW = $_SERVER["SERVER_NAME"]."/".$_SERVER["PHP_SELF"];
?>
<div class="fb-like" data-href="<?=$linkFacebook;?>"
data-width="300" data-layout="standard" data-action="like"
data-show-faces="true" data-share="true"></div>
<div>
<a class="twitter-share-button" href="<?=$urlTotalTW;?>" data-size="large"> Tweet</a>
</div>
<!-- TW -->
<a href="https://twitter.com/despoCinefilo" class="twitter-follow-button" data-show-count="false" data-lang="es">@despoCinefilo</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
</div>
</div>
Mostrar en una web todos los tweets de tu cuenta de Twitter
Entras en https://twitter.com/settings/widgets con tu cuenta de Twitter y creas uno nuevo
Te genera un código que es el que tienes que pegar en tu página, será algo así como:
Te genera un código que es el que tienes que pegar en tu página, será algo así como:
<a class="twitter-timeline" href="https://twitter.com/despotricador" data-widget-id="269991459750584322">Tweets del @despotricador.</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
Twitter: Botón para compartir enlace desde una página de tu web
<?php
$urlTotalTW = $_SERVER["SERVER_NAME"]."/".$_SERVER["PHP_SELF"];
?>
<a class="twitter-share-button" href="<?=$urlTotalTW;?>" data-size="large"> Tweet</a>
Más información en:
https://dev.twitter.com/web/tweet-button
API Twitter: Obtener todos los tweets
En https://dev.twitter.com crearte una nueva aplicación para obtener los token, accesos, etc.
TwitterAPIExchange.php:
obtener_tweets.php:
TwitterAPIExchange.php:
/**
* Twitter-API-PHP : Simple PHP wrapper for the v1.1 API
*
* PHP version 5.3.10
*
* @category Awesomeness
* @package Twitter-API-PHP
* @author James Mallison <me@j7mbo.co.uk>
* @license MIT License
* @version 1.0.4
* @link http://github.com/j7mbo/twitter-api-php
*/
class TwitterAPIExchange
{
/**
* @var string
*/
private $oauth_access_token;
/**
* @var string
*/
private $oauth_access_token_secret;
/**
* @var string
*/
private $consumer_key;
/**
* @var string
*/
private $consumer_secret;
/**
* @var array
*/
private $postfields;
/**
* @var string
*/
private $getfield;
/**
* @var mixed
*/
protected $oauth;
/**
* @var string
*/
public $url;
/**
* @var string
*/
public $requestMethod;
/**
* The HTTP status code from the previous request
*
* @var int
*/
protected $httpStatusCode;
/**
* Create the API access object. Requires an array of settings::
* oauth access token, oauth access token secret, consumer key, consumer secret
* These are all available by creating your own application on dev.twitter.com
* Requires the cURL library
*
* @throws \RuntimeException When cURL isn't loaded
* @throws \InvalidArgumentException When incomplete settings parameters are provided
*
* @param array $settings
*/
public function __construct(array $settings)
{
if (!function_exists('curl_init'))
{
throw new RuntimeException('TwitterAPIExchange requires cURL extension to be loaded, see: http://curl.haxx.se/docs/install.html');
}
if (!isset($settings['oauth_access_token'])
|| !isset($settings['oauth_access_token_secret'])
|| !isset($settings['consumer_key'])
|| !isset($settings['consumer_secret']))
{
throw new InvalidArgumentException('Incomplete settings passed to TwitterAPIExchange');
}
$this->oauth_access_token = $settings['oauth_access_token'];
$this->oauth_access_token_secret = $settings['oauth_access_token_secret'];
$this->consumer_key = $settings['consumer_key'];
$this->consumer_secret = $settings['consumer_secret'];
}
/**
* Set postfields array, example: array('screen_name' => 'J7mbo')
*
* @param array $array Array of parameters to send to API
*
* @throws \Exception When you are trying to set both get and post fields
*
* @return TwitterAPIExchange Instance of self for method chaining
*/
public function setPostfields(array $array)
{
if (!is_null($this->getGetfield()))
{
throw new Exception('You can only choose get OR post fields (post fields include put).');
}
if (isset($array['status']) && substr($array['status'], 0, 1) === '@')
{
$array['status'] = sprintf("\0%s", $array['status']);
}
foreach ($array as $key => &$value)
{
if (is_bool($value))
{
$value = ($value === true) ? 'true' : 'false';
}
}
$this->postfields = $array;
// rebuild oAuth
if (isset($this->oauth['oauth_signature']))
{
$this->buildOauth($this->url, $this->requestMethod);
}
return $this;
}
/**
* Set getfield string, example: '?screen_name=J7mbo'
*
* @param string $string Get key and value pairs as string
*
* @throws \Exception
*
* @return \TwitterAPIExchange Instance of self for method chaining
*/
public function setGetfield($string)
{
if (!is_null($this->getPostfields()))
{
throw new Exception('You can only choose get OR post / post fields.');
}
$getfields = preg_replace('/^\?/', '', explode('&', $string));
$params = array();
foreach ($getfields as $field)
{
if ($field !== '')
{
list($key, $value) = explode('=', $field);
$params[$key] = $value;
}
}
$this->getfield = '?' . http_build_query($params, '', '&');
return $this;
}
/**
* Get getfield string (simple getter)
*
* @return string $this->getfields
*/
public function getGetfield()
{
return $this->getfield;
}
/**
* Get postfields array (simple getter)
*
* @return array $this->postfields
*/
public function getPostfields()
{
return $this->postfields;
}
/**
* Build the Oauth object using params set in construct and additionals
* passed to this method. For v1.1, see: https://dev.twitter.com/docs/api/1.1
*
* @param string $url The API url to use. Example: https://api.twitter.com/1.1/search/tweets.json
* @param string $requestMethod Either POST or GET
*
* @throws \Exception
*
* @return \TwitterAPIExchange Instance of self for method chaining
*/
public function buildOauth($url, $requestMethod)
{
if (!in_array(strtolower($requestMethod), array('post', 'get', 'put', 'delete')))
{
throw new Exception('Request method must be either POST, GET or PUT or DELETE');
}
$consumer_key = $this->consumer_key;
$consumer_secret = $this->consumer_secret;
$oauth_access_token = $this->oauth_access_token;
$oauth_access_token_secret = $this->oauth_access_token_secret;
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
$getfield = $this->getGetfield();
if (!is_null($getfield))
{
$getfields = str_replace('?', '', explode('&', $getfield));
foreach ($getfields as $g)
{
$split = explode('=', $g);
/** In case a null is passed through **/
if (isset($split[1]))
{
$oauth[$split[0]] = urldecode($split[1]);
}
}
}
$postfields = $this->getPostfields();
if (!is_null($postfields)) {
foreach ($postfields as $key => $value) {
$oauth[$key] = $value;
}
}
$base_info = $this->buildBaseString($url, $requestMethod, $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
$this->url = $url;
$this->requestMethod = $requestMethod;
$this->oauth = $oauth;
return $this;
}
/**
* Perform the actual data retrieval from the API
*
* @param boolean $return If true, returns data. This is left in for backward compatibility reasons
* @param array $curlOptions Additional Curl options for this request
*
* @throws \Exception
*
* @return string json If $return param is true, returns json data.
*/
public function performRequest($return = true, $curlOptions = array())
{
if (!is_bool($return))
{
throw new Exception('performRequest parameter must be true or false');
}
$header = array($this->buildAuthorizationHeader($this->oauth), 'Expect:');
$getfield = $this->getGetfield();
$postfields = $this->getPostfields();
if (in_array(strtolower($this->requestMethod), array('put', 'delete')))
{
$curlOptions[CURLOPT_CUSTOMREQUEST] = $this->requestMethod;
}
$options = $curlOptions + array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
);
if (!is_null($postfields))
{
$options[CURLOPT_POSTFIELDS] = http_build_query($postfields, '', '&');
}
else
{
if ($getfield !== '')
{
$options[CURLOPT_URL] .= $getfield;
}
}
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
$this->httpStatusCode = curl_getinfo($feed, CURLINFO_HTTP_CODE);
if (($error = curl_error($feed)) !== '')
{
curl_close($feed);
throw new \Exception($error);
}
curl_close($feed);
return $json;
}
/**
* Private method to generate the base string used by cURL
*
* @param string $baseURI
* @param string $method
* @param array $params
*
* @return string Built base string
*/
private function buildBaseString($baseURI, $method, $params)
{
$return = array();
ksort($params);
foreach($params as $key => $value)
{
$return[] = rawurlencode($key) . '=' . rawurlencode($value);
}
return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $return));
}
/**
* Private method to generate authorization header used by cURL
*
* @param array $oauth Array of oauth data generated by buildOauth()
*
* @return string $return Header used by cURL for request
*/
private function buildAuthorizationHeader(array $oauth)
{
$return = 'Authorization: OAuth ';
$values = array();
foreach($oauth as $key => $value)
{
if (in_array($key, array('oauth_consumer_key', 'oauth_nonce', 'oauth_signature',
'oauth_signature_method', 'oauth_timestamp', 'oauth_token', 'oauth_version'))) {
$values[] = "$key=\"" . rawurlencode($value) . "\"";
}
}
$return .= implode(', ', $values);
return $return;
}
/**
* Helper method to perform our request
*
* @param string $url
* @param string $method
* @param string $data
* @param array $curlOptions
*
* @throws \Exception
*
* @return string The json response from the server
*/
public function request($url, $method = 'get', $data = null, $curlOptions = array())
{
if (strtolower($method) === 'get')
{
$this->setGetfield($data);
}
else
{
$this->setPostfields($data);
}
return $this->buildOauth($url, $method)->performRequest(true, $curlOptions);
}
/**
* Get the HTTP status code for the previous request
*
* @return integer
*/
public function getHttpStatusCode()
{
return $this->httpStatusCode;
}
}
obtener_tweets.php:
require_once('TwitterAPIExchange.php');
$settings = array(
'oauth_access_token' => "xxxxx",
'oauth_access_token_secret' => "xxxxx",
'consumer_key' => "xxxxxxxxxxx",
'consumer_secret' => "xxxxxx"
);
$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$getfield = '?screen_name=CocaCola_es&count=10';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
$json = $twitter->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
$arr = json_decode($json);
// print_r($arr);exit;
foreach ($arr as $clave=>$valor) { ?>
<h2><a href="<?=$valor->entities->urls[0]->url;?>" target="_blank"><?=utf8_decode($valor->text);?></a></h2>
<br><br>
<?php
}
?>
API Twitter: Operaciones
HACER QUE TODO LO QUE SE PUBLIQUE EN FACEBOOK SE PUBLIQUE EN TWITTER
a) https://www.facebook.com/twitter/index.php (loguearte en FB si no estuvieses)
b) Click a "vincula tus paginas a Twitter" (solo queremos la web, no el usuario)
c) Guardar cambios
------------------------------------
BOTON SEGUIR UNA WEB
se debe poner en la web que se quiera seguir el siguiente código:
<a href="https://twitter.com/nombre_cuenta" class="twitter-follow-button" data-show-count="false" data-lang="es">Seguir a @nombre_cuenta</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
Más información en: https://dev.twitter.com/docs/follow-button
--------------------------------------
PUBLICAR AUTOMATICAMENTE EN TWITTER DESDE PHP
Primero crear en dev.twitter.com una nueva aplicación que le daremos permisos de lectura, escritura y de acceso y obtenemos las claves y los tokens (también hay que especificar desde que webs se le va a llamar).
<?php
include("twitter/twitteroauth1_1/twitteroauth.php");
function acortar_url($url_larga) {
$tiny = "http://api.bit.ly/v3/shorten?login=xxxx&apiKey=xxxx&format=txt&longUrl=".$url_larga;
$sesion = curl_init();
curl_setopt($sesion, CURLOPT_URL, $tiny);
curl_setopt($sesion, CURLOPT_RETURNTRANSFER, 1);
$url_tiny = curl_exec($sesion);
curl_close($sesion);
return($url_tiny);
}
// En la variable $msg meter el texto que se quiere publicar en Twitter (por ejemplo el título de la noticia)
$msg = "lo que sea";
// NOTA: En la propia variable $msg se puede meter el link a la página que se quiera enlazar desde Twitter, por ejemplo:
$msg = "En un lugar de la mancha de cuyo nombre. Más información en http://www.miempresa.com/pepe.html";
// A partir de aquí hasta el final no cambiar ya nada, dejarlo como está
$pos1 = strpos($msg,"http://");
$texto = substr($msg, 0, $pos1);
$url = substr($msg, $pos1, 100);
$url_corta = acortar_url($url);
$msg_final = $texto.$url_corta;
define('_CONSUMER_KEY','xxxxx');
define('_CONSUMER_SECRET','xxxx');
define('_OAUTH_TOKEN','xxxx');
define('_OAUTH_TOKEN_SECRET','xxxx');
$connection = getConnectionWithAccessToken();
$twitter = $connection->post('statuses/update', array('status' => utf8_encode($msg_final)));
function getConnectionWithAccessToken() {
$connection = new TwitterOAuth(_CONSUMER_KEY, _CONSUMER_SECRET,_OAUTH_TOKEN, _OAUTH_TOKEN_SECRET);
return $connection;
}
-------------------------------------------------------
a) https://www.facebook.com/twitter/index.php (loguearte en FB si no estuvieses)
b) Click a "vincula tus paginas a Twitter" (solo queremos la web, no el usuario)
c) Guardar cambios
------------------------------------
BOTON SEGUIR UNA WEB
se debe poner en la web que se quiera seguir el siguiente código:
<a href="https://twitter.com/nombre_cuenta" class="twitter-follow-button" data-show-count="false" data-lang="es">Seguir a @nombre_cuenta</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
Más información en: https://dev.twitter.com/docs/follow-button
--------------------------------------
PUBLICAR AUTOMATICAMENTE EN TWITTER DESDE PHP
Primero crear en dev.twitter.com una nueva aplicación que le daremos permisos de lectura, escritura y de acceso y obtenemos las claves y los tokens (también hay que especificar desde que webs se le va a llamar).
<?php
include("twitter/twitteroauth1_1/twitteroauth.php");
function acortar_url($url_larga) {
$tiny = "http://api.bit.ly/v3/shorten?login=xxxx&apiKey=xxxx&format=txt&longUrl=".$url_larga;
$sesion = curl_init();
curl_setopt($sesion, CURLOPT_URL, $tiny);
curl_setopt($sesion, CURLOPT_RETURNTRANSFER, 1);
$url_tiny = curl_exec($sesion);
curl_close($sesion);
return($url_tiny);
}
// En la variable $msg meter el texto que se quiere publicar en Twitter (por ejemplo el título de la noticia)
$msg = "lo que sea";
// NOTA: En la propia variable $msg se puede meter el link a la página que se quiera enlazar desde Twitter, por ejemplo:
$msg = "En un lugar de la mancha de cuyo nombre. Más información en http://www.miempresa.com/pepe.html";
// A partir de aquí hasta el final no cambiar ya nada, dejarlo como está
$pos1 = strpos($msg,"http://");
$texto = substr($msg, 0, $pos1);
$url = substr($msg, $pos1, 100);
$url_corta = acortar_url($url);
$msg_final = $texto.$url_corta;
define('_CONSUMER_KEY','xxxxx');
define('_CONSUMER_SECRET','xxxx');
define('_OAUTH_TOKEN','xxxx');
define('_OAUTH_TOKEN_SECRET','xxxx');
$connection = getConnectionWithAccessToken();
$twitter = $connection->post('statuses/update', array('status' => utf8_encode($msg_final)));
function getConnectionWithAccessToken() {
$connection = new TwitterOAuth(_CONSUMER_KEY, _CONSUMER_SECRET,_OAUTH_TOKEN, _OAUTH_TOKEN_SECRET);
return $connection;
}
-------------------------------------------------------
API Twitter: Loguearse con la cuenta de Twitter
a) ir a tu cuenta de programador en https://apps.twitter.com/
b) Logueate (solo por tener cuenta en twitter ya te vale la misma cuenta, si no tienes puedes regístrate).
c) Pestaña "Mis aplicaciones"
d) Crear Nueva aplicación
Nombre: loguearse_miempresa (por ejemplo)
Descripción: Desc loguear en miempresa
website: La raiz desde donde se va a llamar a esa aplicación (solo funcionará si se llama desde allí), por ejemplo: http://www.miempresa.com
callback: La url del fichero callback al que se devolverá una vez identificado: Ej) www.miempresa.com/twitter/callback.php
e) Una vez creada la aplicación ir a la pestaña "Details" y pulsar "Create my access token"
f) Ir pestaña "Settings" y cambia el icono por el que quieras y sobre todo marcar el checkbox: Read, Write and Access Direct
g) NO hay que marcar el checkbox "Allow this application to sign with twitter"
h) A los pocos segundos ya puede usarse esa aplicación.
Ejemplo completo en:
https://github.com/leandrosiegar/repositorio/tree/master/twitter
b) Logueate (solo por tener cuenta en twitter ya te vale la misma cuenta, si no tienes puedes regístrate).
c) Pestaña "Mis aplicaciones"
d) Crear Nueva aplicación
Nombre: loguearse_miempresa (por ejemplo)
Descripción: Desc loguear en miempresa
website: La raiz desde donde se va a llamar a esa aplicación (solo funcionará si se llama desde allí), por ejemplo: http://www.miempresa.com
callback: La url del fichero callback al que se devolverá una vez identificado: Ej) www.miempresa.com/twitter/callback.php
e) Una vez creada la aplicación ir a la pestaña "Details" y pulsar "Create my access token"
f) Ir pestaña "Settings" y cambia el icono por el que quieras y sobre todo marcar el checkbox: Read, Write and Access Direct
g) NO hay que marcar el checkbox "Allow this application to sign with twitter"
h) A los pocos segundos ya puede usarse esa aplicación.
Ejemplo completo en:
https://github.com/leandrosiegar/repositorio/tree/master/twitter
Suscribirse a:
Entradas (Atom)
