Shift
10 years ago
16 changed files with 821 additions and 0 deletions
@ -0,0 +1,44 @@ |
|||||||
|
-- phpMyAdmin SQL Dump |
||||||
|
-- version 4.0.6 |
||||||
|
-- http://www.phpmyadmin.net |
||||||
|
-- |
||||||
|
-- Хост: localhost |
||||||
|
-- Время создания: Авг 07 2014 г., 04:43 |
||||||
|
-- Версия сервера: 5.5.38-0ubuntu0.14.04.1 |
||||||
|
-- Версия PHP: 5.5.9-1ubuntu4.3 |
||||||
|
|
||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; |
||||||
|
SET time_zone = "+00:00"; |
||||||
|
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; |
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; |
||||||
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; |
||||||
|
/*!40101 SET NAMES utf8 */; |
||||||
|
|
||||||
|
-- |
||||||
|
-- База данных: `twistercms` |
||||||
|
-- |
||||||
|
CREATE DATABASE IF NOT EXISTS `twistercms` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; |
||||||
|
USE `twistercms`; |
||||||
|
|
||||||
|
-- -------------------------------------------------------- |
||||||
|
|
||||||
|
-- |
||||||
|
-- Структура таблицы `rss` |
||||||
|
-- |
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `rss` ( |
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT, |
||||||
|
`name` text NOT NULL, |
||||||
|
`url` text NOT NULL, |
||||||
|
`active` tinyint(4) NOT NULL, |
||||||
|
`lastupdate` text NOT NULL, |
||||||
|
`updatetime` smallint(6) NOT NULL, |
||||||
|
`account` text NOT NULL, |
||||||
|
PRIMARY KEY (`id`) |
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ; |
||||||
|
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; |
||||||
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; |
||||||
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |
@ -0,0 +1,20 @@ |
|||||||
|
The MIT License (MIT) |
||||||
|
|
||||||
|
Copyright (c) 2014 Denis Ryabov |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of |
||||||
|
this software and associated documentation files (the "Software"), to deal in |
||||||
|
the Software without restriction, including without limitation the rights to |
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so, |
||||||
|
subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
|
copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,12 @@ |
|||||||
|
twister-phpbot |
||||||
|
============== |
||||||
|
|
||||||
|
Simple Twister bot written in PHP. It is used to post messages for twister's @habr_ru account. |
||||||
|
|
||||||
|
## Requirements |
||||||
|
|
||||||
|
- PHP 5.3+ |
||||||
|
- `mbstring` extension |
||||||
|
- `allow_url_fopen` enabled |
||||||
|
- `exec` allowed |
||||||
|
|
@ -0,0 +1,61 @@ |
|||||||
|
<?php |
||||||
|
session_start(); |
||||||
|
require('settings.php'); |
||||||
|
if ($_SESSION['login'] ==='true') { |
||||||
|
//header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
}else { |
||||||
|
header('Location: http://'.$domain.'/cms/index.php'); |
||||||
|
die (); |
||||||
|
} |
||||||
|
echo '<!DOCTYPE html> |
||||||
|
<html lang="ru"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||||
|
<meta name="description" content=""> |
||||||
|
<meta name="author" content=""> |
||||||
|
<link rel="icon" href="../../favicon.ico"> |
||||||
|
|
||||||
|
<title>Twister-RSS</title> |
||||||
|
|
||||||
|
<!-- Bootstrap core CSS --> |
||||||
|
<link href="bootstrap.min.css" rel="stylesheet"> |
||||||
|
|
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
|
||||||
|
<div class="container"> |
||||||
|
<div class="header"> |
||||||
|
<ul class="nav nav-pills pull-right"> |
||||||
|
<li ><a href="admin.php">Admin</a></li> |
||||||
|
<li class="active"><a class="active"href="#">About</a></li> |
||||||
|
|
||||||
|
</ul> |
||||||
|
<h3 class="text-muted">Twister-RSS</h3> |
||||||
|
</div>'; |
||||||
|
|
||||||
|
|
||||||
|
echo '<hr><div class=""> |
||||||
|
<h1>About</h1> |
||||||
|
<h2>Twister-RSS v 0.1</h2> |
||||||
|
<h3>Авторы данного софта: @denis, @shift</h3> |
||||||
|
|
||||||
|
'; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo ' <div class="footer"> |
||||||
|
<p>© Company 2014</p> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> <!-- /container --> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body> |
||||||
|
</html>'; |
||||||
|
|
||||||
|
|
@ -0,0 +1,102 @@ |
|||||||
|
<?php |
||||||
|
session_start(); |
||||||
|
echo '<!DOCTYPE html> |
||||||
|
<html lang="ru"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||||
|
<meta name="description" content=""> |
||||||
|
<meta name="author" content=""> |
||||||
|
<link rel="icon" href="../../favicon.ico"> |
||||||
|
|
||||||
|
<title>Twister-RSS</title> |
||||||
|
|
||||||
|
<!-- Bootstrap core CSS --> |
||||||
|
<link href="bootstrap.min.css" rel="stylesheet"> |
||||||
|
|
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
|
||||||
|
<div class="container"> |
||||||
|
<div class="header"> |
||||||
|
<ul class="nav nav-pills pull-right"> |
||||||
|
<li class="active"><a href="#">Admin</a></li> |
||||||
|
<li><a href="about.php">About</a></li> |
||||||
|
</ul> |
||||||
|
<h3 class="text-muted">Twister-RSS</h3> |
||||||
|
</div>'; |
||||||
|
|
||||||
|
|
||||||
|
echo '<hr><div class=""> |
||||||
|
<h1>Ваши RSS подписки</h1> |
||||||
|
|
||||||
|
|
||||||
|
'; |
||||||
|
require('settings.php'); |
||||||
|
$sql="SELECT * |
||||||
|
FROM `rss`"; |
||||||
|
|
||||||
|
echo '<table class="table">'; |
||||||
|
echo '<tr><td>Название RSS</td><td>URL</td><td>Включено</td><td>Последнее обновление</td><td>Частота обновления</td><td>Публиковать от имени</td><td></td><td></td><td></td></tr>'; |
||||||
|
$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
while ($row = mysql_fetch_array($result)) { |
||||||
|
if ($row['active'] == '1') { |
||||||
|
$trclass="success"; |
||||||
|
$activeTXT='Да'; |
||||||
|
$activeTXT2='Отключить'; |
||||||
|
$activeTXT3=0; |
||||||
|
$activeTXTClass='btn btn-warning'; |
||||||
|
} else { |
||||||
|
$trclass="warning"; |
||||||
|
$activeTXT='Нет'; |
||||||
|
$activeTXT2='Включить'; |
||||||
|
$activeTXT3=1; |
||||||
|
$activeTXTClass='btn btn-success'; |
||||||
|
} |
||||||
|
echo '<tr class="'.$trclass.'">'; |
||||||
|
echo '<td>'.$row['name'].'</td>'; |
||||||
|
echo '<td>'.$row['url'].'</td>'; |
||||||
|
echo '<td>'.$activeTXT.'</td>'; |
||||||
|
echo '<td>'.$row['lastupdate'].'</td>'; |
||||||
|
echo '<td>'.$row['updatetime'].'</td>'; |
||||||
|
echo '<td>'.$row['account'].'</td>'; |
||||||
|
echo '<td><a class="'.$activeTXTClass.'" href="edit.php?action=active&id='.$row['id'].'&active='.$activeTXT3.'">'.$activeTXT2.'</a></td>'; |
||||||
|
//echo '<td><a class="btn btn-primary" href="edit.php?action=edit&id='.$row['id'].'">Изменить</a></td>'; |
||||||
|
echo '<td><a class="btn btn-danger" href="edit.php?action=del&id='.$row['id'].'">Удалить</a></td>'; |
||||||
|
echo '</tr>'; |
||||||
|
unset($trclass); |
||||||
|
} |
||||||
|
echo '</table></div>'; |
||||||
|
echo '<script> |
||||||
|
function hideshow (){ |
||||||
|
document.getElementById("hide2").style.display="none" |
||||||
|
document.getElementById("hide").style.display="block" |
||||||
|
} |
||||||
|
</script>'; |
||||||
|
echo '<hr> |
||||||
|
<div class="well"> |
||||||
|
<div align="center" id="hide2"><a class="btn btn-lg btn-primary" onclick="hideshow();">Добавить RSS поток</a></div> |
||||||
|
<div id="hide" style="display:none"><form class="navbar-form" action="edit.php" method="post"><div class="form-group">'; |
||||||
|
echo 'Название RSS: <input class="form-control" name="name" type="text" size="20"> |
||||||
|
URL: <input class="form-control" name="url" type="text" size="20"> |
||||||
|
Публиковать от имени: <input class="form-control" name="account" type="text" size="20"> |
||||||
|
<!--(Не реализовано) Частота обновления: <input name="updatetime" type="text" size="20">--> |
||||||
|
Включен ? <input class="form-control" name="active" type="checkbox" size="20"> '; |
||||||
|
echo '<input style="margin-left:20px" class="btn btn-default" type="submit" value="Добавить"></div></div></form></div>'; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
echo ' <div class="footer"> |
||||||
|
<p>© Company 2014</p> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> <!-- /container --> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body> |
||||||
|
</html>'; |
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,56 @@ |
|||||||
|
<?php |
||||||
|
session_start(); |
||||||
|
require('settings.php'); |
||||||
|
if ($_SESSION['login'] ==='true') { |
||||||
|
header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
}else { |
||||||
|
header('Location: http://'.$domain.'/cms/index.php'); |
||||||
|
die (); |
||||||
|
} |
||||||
|
|
||||||
|
$active = $_POST['active']; |
||||||
|
if (empty($active)) { |
||||||
|
$active = $_GET['active']; |
||||||
|
} |
||||||
|
echo $active; |
||||||
|
if ($active === "on") $active = 1; |
||||||
|
echo $active; |
||||||
|
$account = $_POST['account']; |
||||||
|
|
||||||
|
$action = $_POST['action']; |
||||||
|
if (empty($action)) { |
||||||
|
$action = $_GET['action']; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
$id = $_POST['id']; |
||||||
|
if (empty($id)) { |
||||||
|
$id = $_GET['id']; |
||||||
|
} |
||||||
|
|
||||||
|
$name = $_POST['name']; |
||||||
|
$url = $_POST['url']; |
||||||
|
$updatetime = $_POST['updatetime']; |
||||||
|
|
||||||
|
if (!empty($url)) { |
||||||
|
if (empty($action)) { |
||||||
|
// add |
||||||
|
$sql = "INSERT INTO `rss` (`name`, `url`, `active`, `lastupdate`, `updatetime`, `account`) VALUES ('$name','$url','$active','$lastupdate','$updatetime', '$account')"; |
||||||
|
$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
} |
||||||
|
}elseif ($action == 'edit') { |
||||||
|
// edit |
||||||
|
//$sql="UPDATE `rss` SET `name`='$name',`url`='$url',`active`='$active',`updatetime`='$updatetime' WHERE `id`='$id'"; |
||||||
|
//$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
//header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
}elseif ($action == 'del') { |
||||||
|
// del |
||||||
|
$sql="DELETE FROM `rss` WHERE `id`='$id'"; |
||||||
|
$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
}elseif ($action == 'active') { |
||||||
|
$sql="UPDATE `rss` SET `active`='$active' WHERE `id`='$id'"; |
||||||
|
$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
<?php |
||||||
|
$rpcusername = $_POST['rpcusername']; |
||||||
|
$rpcpassword1 = $_POST['rpcpassword1']; |
||||||
|
session_start(); |
||||||
|
require('settings.php'); |
||||||
|
echo '<!DOCTYPE html> |
||||||
|
<html lang="ru"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||||
|
<meta name="description" content=""> |
||||||
|
<meta name="author" content=""> |
||||||
|
<link rel="icon" href="../../favicon.ico"> |
||||||
|
|
||||||
|
<title>Twister-RSS</title> |
||||||
|
|
||||||
|
<!-- Bootstrap core CSS --> |
||||||
|
<link href="bootstrap.min.css" rel="stylesheet"> |
||||||
|
|
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
|
||||||
|
<div class="container"> |
||||||
|
<div class="header"> |
||||||
|
<ul class="nav nav-pills pull-right"> |
||||||
|
<li class="active"><a href="#">Admin</a></li> |
||||||
|
<li><a href="about.php">About</a></li> |
||||||
|
</ul> |
||||||
|
<h3 class="text-muted">Twister-RSS</h3> |
||||||
|
</div>'; |
||||||
|
|
||||||
|
|
||||||
|
if ($_SESSION['login'] ==='true') { |
||||||
|
header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
}else { |
||||||
|
//header('Location: http://'.$domain.'/cms/index.php'); |
||||||
|
//die (); |
||||||
|
} |
||||||
|
if (empty($rpcusername)){ |
||||||
|
echo '<hr><div align="center" class="jumbotron"> |
||||||
|
<h1>Login</h1> |
||||||
|
<form class="navbar-form" action="index.php" method="post"><div class="form-group">'; |
||||||
|
echo 'RPC username: <input class="form-control" name="rpcusername" type="text" size="20"><br> |
||||||
|
RPC password: <input class="form-control" name="rpcpassword1" type="password" size="20"><br><br>'; |
||||||
|
echo '<input style="margin-left:20px" class="btn btn-primary" type="submit" value="Войти"></div></div></form> |
||||||
|
|
||||||
|
'; |
||||||
|
}else{ |
||||||
|
if ($rpcusername == $rpcuser && $rpcpassword1 == $rpcpassword) { |
||||||
|
$_SESSION['login']='true'; |
||||||
|
header('Location: http://'.$domain.'/cms/admin.php'); |
||||||
|
}else { |
||||||
|
//echo $rpcpassword .' / '.$rpcpassword1 . ' / '.$rpcuser.' / '.$rpcusername; |
||||||
|
die ('Bad username/password'); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
echo ' <div class="footer"> |
||||||
|
<p>© Company 2014</p> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> <!-- /container --> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body> |
||||||
|
</html>'; |
||||||
|
|
||||||
|
|
@ -0,0 +1,79 @@ |
|||||||
|
/* Space out content a bit */ |
||||||
|
body { |
||||||
|
padding-top: 20px; |
||||||
|
padding-bottom: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Everything but the jumbotron gets side spacing for mobile first views */ |
||||||
|
.header, |
||||||
|
.marketing, |
||||||
|
.footer { |
||||||
|
padding-right: 15px; |
||||||
|
padding-left: 15px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Custom page header */ |
||||||
|
.header { |
||||||
|
border-bottom: 1px solid #e5e5e5; |
||||||
|
} |
||||||
|
/* Make the masthead heading the same height as the navigation */ |
||||||
|
.header h3 { |
||||||
|
padding-bottom: 19px; |
||||||
|
margin-top: 0; |
||||||
|
margin-bottom: 0; |
||||||
|
line-height: 40px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Custom page footer */ |
||||||
|
.footer { |
||||||
|
padding-top: 19px; |
||||||
|
color: #777; |
||||||
|
border-top: 1px solid #e5e5e5; |
||||||
|
} |
||||||
|
|
||||||
|
/* Customize container */ |
||||||
|
@media (min-width: 768px) { |
||||||
|
.container { |
||||||
|
max-width: 730px; |
||||||
|
} |
||||||
|
} |
||||||
|
.container-narrow > hr { |
||||||
|
margin: 30px 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* Main marketing message and sign up button */ |
||||||
|
.jumbotron { |
||||||
|
text-align: center; |
||||||
|
border-bottom: 1px solid #e5e5e5; |
||||||
|
} |
||||||
|
.jumbotron .btn { |
||||||
|
padding: 14px 24px; |
||||||
|
font-size: 21px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Supporting marketing content */ |
||||||
|
.marketing { |
||||||
|
margin: 40px 0; |
||||||
|
} |
||||||
|
.marketing p + h4 { |
||||||
|
margin-top: 28px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Responsive: Portrait tablets and up */ |
||||||
|
@media screen and (min-width: 768px) { |
||||||
|
/* Remove the padding we set earlier */ |
||||||
|
.header, |
||||||
|
.marketing, |
||||||
|
.footer { |
||||||
|
padding-right: 0; |
||||||
|
padding-left: 0; |
||||||
|
} |
||||||
|
/* Space out the masthead */ |
||||||
|
.header { |
||||||
|
margin-bottom: 30px; |
||||||
|
} |
||||||
|
/* Remove the bottom border on the jumbotron for visual effect */ |
||||||
|
.jumbotron { |
||||||
|
border-bottom: 0; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
<?php |
||||||
|
require('settings.php'); |
||||||
|
$UID = $_GET['id']; |
||||||
|
$sql="SELECT * |
||||||
|
FROM `rss` |
||||||
|
WHERE `id`='$UID'"; |
||||||
|
$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
while ($row = mysql_fetch_array($result)) { |
||||||
|
$account=$row['account']; |
||||||
|
$url=$row['url']; |
||||||
|
} |
||||||
|
|
||||||
|
mb_internal_encoding('UTF-8'); |
||||||
|
setlocale(LC_CTYPE, 'en_US.UTF-8'); |
||||||
|
|
||||||
|
// Load RSS feed |
||||||
|
require_once 'rssreader.php'; |
||||||
|
$feed_uri = $url; |
||||||
|
$rss = getRssFeed($feed_uri); |
||||||
|
if (!$rss) die('Cannot read rss or it is up to date'); |
||||||
|
|
||||||
|
// Initialise TwisterPost |
||||||
|
require_once 'twisterpost.php'; |
||||||
|
$twister = new TwisterPost($account); |
||||||
|
|
||||||
|
// Initialise RSS database |
||||||
|
require_once 'rssdb.php'; |
||||||
|
$db = new RSSDb($account.'.dat'); |
||||||
|
|
||||||
|
foreach ($rss->channel->item as $item) { |
||||||
|
$link = (string)$item->link; |
||||||
|
$title = (string)$item->title; |
||||||
|
// Note: habrahabr.ru does both special chars encoding and CDATA wrap |
||||||
|
$title = htmlspecialchars_decode($title); |
||||||
|
|
||||||
|
// get post id from link |
||||||
|
$id = (int)preg_replace('#[^\d]#', '', $link); |
||||||
|
|
||||||
|
if ($db->isPublished($id)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
// shorten URL [-6 chars do matter] |
||||||
|
$link = str_replace('habrahabr.ru', 'habr.ru', $link); |
||||||
|
$link = rtrim($link, '/'); |
||||||
|
|
||||||
|
$msg = $twister->prettyPrint($title, $link, isset($item->category) ? $item->category : null); |
||||||
|
|
||||||
|
if ($twister->postMessage($msg)) { |
||||||
|
$db->setPublished($id); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
class RSSDb |
||||||
|
{ |
||||||
|
protected $hDatabase = null; |
||||||
|
protected $minId = 0; |
||||||
|
protected $bits = array(0=>1, 2, 4, 8, 16, 32, 64, 128); |
||||||
|
|
||||||
|
public function __construct($dbFile, $minId = 0) |
||||||
|
{ |
||||||
|
fclose(fopen($dbFile, 'a')); // create file if not exists |
||||||
|
$this->hDatabase = fopen($dbFile, 'r+'); |
||||||
|
$this->minId = $minId; |
||||||
|
} |
||||||
|
|
||||||
|
public function __destruct() |
||||||
|
{ |
||||||
|
fclose($this->hDatabase); |
||||||
|
} |
||||||
|
|
||||||
|
public function isPublished($id) |
||||||
|
{ |
||||||
|
$id -= $this->minId; |
||||||
|
if ($id < 0) return true; |
||||||
|
$pos = intval($id/8); |
||||||
|
fseek($this->hDatabase, $pos); |
||||||
|
$status = ord(fgetc($this->hDatabase)); |
||||||
|
return (bool)($status & $this->bits[$id % 8]); |
||||||
|
} |
||||||
|
|
||||||
|
public function setPublished($id) |
||||||
|
{ |
||||||
|
$id -= $this->minId; |
||||||
|
if ($id < 0) return; |
||||||
|
$pos = intval($id/8); |
||||||
|
fseek($this->hDatabase, $pos); |
||||||
|
$status = ord(fgetc($this->hDatabase)); |
||||||
|
fseek($this->hDatabase, $pos); |
||||||
|
fwrite($this->hDatabase, chr($status | $this->bits[$id % 8])); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
function getRssFeed($feed_uri, $reload = false) |
||||||
|
{ |
||||||
|
$meta_file = md5($feed_uri) . '.json'; |
||||||
|
$meta = @json_decode(@file_get_contents($meta_file), true); |
||||||
|
|
||||||
|
$ch = curl_init(); |
||||||
|
curl_setopt($ch, CURLOPT_URL, $feed_uri); |
||||||
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); |
||||||
|
curl_setopt($ch, CURLOPT_HEADER, true); |
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||||||
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
||||||
|
if (!$reload) { |
||||||
|
if (isset($meta['etag'])) |
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('If-None-Match: ' . $meta['etag'])); |
||||||
|
if (isset($meta['lastModified'])) |
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array('If-Modified-Since: ' . $meta['lastModified'])); |
||||||
|
} |
||||||
|
|
||||||
|
$response = curl_exec($ch); |
||||||
|
$info = curl_getinfo($ch); |
||||||
|
|
||||||
|
$http_code = $info['http_code']; |
||||||
|
if ($http_code !== 200) |
||||||
|
return false; |
||||||
|
|
||||||
|
$headers = substr($response, 0, $info['header_size']); |
||||||
|
$headers_arr = array(); |
||||||
|
foreach (explode("\n", $headers) as $h) { |
||||||
|
$h = explode(':', $h, 2); |
||||||
|
if (!isset($h[1])) continue; |
||||||
|
$key = $h[0]; |
||||||
|
$value = trim($h[1]); |
||||||
|
if (!isset($headers_arr[$key])) |
||||||
|
$headers_arr[$key] = $value; |
||||||
|
elseif (is_array($headers[$key])) |
||||||
|
$headers_arr[$key][] = $value; |
||||||
|
else |
||||||
|
$headers_arr[$key] = array($headers_arr[$key], $value); |
||||||
|
} |
||||||
|
|
||||||
|
$meta = array(); |
||||||
|
if (isset($headers_arr['Etag'])) |
||||||
|
$meta['etag'] = $headers_arr['Etag']; |
||||||
|
if (isset($headers_arr['Last-Modified'])) |
||||||
|
$meta['lastModified'] = $headers_arr['Last-Modified']; |
||||||
|
file_put_contents($meta_file, json_encode($meta)); |
||||||
|
|
||||||
|
$body = substr($response, $info['header_size']); |
||||||
|
|
||||||
|
return @simplexml_load_string($body); |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
<?php |
||||||
|
$sdd_db_host='localhost'; |
||||||
|
// Имя базы данных с которой вы хотите работать, так как их может быть множество |
||||||
|
$sdd_db_name=''; |
||||||
|
// логин доступ к базе данных |
||||||
|
$sdd_db_user=''; |
||||||
|
// пароль доступа к базе данных |
||||||
|
$sdd_db_pass=''; |
||||||
|
// устанавливаем связь с сервером |
||||||
|
@mysql_connect($sdd_db_host,$sdd_db_user,$sdd_db_pass); |
||||||
|
// переключаемся на нужную нам базу данных |
||||||
|
@mysql_select_db($sdd_db_name); |
||||||
|
// делаем выборку из таблицы |
||||||
|
mysql_query("SET NAMES utf8"); |
||||||
|
$domain=""; |
||||||
|
|
||||||
|
$rpcuser = 'LOGIN'; |
||||||
|
$rpcpassword = 'PASSWORD'; |
||||||
|
$rpchost = '127.0.0.1'; |
||||||
|
$rpcport = 28332; |
||||||
|
?> |
@ -0,0 +1,6 @@ |
|||||||
|
<?php |
||||||
|
public $rpcuser = 'LOGIN'; |
||||||
|
public $rpcpassword = 'PASSWORD'; |
||||||
|
public $rpchost = '127.0.0.1'; |
||||||
|
public $rpcport = 28332; |
||||||
|
?> |
@ -0,0 +1,168 @@ |
|||||||
|
<?php |
||||||
|
//require("settings.php"); |
||||||
|
class TwisterPost |
||||||
|
{ |
||||||
|
|
||||||
|
// public $user = ''; |
||||||
|
require("settings.php"); |
||||||
|
//public $rpcuser = ''; |
||||||
|
//public $rpcpassword = ''; |
||||||
|
//public $rpchost = '127.0.0.1'; |
||||||
|
//public $rpcport = 28332; |
||||||
|
|
||||||
|
public $lastError = null; |
||||||
|
|
||||||
|
protected $maxId = false; |
||||||
|
|
||||||
|
// see updateSeenHashtags in https://github.com/miguelfreitas/twister-core/blob/master/src/twister.cpp |
||||||
|
protected $hashBreakChars = " \n\t.,:/?!"; |
||||||
|
|
||||||
|
public function __construct($user) |
||||||
|
{ |
||||||
|
$this->user = $user; |
||||||
|
} |
||||||
|
|
||||||
|
public function runRpcCommand($method, $params = array()) |
||||||
|
{ |
||||||
|
$request = new stdClass; |
||||||
|
$request->jsonrpc = '2.0'; |
||||||
|
$request->id = uniqid('', true); |
||||||
|
$request->method = $method; |
||||||
|
$request->params = $params; |
||||||
|
|
||||||
|
if (defined('JSON_UNESCAPED_UNICODE')) { // PHP 5.4+: |
||||||
|
$request_json = json_encode($request, JSON_UNESCAPED_UNICODE); |
||||||
|
} else { // PHP 5.3: |
||||||
|
$request_json = json_encode($request); |
||||||
|
$request_json = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($matches){return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UTF-16');}, $request_json); |
||||||
|
} |
||||||
|
|
||||||
|
$ch = curl_init(); |
||||||
|
$url = "http://{$this->rpchost}:{$this->rpcport}/"; |
||||||
|
curl_setopt($ch, CURLOPT_URL, $url); |
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array( |
||||||
|
'Authorization: Basic ' . base64_encode($this->rpcuser . ':' . $this->rpcpassword), |
||||||
|
'Content-Type: application/json; charset=utf-8' |
||||||
|
)); |
||||||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_json); |
||||||
|
curl_setopt($ch, CURLOPT_HEADER, 0); |
||||||
|
curl_setopt($ch, CURLOPT_POST, 1); |
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
||||||
|
|
||||||
|
$response_json = curl_exec($ch); |
||||||
|
|
||||||
|
if (curl_errno($ch) || curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) { |
||||||
|
curl_close($ch); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
curl_close( $ch ); |
||||||
|
|
||||||
|
$response = json_decode($response_json); |
||||||
|
|
||||||
|
if (!is_object( $response ) || |
||||||
|
(isset( $response->error ) && !is_null($response->error)) || |
||||||
|
!isset( $response->result ) || !isset( $response->id ) || $response->id !== $request->id) |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
return $response->result; |
||||||
|
} |
||||||
|
|
||||||
|
public function updateMaxId() |
||||||
|
{ |
||||||
|
$this->lastError = null; |
||||||
|
$this->maxId = -1; |
||||||
|
|
||||||
|
$result = $this->runRpcCommand('getposts', array(1, array(array('username' => $this->user)))); |
||||||
|
if ($result === false || (isset($result->code) && $result->code < 0)) { |
||||||
|
$this->maxId = false; |
||||||
|
$this->lastError = $result; |
||||||
|
return false; |
||||||
|
} |
||||||
|
foreach($result as $item) { |
||||||
|
if (isset($item->userpost->n) && $item->userpost->n === $this->user) { |
||||||
|
$this->maxId = $item->userpost->k; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$result = $this->runRpcCommand('dhtget', array($this->user, 'status', 's')); |
||||||
|
if ($result === false || (isset($result->code) && $result->code < 0)) { |
||||||
|
$this->maxId = false; |
||||||
|
$this->lastError = $result; |
||||||
|
return false; |
||||||
|
} |
||||||
|
foreach($result as $item) { |
||||||
|
if (isset($item->sig_user) && isset($item->p) && $item->sig_user === $this->user) { |
||||||
|
if (isset($item->p->seq)) { |
||||||
|
$this->maxId = max($this->maxId, $item->p->seq); |
||||||
|
} |
||||||
|
if (isset($item->p->v) && isset($item->p->v->userpost) && isset($item->p->v->userpost->k)) { |
||||||
|
$this->maxId = max($this->maxId, $item->p->v->userpost->k); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public function postMessage($text) |
||||||
|
{ |
||||||
|
$this->lastError = null; |
||||||
|
|
||||||
|
if ($this->maxId === false) { |
||||||
|
if (!$this->updateMaxId()) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$k = $this->maxId + 1; |
||||||
|
$result = $this->runRpcCommand('newpostmsg', array($this->user, $k, $text)); |
||||||
|
if (!isset($result->userpost) || !isset($result->userpost->k) || ($result->userpost->k != $k)) { |
||||||
|
$this->maxId = false; |
||||||
|
$this->lastError = $result; |
||||||
|
return false; |
||||||
|
} |
||||||
|
$this->maxId = $k; |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public function prettyPrint($title, $url = '', $tags = null, $maxLen = 140) |
||||||
|
{ |
||||||
|
$title_len = mb_strlen($title); |
||||||
|
$url_len = mb_strlen($url); |
||||||
|
|
||||||
|
if ($url_len === 0) { |
||||||
|
if ($title_len > $maxLen) { |
||||||
|
$text = rtrim(mb_substr($title, 0, $maxLen - 1), ' ') . '…'; |
||||||
|
} else { |
||||||
|
$text = $title; |
||||||
|
} |
||||||
|
} else if ($title_len + 1 + $url_len > $maxLen) { |
||||||
|
$text = rtrim(mb_substr($title, 0, $maxLen - 2 - $url_len), ' ') . '… ' . $url; |
||||||
|
} else { |
||||||
|
$text = $title . ' ' . $url; |
||||||
|
} |
||||||
|
|
||||||
|
if (isset($tags)) { |
||||||
|
foreach ($tags as $tag) { |
||||||
|
$tagText = (string)$tag; |
||||||
|
$tagText = strtr($tagText, $this->hashBreakChars, str_repeat('_', strlen($this->hashBreakChars))); |
||||||
|
$tagText = trim($tagText, '_'); |
||||||
|
$tagText = preg_replace('#(?<=_)_+#', '', $tagText); |
||||||
|
if (!empty($tagText)) { |
||||||
|
$text .= ' #' . $tagText; |
||||||
|
} |
||||||
|
} |
||||||
|
if(mb_strlen($text) > $maxLen) { |
||||||
|
$text = mb_substr($text, 0, $maxLen + 1); |
||||||
|
$pos = mb_strrpos($text, ' '); |
||||||
|
$text = mb_substr($text, 0, $pos); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $text; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
<?php |
||||||
|
require("settings.php"); |
||||||
|
$sql="SELECT * |
||||||
|
FROM `rss` |
||||||
|
WHERE `active`='1'"; |
||||||
|
$result=mysql_query($sql) or die(mysql_error()); |
||||||
|
while ($row = mysql_fetch_array($result)) { |
||||||
|
$account=$row['account']; |
||||||
|
$url=$row['url']; |
||||||
|
$id=$row['id']; |
||||||
|
|
||||||
|
echo $account; |
||||||
|
echo $url; |
||||||
|
echo $id; |
||||||
|
$actual_link = "http://".$domain."/cms/loader.php?id=".$id; |
||||||
|
$a = file_get_contents($actual_link); |
||||||
|
echo '<br>'; |
||||||
|
echo($a); |
||||||
|
//if ($a !== "Cannot read rss or it is up to date"){ |
||||||
|
// $datetime=date("d / F / Y ").date('H:i:s'); |
||||||
|
// $sql="UPDATE `rss` SET `lastupdate`='$datetime' WHERE `id`='$id'"; |
||||||
|
// echo $sql; |
||||||
|
// $result=mysql_query($sql) or die(mysql_error()); |
||||||
|
//}else {echo "olo";} |
||||||
|
echo '<br>'; |
||||||
|
} |
||||||
|
|
||||||
|
// open |
||||||
|
?> |
Loading…
Reference in new issue