Vlastní Twitter export

Školení, která pořádám

V některých věcech jsem velmi konzervativní – třeba zprávy čtu od nejstarších a nechci ani zahlédnout něco, co už jsem četl. Možná proto mi moc nevyhovuje zeď Facebooku, protože tam se zprávy zobrazují od nejnovějších a přečtené se nijak neoznačují, takže u každé musím přemýšlet nad tím, jestli už jsem ji náhodou nečetl.

Twitter to má stejně, ale alespoň nabízí RSS, takže si ho můžu zařadit do normální čtečky a číst ho podle svých zvyklostí. Zjistit adresu RSS ale není zrovna jednoduché, navíc to je otravná práce (u uživatele nestačí dát Follow, ale je potřeba hledat jeho ID). Neveřejné uživatele (např. Vaška Stoupu) takhle číst nejde vůbec.

Pro Twitter existuje spousta čteček, ale mně nejvíc vyhovuje běžné RSS – všechno mám pohromadě a odkudkoliv. V exportu jsem navíc chtěl mít i odpovědi a u sledovaných uživatelů jsem chtěl vidět všechny příspěvky – tedy i odpovědi uživatelům, které nesleduji – to většina čteček neumí. Rozhodl jsem se proto vytvořit vlastní konvertor Twitteru na RSS, což mi otevřelo široké možnosti:

  1. Syndikují se sledovaní uživatelé, zmínky o mně i výsledky vyhledávání.
  2. U retvítů se zobrazuje informace o původním autorovi i kompletní obsah (celkem to tedy může být víc než 140 znaků).
  3. U odpovědí se zobrazují i příspěvky, na které reagují.
  4. V příspěvcích se z aktivního obsahu (zmínky o uživatelích, URL) vytváří odkazy.
  5. Expandují se zkrácené URL – výchozí t.co a dále jdem.cz a goo.gl.
  6. U cizojazyčných výsledků vyhledávání se zobrazuje i jejich překlad do angličtiny.

Twitter API

Jádro konvertoru je velmi jednoduché, např. získání zmínek o mně vypadá takhle:

<?php
$statuses = $twitter->cachedRequest("statuses/mentions.xml", array('include_entities' => 1));
?>

API Twitteru se používá velmi dobře, díky knihovně pro PHP od galantního dobrodince je to hračka.

Zkrácené odkazy

Na zkrácených odkazech mě rozčiluje, že nevím, kam vedou. Když bych to věděl, tak bych je kolikrát ani nenavštívil. Rozhodl jsem se je tedy expandovat už v RSS. Např. pro goo.gl takhle:

<?php
/** Získání zkráceného URL ze služby goo.gl
* @param string zkrácené URL
* @return string původní URL, zkrácené v případě chyby
* @uses CACHE_DIR
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
function googl($url) {
    $cache = CACHE_DIR . "/googl." . md5($url);
    if (!file_exists($cache) && !copy("https://www.googleapis.com/urlshortener/v1/url?shortUrl=" . urlencode($url), $cache)) {
        return $url;
    }
    $json = json_decode(file_get_contents($cache));
    return ($json->status == "OK" ? $json->longUrl : $url);
}
?>

Zkrácené odkazy by se daly vyřešit univerzálně – prostě je z PHP zkusit navštívit a podívat se na obsah hlavičky Location. To by ale návštěvu započítalo do statistik, takže jsem raději u každé služby využil její API.

Překlady

Sleduji výsledky vyhledávání svých projektů, o kterých vzniká řada příspěvků v cizích jazycích. Chci proto vidět jejich alespoň přibližný překlad.

Pro překlady se používá Google Translate. Jeho API bude 1.12.2011 ukončeno, pak se s touto funkcí buď rozloučím nebo najdu alternativu.

<?php
/** Přeložení textu pomocí Google Translate
* @param string
* @return string překlad do angličtiny nebo null v případě chyby nebo originálu v en|cs|sk
* @uses CACHE_DIR
* @uses GOOGLE_KEY
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
function translate($string) {
    $cache = CACHE_DIR . "/translate." . md5($string);
    if (!file_exists($cache) && !copy("https://www.googleapis.com/language/translate/v2?key=" . urlencode(GOOGLE_KEY) . "&target=en&q=" . urlencode($string), $cache)) {
        return null;
    }
    $translations = json_decode(file_get_contents($cache))->data->translations[0];
    if (!in_array($translations->detectedSourceLanguage, array("en", "cs", "sk"))) {
        return $translations->translatedText;
    }
}
?>

Závěr

Přemýšlím, co teď s tím. Buď můžu Twitter export zveřejnit ve formě zdrojového kódu (předtím bych to ale musel trochu učesat, aby teoretici neměli řeči) nebo to můžu vystavit jako službu (to bych ale musel dodělat autorizaci libovolného uživatele). Nebo to pro nikoho jiného užitečné není a můžu si to nechat pro sebe.

Jakub Vrána, Řešení problému, 27.6.2011, diskuse: 14 (nové: 0)

Diskuse

stekycz:

Takhle to z toho popisu vypadá dobře. Za sebe bych asi více uvítal službu, kterou bych mohl používat. Na druhou stranu, mít kódy, mohl bych si to nahodit kamkoli a případně si napsat nějaký rozšíření funkcionality/upravit něco sob+ na míru a případně se podělit zpětně. Především by mi ale šlo o používání k pohodlnějšímu čtení zpráv.

ikona Vašek Purchart:

Jojo, narazil jsem na podobné problémy a proto jsem si cca před rokem napsal vlastního jednoduchého webového klienta. Filosofie právě byla, aby se to podobalo čtení RSS (pořadí, přečtené/nepřečtené). Od myšlenky udělat to jen jako RSS export mě odradilo to, že používám Google Reader a ten neumožňuje nastavit nějak přesně frekvenci čtení feedu, což by pak vedlo k tomu, že by se mi spousta zpráv vůbec nezobrazila.

ikona Jakub Vrána OpenID:

Google Reader používám taky – frekvenci stahování si podle mě určuje podle toho, jak často se obsah mění (a asi i podle toho, kolik lidí to čte). Když nutně potřebuji prokrastinovat a ve čtečce nic není, tak používám tlačítko Obnovit.

Zprávy mi podle mě neunikají.

Jan:

Jen do té doby, než odjedeš na měsíc do Peru :-( (po měsíci se automaticky příspěvky označí jako přečtené a není snadné se k nim dostat - jen přes hledání).

Ján Bočínec:

Vyzerá to sľubne a niečo takéto by sa mi zišlo. Osobne by som uvítal keby sa to objavilo niekde na GitHube na forknutie :).

ikona v6ak:

Používám na čtení Twitteru Google Reader a subscribuju relativně jednoduše:
1. Upravím adresu do klasického tvaru, např.: http://twitter.com/v6ak (U desktopové AJAXové verze vlastně jen odstraním 'hashbang', u mobilní verze upravím doménu)
2. Tuto adresu subscribnu, GReader si najde adresu feedu asi z linku v headu a subscribne mi tento feed.

Ale uznávám, že někdy by se hodilo přidat i informace, jako třeba tweet, na který je odpovídáno, apod. I já bych to tedy uvítal.

ikona tiso:

Tak to vyzerá že oprášim rozrobeného twitter klienta, už len ho musím nájsť... Tiež som začal s Davidovou knižnicou, ale najväčšiu prioritu mali funkcie na dočasné/trvalé blokovanie userov/hastagov/kľúčových slov. Neuvažoval si nad niečim takým? Že by si to spravil a ja som už nemusel?

ikona Jakub Vrána OpenID:

Ne, blokování nepotřebuji.

Jakub Tesárek:

Námět jistě zajímavej. Musím to hned vyzkoušet. Nimcéně mám drobnou výtku. Sám píšeš, že některé nástroje je těžké používat. Například narážím na tvůj komentář o facebooku ohledně označování postů. Nicméně když se podíváš na svůj RSS feed, tak v něm nemáš uvedené datum zveřejnění, nicméně v Atomu ho máš, tak proč ho nedáš i do RSS?

Používám vlastní čtečku integrovanou do mého systému na správu úkolů a není zrovna jednoduché s tvým feedem pracovat. Jakákoli práce s časem je v případě tých příspěvků nemožná.

Není to tak trochu o tom, zamést nejdříve před vlastním prahem?

ikona Jakub Vrána OpenID:

Nejspíš myslíš RSS feed http://php.vrana.cz/rss.php – ten je vytvořen přesně podle specifikace RSS 0.91, která zveřejňování data publikace neumožňovala. Vývoj RSS se později roztříštil, což byl jeden z hlavních důvodů pro vznik formátu Atom. Svou čtečku nauč tento formát používat.

S těmi řečmi o zametání před vlastním prahem opatrně – alespoň si nejdřív zjisti všechna fakta.

Jakub Tesárek:

tak mi došlo, že i námitky na facebook jsou zametání před vlastním prahem...

PHX:

Tak co Jakube. Zverejnis/nezverejnis?

Viktor:

Tak jak s prekladem po 1.12.2011? Ukonceno nebo nalezena alternativa? Jaka?

ikona Jakub Vrána OpenID:

Našel jsem http://www.codediesel.com/php/microsoft-bing…-php-wrapper/, ale ještě jsem to nezkoušel.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.