Notion a PHP jako nástroj na evidenci a kontrolu zpětných odkazů

Rozhlížím se s kolegy po alternativě k oblíbenému Trellu. Zaujalo nás Notion, především kvůli schopnosti si postavit libovolnou strukturu databáze a pohledů na data. A protože rád testuji věci na maximum, rozhodl jsem se zapojit do hry Notion API a s využitím PHP jej proměnit na evidenci a kontrolu linkbuildingu.

Notion je no code platforma pro evidenci poznámek, úkolů a s trochou dobré vůle i pro jednoduchou správu projektů. Byť se na to názory různí. Silnou stránkou je možnost vybudovat si vlastní strukturu dat, které budete ukládat do různých stránek. Ale představovat Notion od základu zde nechci, mrkněte třeba na video.

Líbí se mi, že Notion má poměrně srozumitelné API, pomocí kterého je možné číst, ale i zapisovat data do databázových tabulek, které si v něm připravíte. API využívá řada nástrojů třetích stran, v čele třeba s populárními platformami Make nebo IFTTT. Kromě toho si vytvoříte i vlastní připojení a pro jednotlivé tabulky určíte, zda bude mít přístup jen pro čtení nebo i pro zápis.

Postupně si v Notion zkouším vybudovat jakousi nástěnku s přehledy, která mi nabídne pohled na úkoly, jako to umí Trello, a zároveň dovolí pohodlnější doplňování poznámek. Mimochodem, má docela dobře zvládnutý import z Trella.

Jednou z agend, které do Notion převádím z Google Docs, je seznam zpětných odkazů. Co mi kdo nabídl, kam je umístil a na jakou moji stránku odkazuje. A které odkazy jsem na oplátku nabídl já. V online tabulce od Google jsem se nedokopal k automatizaci, která by kontrolovala, zda jsou odkazy u partnerů stále aktivní. Nastal čas to dořešit v Notion.

Notion a tabulka s kontrolou odkazů

Příprava tabulky pro evidenci výměny odkazů v Notion

Vytvořil jsem novou stránku, do které jsem nachystal databázi s následujícími sloupečky:

  • Název (výchozí name pro položku, pravděpodobně nejde smazat)
  • V pořádku (checkbox, poslouží pro info, zda partner odkazuje, jak slíbil)
  • URL (odkaz, stránka partnera, která má odkazovat na můj web)
  • Cíl (odkaz na můj web, který by měl partner mít na stránce)
  • Moje URL (odkaz, stránka, kterou jsem nabídl na výměnu)
  • Můj cíl (odkaz, adresa, na kterou odkazuji)
  • Kontakt (e-mail, kontakt na partnera)
  • Poslední kontrola (datum a čas, kam API napíše poslední kontrolu odkazu)

V této databázi jsem v Notion vytvořil dva pohledy pomocí filtrů. První jsem nazval Problémové. Jde o výchozí zobrazení, které mi vyfiltruje jenom ty řádky, které nemají aktivní zatrhovátko ve sloupečku V pořádku. Druhé zobrazení Všechny výměny je zcela bez filtru. Vespod jsem využil možnosti Notion zobrazit počet záznamů.

Příprava na komunikaci s Notion pomocí API a PHP

V Notion na stránce My Integrations jsem vytvořil novou integraci, abych získal bezpečnostní token pro komunikaci. Protože budu do databáze ukládat informace, zda je výměna odkazu v pořádku, tak jsem povolil i zápis dat.

Dále jsem zobrazil samostatnou stránku s databází. Toho docílíte klepnutím na roztažené šipky v záhlaví tabulky s popiskem Open as full page. Vpravo nahoře jsem klikl na tři tečky a pomocí zobrazeného menu jsem přidal spojení na svou integraci.

Z URL adresy jsem si zároveň vykopíroval strojové označení databáze – část URL adresy před parametrem ?v=….

Nachystal jsem si kostru nové aplikace v PHP pomocí nástroje Composer (composer init) a do projektu pak začlenil brd6/notion-sdk-php – PHP verzi oficiálního Notion API.

Napojení PHP na Notion API

Jednoduchý skript index.php začíná napojením výše zmíněné knihovny pomocí klíčových slov use. Následuje napojení na Notion za pomoci tokenu, který jsem získal při vytvoření nové integrace.

<?php

require "vendor/autoload.php";

use Brd6\NotionSdkPhp\Client;
use Brd6\NotionSdkPhp\ClientOptions;
use \Brd6\NotionSdkPhp\Resource\Database\DatabaseRequest;

$options = (new ClientOptions())
  ->setAuth('NOTION_INTEGRATION_TOKEN');
$notion = new Client($options);

Další část skriptu zahrnuje výběr databáze, se kterou má skript komunikovat. Zde jsem tedy využil její strojové označení získané z URL při zobrazení databáze na samostatné stránce.

$databaseRequest = new DatabaseRequest();
$myPage = $notion->databases()->query('STROJOVY_NAZEV_DATABAZE', $databaseRequest);
$results = $myPage->getResults();

Získaná data skript prochází ve smyčce řádek po řádku. Každá položka je v terminologii Notion API nazývána jako page. Takže využívám získané ID řádku, pomocí kterého načtu konkrétní page, neboli informace o jednom záznamu v databázové tabulce, včetně všech jeho položek.

Zajímá mě především sloupeček URL z tabulky v Notion. Stejně tak sloupeček Cíl. Funkcí backlinkCheck() zkontroluji, zda se na dané URL nachází cílový odkaz a do sloupečku napíšu výsledek kontroly (pravda/nepravda, protože je to checkbox).

Do aktuální page pak přiřadím vlastnosti. Co se do API předá, to se v Notion aktualizuje, zbylá data zůstanou beze změny. Přiřazuji tedy informaci o kontrole a rovněž datum. Zde jsem chvíli bádal nad formátem, nakonec mi pomohla oficiální dokumentace Notion API, abych zjistil, že datumové položky musejí být pole se začátkem a koncem.

Aktualizovaná data se tedy jen pošlou do Notion a smyčka pokračuje s dalším záznamem.

foreach ($results as $result){
  $page = $notion->pages()->retrieve($result->getId());
  $properties = $page->getProperties();
  $url = $properties['URL']->getUrl();
  echo 'Kontrola '.$url. "\n";
  $target = $properties['Cíl']->getUrl();
  $check = backlinkCheck( $target, $url);
  $properties['V pořádku']->setCheckbox($check);
  $page->setProperties([
    'V pořádku' => $properties['V pořádku'],
    'Poslední kontrola' => ['date' => ['start' => date('c'), 'end' => date('c')] ]
  ]);
  $pageUpdated = $notion->pages()->update($page);
}

Kontrola výskytu odkazu na stránce pomocí PHP

Zbývá ještě popsat proces kontroly stránek, zda se na nich vyskytují požadované odkazy. A zda tyto odkazy zároveň nemají atribut rel="nofollow". Jako každý programátor rád recykluji práci jiného, v tomto případě mi posloužil skript, jehož autorem je Adrian N.

V jeho řešení jsem načtení stránky pomocí cURL nahradil PHP funkcí file_get_contents(). Z nějakého důvodu mi původní řešení nechtělo některé stránky načítat. Kontrolu s využitím třídy DOMDocument jsem ponechal. Výstup z funkce jsem jen doplnil o true nebo false podle výsledku kontroly. Údaj potřebuji předat do Notion.

function backlinkCheck($backlink, $url) {

  $backlinkexists = false;
  $backlinknofollow = false;
 
  $content = file_get_contents($url);

  $dom = new DomDocument();
  libxml_use_internal_errors(true);
  $dom -> loadHTML($content);
  $anchors = $dom -> getElementsByTagName('a');
  libxml_clear_errors();

  foreach ($anchors as $anchor) {
    $link = $anchor -> getAttribute("href");

    //check if the link exists among links on the $url
    if ($link == $backlink) {
      $backlinkexists = true;

      $anchorhtml = strtolower($anchor -> C14N());

      if (strpos($anchorhtml, 'nofollow') !== false) {
        $backlinknofollow = true;
      }

      break;
    }
  }

  if ($backlinkexists && !$backlinknofollow) {
    // backlink exists and it doesn't has a rel attribute with nofollow value
    return TRUE;
  } else if ($backlinkexists && $backlinknofollow) {
    // backlink exists and it does has a rel attribute with nofollow value
    return NULL;
  } else {
    // backlink doesn't exists
    return FALSE;
  }

}

Periodické spouštění kontroly

Skript jsem vyzkoušel na počítači prostým spuštěním příkazem php index.php. Na první dobrou jsem jej samozřejmě nedal, ale jakmile bylo hotovo, putoval do virtuální mašiny. Zde je spouštěn pomocí cronu jednou denně. Sloupeček s checboxem mi v Notion dává informaci, které odkazy jsou nebo nejsou v pořádku. Ve sloupci s datem zároveň vidím, že kontrola probíhá. Pokud tam najdu staré datum, budu pátrat po příčině, co se kde pokazilo.

Kompletní skript jsem umístil s přeloženými názvy sloupečků v Notion do angličtiny na svůj GitHub Gist.

Pokud vás toto řešení zaujme, budu rád, když zmíníte, jaké vychytávky v Notion používáte vy a co vám tam případně nevyhovuje. Stále hledáme s kolegy inspiraci.

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Marketing Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
Nové diskuze
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru