Skip to content

Instantly share code, notes, and snippets.

@Kudusch
Last active December 12, 2015 02:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kudusch/4702184 to your computer and use it in GitHub Desktop.
Save Kudusch/4702184 to your computer and use it in GitHub Desktop.
<?php
//execution time
$startTime = microtime('get_as_float');
// set date and time
date_default_timezone_set("Europe/Berlin");
$day = date('d');
$month = date('m');
$dayName = date('jS');
$monthName = date('F');
$currentYear = intval(date('Y'));
file_put_contents('index.html', '<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css" type="text/css">
<title>Twitter memories of '.$monthName.' '.$dayName.'</title>
</head>
<body>
<div class="main">
<h1><a class="head" href="">Twitter memories of <br>'.$monthName.' '.$dayName.'</a></h1>');
for ($i = 1; $i <= 3; $i++) {
$offSet = $i;
$year = $currentYear - $offSet;
if ($i == 1) {
$h2 = $i." year ago…";
} else {
$h2 = $i." years ago…";
}
$apiCall = "http://yourdomain.tld/path/to/tweetnest/{$year}/{$month}/{$day}";
file_put_contents('index.html', '<div class="tweets" id="tweets_'.$i.'"><div class="title">'.$h2.'</div>'.getTweets($apiCall)."</div><hr>",FILE_APPEND);
}
file_put_contents('index.html', '<div id="footer">Made with php, css and love by <a href="http://kudusch.de/">Kudusch</a></div></div></body></html>',FILE_APPEND);
//premailer
$url = "http://yourdomain.tld/path/to/this/scriptfolder/index.html";
$pre = Premailer::url($url);
$html = $pre['html'];
// Set up parameters for mail
$to = "mail@yourdomain.tld";
$subject = "Twitter memories of {$monthName} {$dayName}";
$message = $html;
$from = "mail@yourdomain.tld";
$headers = "MIME-Version: 1.0" . "\n";
$headers .= "Content-Type: text/html; charset=UTF-8" . "\n";
$headers .= "From: $from" . "\n";
// Send email
mail($to,$subject,$message,$headers);
echo("Done.<br>Run in ".(microtime('get_as_float')-$startTime));
// convert external css to inline style using premailer
/**
* Premailer API PHP class
* Premailer is a library/service for making HTML more palatable for various inept email clients, in particular GMail
* Primary function is to convert style tags into equivalent inline styles so styling can survive <head> tag removal
* Premailer is owned by Dialect Communications group
* @link http://premailer.dialect.ca/api
* @author Marcus Bointon <marcus@synchromedia.co.uk>
*/
class Premailer {
/**
* The Premailer API URL
*/
const ENDPOINT = 'http://premailer.dialect.ca/api/0.1/documents';
static $CI ;
public function __construct()
{
self::$CI =& get_instance();
self::$CI->load->library('my_curl');
}
/**
* Central static method for submitting either an HTML string or a URL, optionally retrieving converted versions
* @static
* @throws Exception
* @param string $html Raw HTML source
* @param string $url URL of the source file
* @param bool $fetchresult Whether to also fetch the converted output
* @param string $adaptor Which document handler to use (hpricot (default) or nokigiri)
* @param string $base_url Base URL for converting relative links
* @param int $line_length Length of lines in the plain text version (default 65)
* @param string $link_query_string Query string appended to links
* @param bool $preserve_styles Whether to preserve any link rel=stylesheet and style elements
* @param bool $remove_ids Remove IDs from the HTML document?
* @param bool $remove_classes Remove classes from the HTML document?
* @param bool $remove_comments Remove comments from the HTML document?
* @return array Either a single strclass object containing the decoded JSON response, or a 3-element array containing result, html and plain parts if $fetchresult is set
*/
protected static function convert($html = '', $url = '', $fetchresult = true, $adaptor = 'hpricot', $base_url = '', $line_length = 65, $link_query_string = '', $preserve_styles = true, $remove_ids = false, $remove_classes = false, $remove_comments = false) {
$params = array();
if (!empty($html)) {
$params['html'] = $html;
} elseif (!empty($url)) {
$params['url'] = $url;
} else {
throw new Exception('Must supply an html or url value');
}
if ($adaptor == 'hpricot' or $adaptor == 'nokigiri') {
$params['adaptor'] = $adaptor;
}
if (!empty($base_url)) {
$params['base_url'] = $base_url;
}
$params['line_length'] = (integer)$line_length;
if (!empty($link_query_string)) {
$params['link_query_string'] = $link_query_string;
}
$params['preserve_styles'] = ($preserve_styles? 'true':'false');
$params['remove_ids'] = ($remove_ids? 'true':'false');
$params['$remove_classes'] = ($remove_classes? 'true':'false');
$params['$remove_comments'] = ($remove_comments? 'true':'false');
$options = array(
'timeout' => 15,
'connecttimeout' => 15,
'useragent' => 'PHP Premailer',
'ssl' => array('verifypeer' => false, 'verifyhost' => false)
);
// $h = new HttpRequest(self::ENDPOINT, HttpRequest::METH_POST, $options);
$conf = array(
'url' => self::ENDPOINT,
'timeout' => 15,
'useragent' => 'PHP Premailer',
'ssl_verifyhost' => 0,
'SSL_VERIFYPEER' => 0,
'post' => 1,
'postfields' => $params,
'returntransfer' => true,
'httpheader' => array("Expect:")
);
foreach($conf as $key => $value){
$name = constant('CURLOPT_'.strtoupper($key));
$val = $value;
$data_conf[$name] = $val;
}
$cu = curl_init();
curl_setopt_array($cu, $data_conf);
$exec = curl_exec($cu);
$_res = json_decode($exec);
$_res_info = json_decode(json_encode(curl_getinfo($cu)));
curl_close($cu);
if($_res_info->http_code != 201){
$code = $_res_info->http_code;
switch ($code) {
case 400:
throw new Exception('Content missing', 400);
break;
case 403:
throw new Exception('Access forbidden', 403);
break;
case 500:
default:
throw new Exception('Error', $code);
}
}
$return = array('result' => $_res);
if ($fetchresult) {
$html = curl_init();
curl_setopt_array(
$html, array(
CURLOPT_URL => $_res->documents->html,
CURLOPT_TIMEOUT => 15,
CURLOPT_USERAGENT => 'PHP Premailer',
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_HTTPHEADER => array("Expect:"),
CURLOPT_RETURNTRANSFER => true
)
);
$return['html'] = curl_exec($html);
curl_close($html);
$plain = curl_init();
curl_setopt_array(
$plain, array(
CURLOPT_URL => $_res->documents->txt,
CURLOPT_TIMEOUT => 15,
CURLOPT_USERAGENT => 'PHP Premailer',
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_HTTPHEADER => array("Expect:"),
CURLOPT_RETURNTRANSFER => true
)
);
$return['plain'] = curl_exec($plain);
curl_close($plain);
return $return;
}
return $result;
}
/**
* Central static method for submitting either an HTML string or a URL, optionally retrieving converted versions
* @static
* @throws Exception
* @param string $html Raw HTML source
* @param bool $fetchresult Whether to also fetch the converted output
* @param string $adaptor Which document handler to use (hpricot (default) or nokigiri)
* @param string $base_url Base URL for converting relative links
* @param int $line_length Length of lines in the plain text version (default 65)
* @param string $link_query_string Query string appended to links
* @param bool $preserve_styles Whether to preserve any link rel=stylesheet and style elements
* @param bool $remove_ids Remove IDs from the HTML document?
* @param bool $remove_classes Remove classes from the HTML document?
* @param bool $remove_comments Remove comments from the HTML document?
* @return array Either a single element array containing the 'result' object, or three elements containing result, html and plain if $fetchresult is set
*/
public static function html($html, $fetchresult = true, $adaptor = 'hpricot', $base_url = '', $line_length = 65, $link_query_string = '', $preserve_styles = true, $remove_ids = false, $remove_classes = false, $remove_comments = false) {
return self::convert($html, '', $fetchresult, $adaptor, $base_url, $line_length, $link_query_string, $preserve_styles, $remove_ids, $remove_classes, $remove_comments);
}
/**
* Central static method for submitting either an HTML string or a URL, optionally retrieving converted versions
* @static
* @throws Exception
* @param string $url URL of the source file
* @param bool $fetchresult Whether to also fetch the converted output
* @param string $adaptor Which document handler to use (hpricot (default) or nokigiri)
* @param string $base_url Base URL for converting relative links
* @param int $line_length Length of lines in the plain text version (default 65)
* @param string $link_query_string Query string appended to links
* @param bool $preserve_styles Whether to preserve any link rel=stylesheet and style elements
* @param bool $remove_ids Remove IDs from the HTML document?
* @param bool $remove_classes Remove classes from the HTML document?
* @param bool $remove_comments Remove comments from the HTML document?
* @return array Either a single element array containing the 'result' object, or three elements containing result, html and plain if $fetchresult is set
*/
public static function url($url, $fetchresult = true, $adaptor = 'hpricot', $base_url = '', $line_length = 65, $link_query_string = '', $preserve_styles = true, $remove_ids = false, $remove_classes = false, $remove_comments = false) {
return self::convert('', $url, $fetchresult, $adaptor, $base_url, $line_length, $link_query_string, $preserve_styles, $remove_ids, $remove_classes, $remove_comments);
}
}
function getTweets($apiCall) {
// Get html via curl
$ch = curl_init($apiCall);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
$dom = new DomDocument();
$dom->loadHtml($html);
$tweets = getElementsByClassname($dom, "tweet");
$length = $tweets->length;
$result = "";
foreach ($tweets as $tweet) {
$result .= '<div class="tweet">'.get_inner_html($tweet).'</div><br>';
}
if ($result == "") {
return '<p class="empty">No tweets here!</p>';
} else {
return $result;
}
}
function getElementsByClassname( DOMDocument $doc, $classname )
{
$xpath = new DOMXPath( $doc );
// XPath 1.0
$nodes = $xpath->query( "//*[contains( normalize-space( @class ), ' $classname ' ) or substring( normalize-space( @class ), 1, string-length( '$classname' ) + 1 ) = '$classname ' or substring( normalize-space( @class ), string-length( @class ) - string-length( '$classname' ) ) = ' $classname' or @class = '$classname']" );
return $nodes;
}
function printNodeList( DOMNodeList $nodeList )
{
foreach( $nodeList as $node )
{
echo '<', $node->tagName, '> ', $node->nodeValue, ' <', $node->tagName, '> ', "\n";
}
}
function get_inner_html( $node ) {
$innerHTML= '';
$children = $node->childNodes;
foreach ($children as $child) {
$innerHTML .= $child->ownerDocument->saveXML( $child );
}
return $innerHTML;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment