summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_log/.gitignore1
-rw-r--r--_stats/.gitignore1
-rw-r--r--http/.gitattributes1
-rw-r--r--http/.htaccess2
l---------http/_stats1
-rw-r--r--http/index.php108
-rw-r--r--http/templates/.htaccess1
-rw-r--r--http/templates/atom.tpl21
-rw-r--r--http/templates/rss.tpl19
9 files changed, 155 insertions, 0 deletions
diff --git a/_log/.gitignore b/_log/.gitignore
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/_log/.gitignore
@@ -0,0 +1 @@
+*
diff --git a/_stats/.gitignore b/_stats/.gitignore
new file mode 100644
index 0000000..72e8ffc
--- /dev/null
+++ b/_stats/.gitignore
@@ -0,0 +1 @@
+*
diff --git a/http/.gitattributes b/http/.gitattributes
new file mode 100644
index 0000000..7daec9b
--- /dev/null
+++ b/http/.gitattributes
@@ -0,0 +1 @@
+config.json filter=git-crypt diff=git-crypt
diff --git a/http/.htaccess b/http/.htaccess
new file mode 100644
index 0000000..9f57019
--- /dev/null
+++ b/http/.htaccess
@@ -0,0 +1,2 @@
+RewriteEngine On
+RewriteRule (.*)/(.*).xml index.php?user=$1&format=$2
diff --git a/http/_stats b/http/_stats
new file mode 120000
index 0000000..20da1a2
--- /dev/null
+++ b/http/_stats
@@ -0,0 +1 @@
+../_stats/ \ No newline at end of file
diff --git a/http/index.php b/http/index.php
new file mode 100644
index 0000000..cf2f636
--- /dev/null
+++ b/http/index.php
@@ -0,0 +1,108 @@
+<?php
+
+$config = json_decode(file_get_contents('config.json'), TRUE);
+
+require_once('codebird-php/src/codebird.php');
+
+\Codebird\Codebird::setConsumerKey($config['key'], $config['secret']);
+\Codebird\Codebird::setBearerToken($config['token']);
+
+$cb = \Codebird\Codebird::getInstance();
+
+$user = $_GET['user'];
+$spamFilter = FALSE;
+
+$filterMatch = [];
+if (preg_match('/^(.*)\/spamfilter$/', $user, $filterMatch)) {
+ $user = $filterMatch[1];
+ $spamFilter = TRUE;
+}
+
+if ($user) {
+
+ $cacheFile = 'cache/'.$user.'.json';
+ $cacheTime = file_exists($cacheFile) ? filemtime($cacheFile) : 0;
+
+ $content = '';
+ if ($cacheTime > strtotime('-15 minutes')) {
+ $content = json_decode(file_get_contents($cacheFile));
+ }
+ else {
+ $content = $cb->statuses_userTimeline([
+ 'screen_name' => $user,
+ 'count' => 200,
+ 'exclude_replies' => TRUE
+ ], TRUE);
+ if (isset($content->rate)) {
+ unset($content->rate);
+ }
+ file_put_contents($cacheFile, json_encode($content));
+ $cacheTime = time();
+ }
+
+ if ($content->httpstatus !== 200) {
+ header('HTTP/1.1 '.$content->httpstatus);
+ if (isset($content->error)) {
+ print $content->error;
+ die();
+ }
+ if (isset($content->errors)) {
+ foreach ($content->errors as $error) {
+ print $error->message.' ('.$error->code.')<br />';
+ }
+ die();
+ }
+ }
+
+ unset($content->httpstatus);
+
+ if ($spamFilter) {
+ $filteredContent = [];
+ foreach ($content as $c) {
+ $urls = array_map(
+ function($url) {
+ return $url->expanded_url;
+ },
+ $c->entities->urls
+ );
+ if (!$urls) {
+ $filteredContent[] = $c;
+ } else {
+ sort($urls);
+ $urlHash = md5(implode('|', $urls));
+ $filteredContent[$urlHash] = $c;
+ }
+ }
+ usort($filteredContent, function($c1, $c2) { return strcmp($c1->id_str, $c2->id_str); });
+ array_reverse($filteredContent);
+ $content = $filteredContent;
+ }
+
+ require_once('smarty3/Smarty.class.php');
+
+ $smarty = new Smarty();
+ $smarty->setCacheDir('cache/smarty');
+ $smarty->setCompileDir('cache/smarty/compile');
+ $smarty->setTemplateDir('templates');
+
+ $smarty->assign('cacheTime', $cacheTime);
+ $smarty->assign('user', $user);
+ $smarty->assign('content', $content);
+
+ $format = $_GET['format'];
+
+ switch ($format) {
+ case 'rss':
+ header('Content-Type: application/rss+xml');
+ $smarty->display('rss.tpl');
+ break;
+ case 'atom':
+ default:
+ header('Content-Type: application/atom+xml');
+ $smarty->display('atom.tpl');
+ break;
+ }
+
+}
+
+?>
diff --git a/http/templates/.htaccess b/http/templates/.htaccess
new file mode 100644
index 0000000..3a42882
--- /dev/null
+++ b/http/templates/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/http/templates/atom.tpl b/http/templates/atom.tpl
new file mode 100644
index 0000000..e7e28f5
--- /dev/null
+++ b/http/templates/atom.tpl
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>{$user}'s timeline</title>
+ <link href="https://twitter.com/{$user}" />
+ <id>http://emkael.info/tulz/twitterRSS/{$user}</id>
+ <updated>{$cacheTime|date_format:"c"}</updated>
+ {foreach from=$content item=item}
+ <entry>
+ <title>{$item->text|escape}</title>
+ <link href="https://twitter.com/{$user}/status/{$item->id_str}" />
+ <id>http://emkael.info/tulz/twitterRSS/{$item->user->id_str}/{$item->id_str}</id>
+ <updated>{$item->created_at|date_format:"c"}</updated>
+ <summary><![CDATA[ {$item->text|escape} ]]></summary>
+ {if isset($item->user)}
+ <author>
+ <name>{$item->user->screen_name}</name>
+ </author>
+ {/if}
+ </entry>
+ {/foreach}
+</feed>
diff --git a/http/templates/rss.tpl b/http/templates/rss.tpl
new file mode 100644
index 0000000..f95a462
--- /dev/null
+++ b/http/templates/rss.tpl
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0">
+ <channel>
+ <title>{$user}'s timeline</title>
+ <link>https://twitter.com/{$user}</link>
+ <lastBuildDate>{$cacheTime|date_format:"D, d M Y H:i:s O"}</lastBuildDate>
+ {foreach from=$content item=item}
+ <item>
+ <title>{$item->text|escape}</title>
+ <link>https://twitter.com/{$user}/status/{$item->id_str}</link>
+ {if isset($item->user)}
+ <guid>http://emkael.info/tulz/twitterRSS/{$item->user->id_str}/{$item->id_str}</guid>
+ {/if}
+ <description><![CDATA[ {$item->text|escape} ]]></description>
+ <pubDate>{$item->created_at|date_format:"D, d M Y H:i:s O"}</pubDate>
+ </item>
+ {/foreach}
+ </channel>
+</rss>