A associação de cada artigo instantâneo a um URL facilita para os editores adotar artigos instantâneos sem alterar seus fluxos de trabalho de publicação e significa que as pessoas podem ler e compartilhar artigos sem pensar na plataforma ou tecnologia nos bastidores dos cenas.
Integração do CMS
Este SDK foi criado para integrações do CMS para facilitar os desenvolvedores na publicação de conteúdo de seu sistema como artigos instantâneos no Facebook. Para acomodar uma ampla variedade de necessidades de diferentes sistemas e ambientes, ele foi altamente configurável e modularizado em diferentes componentes, que quando usado em uníssono, é um conjunto de ferramentas bastante poderoso e inestimável.
Este guia usa exemplos para demonstrar áreas diferentes para integrar com um CMS básico. Observe que a integração com o WordPress – através dos artigos instantâneos para o plug -in WP – utiliza os mesmos conceitos descritos aqui para que possa ser usado como referência adicional para contexto.
Publicação de conteúdo para o Facebook
Para começar, vamos supor que o conteúdo do seu CMS já seja um artigo totalmente formado e marcação de artigo instantânea válida. Nesse cenário, o Cliente seria o componente do SDK que você precisaria para gerenciar seus artigos no Facebook. Por exemplo, enviar e remover um artigo pode ser feito simplesmente com o seguinte:
Use Facebook \ Instantarticles \ Client \ Client; // instanciar um cliente da API $ ia_client = client :: create ('app_id', 'app_secret', 'access_token', 'page_id'); // empurre o artigo para a sua página do Facebook $ ia_client-> importArticle ($ my_article); // não publicado um artigo da sua página do Facebook $ ia_client-> removearticle ($ canonical_url);
Na realidade, o cliente depende do Elementos Componente para publicar conteúdo no Facebook – seu método importArticle () aceita apenas um objeto InstantAticle – que garante que apenas a marcação válida seja enviada ao Facebook. Mais informações sobre a geração de um artigo instantâneo estruturado é detalhado abaixo.
Convertendo conteúdo em um artigo instantâneo
É mais provável que não, o conteúdo do seu CMS ainda não está formatado em marcas de artigos instantâneos. Além disso, não seria realista esperar que você mantenha várias versões do mesmo conteúdo com uma marcação diferente. O Transformador tem como objetivo remover esse ônus convertendo (ou “transformando”) qualquer marcação de origem HTML em marcação de artigo instantânea compatível. É um componente poderoso e versátil deste SDK.
O Transformador funciona seguindo um conjunto de regras que mapeia a marcação de entrada para os elementos de artigo instantâneo conhecido e aproveita o Elementos Componente para gerar programaticamente a estrutura do artigo. Efetivamente, ele converte Marcação de origem HTML em Marcação de artigo instantâneo.
Dependendo da sua configuração, convém alavancar o Elementos Componente diretamente e evite qualquer transformação em seu conteúdo de origem. Nesse caso, você pode usar o Elementos componente por conta própria para criar artigos programaticamente você, pois não depende do Transformador componente.
O código a seguir mostra como as regras são carregadas no transformador e convertidas em um elemento de instantarticle estruturado:
Use Facebook \ Instantarticles \ Transformer \ Transformer; Use o Facebook \ Instantarticles \ Elements \ Instantarticle; // Crie um objeto transformador $ transformador = new Transformer (); // carrega as regras de um arquivo $ regras = file_get_contents ("my_rules.json ", true); // Configure o transformador com as regras $ transformador-> loadrules ($ regras); // carrega a marcação de origem html de um arquivo e $ html_file = file_get_contents (" simples.html ", true); $ document = new \ domdocument (); $ document-> loadhtml ($ html_file); // instantam um objeto instantarticle $ instant_article = instantarticle :: create (); // Invoke Transformer no $ document)
Do código acima, $ instant_article conteria um elemento de instantarticle estruturado. Para renderizar a marcação de artigos instantâneos ou visualizar quaisquer erros do processo de transformação:
// renderizar o formato de marcação do instantarticle $ resultado = $ instant_article-> render (); // Receba erros do transformador $ avisos = $ transformador-> getwarnings ();
Criando um artigo instantâneo programaticamente
É bastante comum que as informações necessárias para gerar um artigo instantâneo não sejam necessariamente um único documento HTML totalmente formado em seu sistema. A natureza modular deste SDK permite que você obtenha informações de diferentes lugares e construa algumas partes da estrutura do instantarticle programaticamente, enquanto outras peças da marcação HTML transformada.
O Elementos Existe componente para permitir a geração programática de um artigo instantâneo estruturado sem precisar saber os detalhes de sua forma renderizada ou requisitos específicos em hierarquia e conteúdo. Como bônus, ele fornece avisos para estruturas inválidas, permitindo que você detecte mais prontamente problemas em sua marcação de artigos instantâneos antes que eles se tornem erros durante a fase de ingestão ao publicar no Facebook. O Transformador faz uso deste componente.
Por exemplo, você pode criar o corpo do seu artigo com o processo de transformação acima, mas ainda gerar o rodapé do seu artigo manualmente:
// instancia um objeto instantarticle $ instant_article = instantAticle :: create (); // Invoca o transformador apenas no conteúdo do corpo de um documento HTML $ transformador-> transform ($ instant_article, $ document_body); // Adicione o elemento do rodapé ao objeto instantarticle $ instant_article -> withfooter (rodapé :: create () -> withcredits ('Alguns créditos de texto simples.'));
Criando o cabeçalho de um artigo instantâneo programaticamente
Ao criar um artigo instantâneo programaticamente, você pode usar o Elementos Componente para construir a seção de cabeçalho do seu artigo. Aqui está um exemplo de como fazer isso:
// instanciar um objeto InstantAticle
$ instant_article = instantarticle :: create ();
// Crie o elemento de cabeçalho
$ cabeçalho = cabeçalho :: create ();
// Defina o título do artigo
$ header-> withtitle ('meu título de artigo instantâneo');
// defina o autor do artigo
$ header-> WithAuthor ('John Doe');
// Adicione o cabeçalho ao objeto Instantarticle
$ instant_article-> withheader ($ cabeçalho);
Este snippet de código cria um objeto Instantarticle, depois cria um elemento de cabeçalho e define o título e o autor do artigo. Finalmente, ele adiciona o cabeçalho ao objeto Instantarticle.
Questões:
Qual é o objetivo do SDK?
O objetivo do SDK é facilitar as integrações do CMS e permitir que os desenvolvedores publiquem conteúdo de seu sistema como artigos instantâneos no Facebook.
Como o conteúdo de um CMS pode ser publicado como artigos instantâneos?
Para publicar conteúdo de um CMS como artigos instantâneos, o componente cliente do SDK pode ser usado. Ele permite gerenciar artigos no Facebook, como enviar e remover artigos.
Qual é o papel do componente do transformador?
O componente do transformador converte a marcação de origem HTML em marcação de artigos instantâneos compatível, facilitando a formatação do conteúdo de um CMS em artigos instantâneos.
O componente de elementos pode ser usado independentemente do componente do transformador?
Sim, o componente de elementos pode ser usado por conta própria para criar artigos programaticamente sem a necessidade de transformação HTML.
Como os erros do processo de transformação podem ser acessados?
Erros do processo de transformação podem ser acessados chamando o método getwarnings () no objeto Transformer.
Como um artigo instantâneo pode ser criado programaticamente?
Um artigo instantâneo pode ser criado programaticamente usando o componente elementos para construir a estrutura do artigo e adicionar os elementos necessários, como cabeçalho, corpo e rodapé.
Qual é a vantagem de usar o componente de elementos?
O componente Elements permite a geração programática de artigos instantâneos estruturados e fornece avisos para estruturas inválidas, ajudando a detectar problemas na marcação de artigos instantâneos antes de publicar.
Diferentes partes de um artigo instantâneo podem ser provenientes de diferentes lugares?
Sim, a natureza modular do SDK permite obter informações de fornecimento de diferentes lugares e construindo partes da estrutura do artigo instantâneo programaticamente.
Como é o cabeçalho de um artigo instantâneo criado programaticamente?
O cabeçalho de um artigo instantâneo pode ser criado programaticamente usando o elemento do cabeçalho e definindo o título desejado e o autor do artigo.
Publicando artigos instantâneos do seu CMS
A associação de cada artigo instantâneo a um URL facilita para os editores adotar artigos instantâneos sem alterar seus fluxos de trabalho de publicação e significa que as pessoas podem ler e compartilhar artigos sem pensar na plataforma ou tecnologia nos bastidores dos cenas.
Integração do CMS
Este SDK foi criado para integrações do CMS para facilitar os desenvolvedores na publicação de conteúdo de seu sistema como artigos instantâneos no Facebook. Para acomodar uma ampla variedade de necessidades de diferentes sistemas e ambientes, ele foi altamente configurável e modularizado em diferentes componentes, que quando usado em uníssono, é um conjunto de ferramentas bastante poderoso e inestimável.
Este guia usa exemplos para demonstrar áreas diferentes para integrar com um CMS básico. Observe que a integração com o WordPress – através dos artigos instantâneos para o plug -in WP – utiliza os mesmos conceitos descritos aqui para que possa ser usado como referência adicional para contexto.
Publicação de conteúdo para o Facebook
Para começar, vamos supor que o conteúdo do seu CMS já seja um artigo totalmente formado e marcação de artigo instantânea válida. Nesse cenário, o Cliente seria o componente do SDK que você precisaria para gerenciar seus artigos no Facebook. Por exemplo, enviar e remover um artigo pode ser feito simplesmente com o seguinte:
Use Facebook \ Instantarticles \ Client \ Client; // instanciar um cliente da API $ ia_client = client :: create ('app_id', 'app_secret', 'access_token', 'page_id'); // empurre o artigo para a sua página do Facebook $ ia_client-> importArticle ($ my_article); // não publicado um artigo da sua página do Facebook $ ia_client-> removearticle ($ canonical_url);
Na realidade, o cliente depende do Elementos Componente para publicar conteúdo no Facebook – seu método importArticle () aceita apenas um objeto InstantAticle – que garante que apenas a marcação válida seja enviada ao Facebook. Mais informações sobre a geração de um artigo instantâneo estruturado é detalhado abaixo.
Convertendo conteúdo em um artigo instantâneo
É mais provável que não, o conteúdo do seu CMS ainda não está formatado em marcas de artigos instantâneos. Além disso, não seria realista esperar que você mantenha várias versões do mesmo conteúdo com uma marcação diferente. O Transformador tem como objetivo remover esse ônus convertendo (ou “transformando”) qualquer marcação de origem HTML em marcação de artigo instantânea compatível. É um componente poderoso e versátil deste SDK.
O Transformador funciona seguindo um conjunto de regras que mapeia a marcação de entrada para os elementos de artigo instantâneo conhecido e aproveita o Elementos Componente para gerar programaticamente a estrutura do artigo. Efetivamente, ele converte Marcação de origem HTML em Marcação de artigo instantâneo.
Dependendo da sua configuração, convém alavancar o Elementos Componente diretamente e evite qualquer transformação em seu conteúdo de origem. Nesse caso, você pode usar o Elementos componente por conta própria para construir artigos programaticamente você, pois não depende do Transformador componente.
O código a seguir mostra como as regras são carregadas no transformador e convertidas em um elemento de instantarticle estruturado:
Use Facebook \ Instantarticles \ Transformer \ Transformer; Use o Facebook \ Instantarticles \ Elements \ Instantarticle; // Crie um objeto transformador $ transformador = new Transformer (); // carrega as regras de um arquivo $ regras = file_get_contents ("my_rules.json ", true); // Configure o transformador com as regras $ transformador-> loadrules ($ regras); // carrega a marcação de origem html de um arquivo e $ html_file = file_get_contents (" simples.html ", true); $ document = new \ domdocument (); $ document-> loadhtml ($ html_file); // instantam um objeto instantarticle $ instant_article = instantarticle :: create (); // Invoke Transformer no $ document)
Do código acima, $ instant_article conteria um elemento de instantarticle estruturado. Para renderizar a marcação de artigos instantâneos ou visualizar quaisquer erros do processo de transformação:
// renderizar o formato de marcação do instantarticle $ resultado = $ instant_article-> render (); // Receba erros do transformador $ avisos = $ transformador-> getwarnings ();
Criando um artigo instantâneo programaticamente
É bastante comum que as informações necessárias para gerar um artigo instantâneo não sejam necessariamente um único documento HTML totalmente formado em seu sistema. A natureza modular deste SDK permite que você obtenha informações de diferentes lugares e construa algumas partes da estrutura do instantarticle programaticamente, enquanto outras peças da marcação HTML transformada.
O Elementos Existe componente para permitir a geração programática de um artigo instantâneo estruturado sem precisar saber os detalhes de sua forma renderizada ou requisitos específicos em hierarquia e conteúdo. Como bônus, ele fornece avisos para estruturas inválidas, permitindo que você detecte mais prontamente problemas em sua marcação de artigos instantâneos antes que eles se tornem erros durante a fase de ingestão ao publicar no Facebook. O Transformador faz uso deste componente.
Por exemplo, você pode criar o corpo do seu artigo com o processo de transformação acima, mas ainda gerar o rodapé do seu artigo manualmente:
// instancia um objeto instantarticle $ instant_article = instantAticle :: create (); // Invoca o transformador apenas no conteúdo do corpo de um documento HTML $ transformador-> transform ($ instant_article, $ document_body); // Adicione o elemento do rodapé ao objeto instantarticle $ instant_article -> withfooter (rodapé :: create () -> withcredits ('Alguns créditos de texto simples.'));
Criando o cabeçalho de um artigo
Na maioria das vezes, um artigo ou post do seu blog é composto de dados de várias fontes em seu banco de dados. O corpo do artigo pode muito bem ser uma única sequência recuperável de html, mas o título, o autor e outros metadados, como o Criado DateTime e DATETETIMA MODIFICADO precisa ser recuperado individualmente.
O cabeçalho de um artigo instantâneo é frequentemente construído dessa maneira e o exemplo a seguir mostra como construí -lo. Observe os elementos adicionais necessários:
Use o Facebook \ Instantarticles \ Elements \ Header; Use o Facebook \ Instantarticles \ Elements \ time; Use Facebook \ Instantarticles \ Elements \ Author; Use Facebook \ Instantarticles \ Elements \ Image; // $ post é o objeto que contém informações de uma postagem no blog $ header = header :: create () -> withpublishTime (time :: create (time :: publicado) -> withDateTime (novo dateTime ($ post -> _ post-> pós_date, $ date_time_zone)) -> comModify (tempo: cleget :: cleste_date, $ date_time_zone)) -> com (tempo: time :: cleging (clegate (clegate, $ date_time_zon)) -> com (tempo: cleget :: cleste_date, $ date_time_zon))) -> com (tempo: time :: clean: _Modificado, $ date_time_zone))); $ title = $ post-> get_the_title (); if ($ title) {$ document = domdocument :: loadhtml ('
A partir do código acima, o Cabeçalho $ conteria o elemento de cabeçalho completo que poderia ser anexado ao elemento raiz instantarticle durante a criação da sua estrutura completa do artigo instantâneo.
Exemplo completo
A seguir, é apresentado um exemplo simples, mas completo e de ponta a ponta, demonstrando como fazer pleno uso deste SDK para se integrar aos artigos instantâneos:
// instanciar um artigo vazio de instant_article = instantarticle :: create (); // Carregar o arquivo de conteúdo de regras $ regras = file_get_contents ("Transformer-Rules.json ", true); // Crie o transformador e carrega as regras $ transformador = new Transformer (); $ transformador-> loadRules ($ regras); // carrega uma postagem completa no formulário html $ post_html = file_get_contents (" Full_Post.html", true); // Parse HTML into a DOM structure (ignore errors during parsing) libxml_use_internal_errors(true); $document = new \DOMDocument(); $document->loadHTML($post_html); libxml_use_internal_errors(false); // Invoke transformer on the DOM structure $transformer->transform($instant_article, $document); // Get errors from transformer $warnings = $transformer->getWarnings(); // Instantiate an API client $client = Client::create( 'APP_ID' 'APP_SECRET', 'ACCESS_TOKEN', 'PAGE_ID' ); // Push the article try { $client->importArticle($instant_article, $take_live); } catch (Exception $e) { echo 'Could not import the article: '.$ e-> getMessage (); }
Publicando artigos instantâneos do seu CMS
Artigos instantâneos são uma experiência rápida e interativa para ler artigos em feed de notícias. Alimentado pela mesma tecnologia que carrega fotos e vídeos rapidamente em nossos aplicativos móveis, os artigos instantâneos exibem até dez vezes mais rápido que os artigos da web móvel padrão e apresentam fotos de inclinação para pan, vídeo de exibição automática, mapas interativos e legendas de áudio incorporadas que permitem explorar histórias de belas maneiras novas.
Além de criar uma ótima experiência para os leitores, projetamos artigos instantâneos para facilitar o uso dos editores com seus sistemas existentes de gerenciamento de conteúdo (CMS). Não há novas ferramentas para aprender, e os editores podem facilmente publicar seu catálogo completo de artigos todos os dias.
Hoje, gostaríamos de compartilhar mais sobre o sistema para publicar artigos instantâneos, que se baseia nos padrões abertos que alimentam a web e introduzem documentação para editores e provedores de ferramentas.
Publique diretamente no seu sistema de gerenciamento de conteúdo
Ouvimos claramente dos editores que eles querem que uma única ferramenta publique artigos na web, aplicativos móveis ou qualquer outro lugar que os leitores vejam seu conteúdo. É por isso que os artigos instantâneos suportam a publicação diretamente do sistema de gerenciamento de conteúdo de um editor – não há necessidade de criar artigos em um novo local.
Quando os editores começam com artigos instantâneos, eles fornecem um feed RSS de seus artigos para o Facebook, um formato que a maioria dos sistemas de gerenciamento de conteúdo já suporta. Depois que esse feed RSS é configurado, os artigos instantâneos carregam automaticamente novas histórias assim que forem publicadas no site e aplicativos do editor. Atualizações e correções também são capturadas automaticamente através do feed RSS, para que as notícias de última hora permaneçam atualizadas.
Artigos instantâneos são criados com html5
O HTML5 fornece um formato expressivo para especificar todas as informações necessárias para estabelecer um artigo instantâneo e permite que os editores reutilizem o código de seus sites. Este formato também fornece suporte para conteúdo de terceiros, incluindo incorporações, anúncios e análises de mídia social-todos os quais podem ser incorporados em artigos instantâneos, assim como eles estão na web.
Como exemplo, vamos dar uma olhada na maneira como um editor inclui um vídeo em um artigo instantâneo, usando os padrões da Web:
Este é um exemplo de marcação de vídeo
Artigos instantâneos não’T Real a oferecer uma experiência rápida – ele também amplia as possibilidades de artigos interativos em telefones celulares com novos recursos como vídeo automático, legendas de áudio e mapas interativos usando tags html5 simples. Por exemplo, essa é a marcação para incluir uma foto com uma legenda de áudio de jogo automático, além de personalização opcional da legenda da foto, margens de fotos e botões de comentários do Facebook:
Este é um exemplo de marcação de imagem
Foto de Jane Fotógrafo
Estamos entusiasmados em ver como a comunidade utilizará essa nova funcionalidade e, porque é definida em um formato aberto, esperamos que esses recursos também sejam implementados em sites, aplicativos e outras plataformas do futuro no futuro. Avançando, continuaremos trabalhando em estreita colaboração com nossos parceiros do editor para identificar as melhores ferramentas e abrir padrões para facilitar a publicação de artigos instantâneos.
Compartilhar é perfeito em qualquer plataforma
Cada artigo instantâneo está associado ao URL, onde a versão da Web está hospedada no site do editor. Isso significa que os artigos instantâneos são abertos e compatíveis com todas as maneiras pelas quais as pessoas compartilham links na web hoje:
Quando um amigo ou página que você segue compartilha um link em seu feed de notícias, verificamos se há um artigo instantâneo associado a esse URL. Nesse caso, você verá isso como um artigo instantâneo. Caso contrário, será aberto no navegador da web.
Quando você compartilha um artigo instantâneo no Facebook ou usando email, SMS ou Twitter, você está compartilhando o link para o site do editor para que qualquer pessoa possa abrir o artigo, independentemente da plataforma que use.
A associação de cada artigo instantâneo a um URL facilita para os editores adotar artigos instantâneos sem alterar seus fluxos de trabalho de publicação e significa que as pessoas podem ler e compartilhar artigos sem pensar na plataforma ou tecnologia nos bastidores dos cenas.
Expandindo para mais pessoas e editores
Temos testado artigos instantâneos nos últimos meses com uma pequena porcentagem de pessoas no Facebook que veem novos artigos publicados todos os dias em nossos editores de lançamento. Esta fase de teste inicial nos permite obter feedback de pessoas e editores antes de estender o programa de maneira mais ampla. Nos próximos meses, estaremos expandindo o número de pessoas no aplicativo do Facebook no iPhone que podem ver artigos instantâneos.
Também estamos anunciando hoje que mais de uma dúzia de parceiros adicionais estão se juntando ao programa em breve. Trazer editores adicionais a bordo nos próximos meses e esperamos estender o programa de artigos instantâneos no futuro, para que qualquer editor ou blog de conteúdo possa criar ótimas experiências de artigo no Facebook.
Para saber mais sobre o processo para publicar artigos instantâneos e a marcação RSS e HTML5, dê uma olhada em nossa documentação de artigos instantâneos.
Quero se tornar um editor de artigos instantâneos? Preencha nosso formulário de contato.
CMS do Facebook
O sistema permite em algumas horas criar um aplicativo ou site contendo várias páginas.
Todas as páginas do aplicativo têm a ordem seqüencial de exibição.
O quadro consiste em uma página de segundo plano, que mostra toda a base gráfica e elementos ativos, que são colocados em cima de um fundo (campos de entrada, botões, links, etc.) Cada tipo de elemento contém propriedades que afetam o armazenamento dos dados inseridos ou o comportamento da página (como os botões vão para a próxima página ou para o próximo estado). Cada página também pode ter vários estados. Em diferentes estados de página, certos elementos podem ser mostrados ou ocultos. Mudar os estados da página depende da lógica, que é dada pelos elementos ativos. Depois de terminar as configurações necessárias, o aplicativo pode ser publicado no Facebook ou ser exportado diretamente do painel de administração para o projeto da Web independente e hospedado no servidor do cliente. Ao exportar o aplicativo, o aplicativo da Web completamente independente com base na estrutura YII é gerado. Tudo o que você precisa fazer é descompactar o arquivo no servidor do cliente importar o banco de dados e alterar algumas configurações no arquivo de configuração.
– O sistema é baseado na estrutura YII;
– Durante o desenvolvimento, usamos ativamente os módulos do gerador YII;
– Trabalhe com a API do Facebook;
– Muitas soluções implementadas no JavaScript;
– Trabalhe com JQuery, JQuery UI, EJS Modelo.
Tecnologias
AJAX, CSS, API do Facebook, HTML, Javascript, JQuery, JQuery UI, JS Scripts Custom, JSON, MySQL, Open Gráfico, Php, Rest API, SVN, YII
O Cliente nos definiu a tarefa para implementar o projeto em pouco tempo (6 semanas), enquanto fornece total liberdade de ação ao lidar com pequenos problemas na funcionalidade. Assim, dois programadores seniores e dois programadores do meio com diferentes encostas (front -end / back -end) estavam envolvidos. O processo de desenvolvimento levou um arquiteto que coordenou o trabalho e resolveu as questões controversas na implementação.
– Programador de back -end PHP (Senior);
– Programador JavaScript de Frontend (Senior);
O projeto foi colocado com sucesso em operação dentro de 6 semanas.
Integração Spotlight: Facebook
Com mais de 1 bilhão de usuários em todo o mundo, o Facebook é a maior rede social do mundo. Ao contrário de outras ferramentas de comunicação on -line, o Facebook permite que os usuários compartilhem atualizações, fotos, links e vídeos pessoais com muitas pessoas ao mesmo tempo, facilitando a conexão e o compartilhamento com muitos familiares e amigos por meio de um canal.
Você tem que conversar com o público onde eles estão e, nesta época, o social é a maneira mais poderosa de fazer isso. Gerenciar suas promoções sociais em diferentes sites é mais simples e eficaz quando você faz isso em conjunto com sua narrativa. Ponto brilhante’As integrações sociais permitem expandir sua pegada digital de maneiras inteligentes, direcionadas e eficazes.
Com a integração do BrightSpot no Facebook, os usuários do CMS podem:
Adicione interesse visual aos artigos incorporando postagens no Facebook na página
Ative os visitantes do site para compartilhar perfeitamente o conteúdo no Facebook
Crie e agende postagens sociais para o conteúdo para postar no Facebook
Para mais informações, consulte nossa documentação completa.
Descubra como configurar o BrightSpot para conectar -se ao seu aplicativo do Facebook e postagens de autor diretamente a um perfil ou página do Facebook