Mastodon API WIP

This commit is contained in:
Alexander Yakovlev 2017-06-16 16:33:01 +07:00
parent 47d14f71c0
commit 2dd252673c
4 changed files with 478 additions and 22 deletions

89
bot.php
View File

@ -1,10 +1,14 @@
<?php
require_once ("vendor/autoload.php");
use Symfony\Component\Yaml\Yaml;
use Mremi\UrlShortener\Model\Link;
use Mremi\UrlShortener\Provider\Bitly\BitlyProvider;
use Mremi\UrlShortener\Provider\Bitly\GenericAccessTokenAuthenticator;
use Baguette\Mastodon;
$config = Yaml::parse(file_get_contents('config.yml'));
$lastrun = 0;
if (file_exists('.lastrun')) {
if (file_exists('.lastrun') && !$config['DRY_RUN']) {
$lastrun = file_get_contents('.lastrun');
}
@ -19,6 +23,18 @@ function get_text($url) {
return $resp;
}
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$str = trim($str);
$buff = strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
$string = get_text('https://ifhub.club/rss/new/');
$service = new \Sabre\Xml\Service();
$service->elementMap = [
@ -32,32 +48,73 @@ $service->elementMap = [
$articles = $service->parse($string)[0]['value'];
unset($string);
$pandoc = new \Pandoc\Pandoc();
$bitlyProvider = new BitlyProvider(
new GenericAccessTokenAuthenticator($config['BITLY_TOKEN'])
);
$telegram = new Longman\TelegramBot\Telegram(
$config['TELEGRAM_API_KEY'],
$config['TELEGRAM_BOT_NAME']
);
$mastodon = Mastodon\session(
$config['MASTODON_SERVER'],
$config['MASTODON_CLIENT_ID'],
$config['MASTODON_SECRET'],
[
'scope' => 'read write',
]
);
foreach ($articles as $article) {
if (strtotime($article['pubDate']) <= $lastrun) {
continue;
}
$title = $article['title'];
$link = $article['link'];
$link = new Link;
$link->setLongUrl($article['link']);
$bitlyProvider->shorten($link);
$link = $link->getShortUrl();
$description = $article['description'];
// $description = strip_tags($description);
$image = NULL;
preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $description, $image);
if (isset($image[1])) {
$image = $image[1];
}
$description = strip_tags($description, 'img');
$description = $pandoc->convert($description, "html", "markdown_github");
$description = str_replace('####', '#', $description);
$description = "$title\n\n".$description;
$description .= ": $link";
$description = str_replace(' Читать дальше', '', $description);
if (!$config['DRY_RUN']) {
try {
$telegram = new Longman\TelegramBot\Telegram($config['API_KEY'], $config['BOT_NAME']);
$result = \Longman\TelegramBot\Request::sendMessage([
'chat_id' => $config['CHAT_ID'],
'text' => $description,
'parse_mode' => 'Markdown'
]);
} catch (Longman\TelegramBot\Exception\TelegramException $e) {
echo $e;
if ($config['TELEGRAM'] === true) {
$tdescription = "$title\n\n".$description;
$tdescription .= ": $link";
try {
$result = \Longman\TelegramBot\Request::sendMessage([
'chat_id' => $config['TELEGRAM_CHAT_ID'],
'text' => $tdescription,
'parse_mode' => 'Markdown'
]);
unset($tdescription);
} catch (Longman\TelegramBot\Exception\TelegramException $e) {
echo $e;
}
}
if ($config['MASTODON'] === true) {
$mdescription = "$title\n\n".ellipse($description, 400);
$mdescription .= ": $link";
if ($image) {
$attachment = Mastodon\request($mastodon, 'POST', '/api/v1/media', [
'file' => $image
], Mastodon\Entity\Account::class);
$mdescription .= $attachment->url;
}
echo $mdescription;
//$mastodon->postStatus(Mastodon\toot($mdescription));
}
} else {
echo $description;
echo $description."\n";
echo $link;
}
}
file_put_contents('.lastrun', time());
if (!$config['DRY_RUN']) {
file_put_contents('.lastrun', time());
}

View File

@ -3,6 +3,7 @@
"longman/telegram-bot": "^0.44.1",
"sabre/xml": "^2.0",
"ryakad/pandoc-php": "^1.0",
"symfony/yaml": "^3.2"
"symfony/yaml": "^3.2",
"mremi/url-shortener": "^2.1"
}
}

394
composer.lock generated
View File

@ -4,8 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "3b9571489db96ed50e67fe5c3156da05",
"content-hash": "a72d9afdda2b504f52dfc273b73835c5",
"hash": "71302a13e71405a5c30d66ccb32c62da",
"content-hash": "a474f6360fb73f8cd1cfc26729f5c03a",
"packages": [
{
"name": "guzzlehttp/guzzle",
@ -316,6 +316,55 @@
],
"time": "2017-03-13 07:08:03"
},
{
"name": "mremi/url-shortener",
"version": "v2.1.0",
"source": {
"type": "git",
"url": "https://github.com/mremi/UrlShortener.git",
"reference": "ad47697e899d30e167c45c5e937db421cf768dc1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mremi/UrlShortener/zipball/ad47697e899d30e167c45c5e937db421cf768dc1",
"reference": "ad47697e899d30e167c45c5e937db421cf768dc1",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.0",
"php": "^5.5 || ^7.0",
"symfony/console": "^2.7 || ^3.1"
},
"require-dev": {
"fabpot/php-cs-fixer": "~0.1 || ~1.0",
"phpunit/phpunit": "~4.8",
"symfony/phpunit-bridge": "~2.7 || ~3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Mremi\\UrlShortener\\": "src/Mremi/UrlShortener"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Rémi Marseille",
"email": "marseille.remi@gmail.com"
}
],
"description": "A PHP5 library using API to shorten/expand URL",
"homepage": "https://github.com/mremi/UrlShortener",
"keywords": [
"api",
"shortener",
"url"
],
"time": "2017-03-29 18:03:19"
},
{
"name": "psr/http-message",
"version": "1.0.1",
@ -413,6 +462,71 @@
],
"time": "2016-10-10 12:19:37"
},
{
"name": "respect/validation",
"version": "1.1.12",
"source": {
"type": "git",
"url": "https://github.com/Respect/Validation.git",
"reference": "5ab87d1dd932872f6670136a513f72ff9ea41c67"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Respect/Validation/zipball/5ab87d1dd932872f6670136a513f72ff9ea41c67",
"reference": "5ab87d1dd932872f6670136a513f72ff9ea41c67",
"shasum": ""
},
"require": {
"php": ">=5.4",
"symfony/polyfill-mbstring": "^1.2"
},
"require-dev": {
"egulias/email-validator": "~1.2",
"malkusch/bav": "~1.0",
"mikey179/vfsstream": "^1.5",
"phpunit/phpunit": "~4.0",
"symfony/validator": "~2.6.9",
"zendframework/zend-validator": "~2.3"
},
"suggest": {
"egulias/email-validator": "Strict (RFC compliant) email validation",
"ext-bcmath": "Arbitrary Precision Mathematics",
"ext-mbstring": "Multibyte String Functions",
"fabpot/php-cs-fixer": "Fix PSR2 and other coding style issues",
"malkusch/bav": "German bank account validation",
"symfony/validator": "Use Symfony validator through Respect\\Validation",
"zendframework/zend-validator": "Use Zend Framework validator through Respect\\Validation"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1-dev"
}
},
"autoload": {
"psr-4": {
"Respect\\Validation\\": "library/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD Style"
],
"authors": [
{
"name": "Respect/Validation Contributors",
"homepage": "https://github.com/Respect/Validation/graphs/contributors"
}
],
"description": "The most awesome validation engine ever created for PHP",
"homepage": "http://respect.github.io/Validation/",
"keywords": [
"respect",
"validation",
"validator"
],
"time": "2017-03-14 09:44:11"
},
{
"name": "ryakad/pandoc-php",
"version": "v1.0.0",
@ -553,6 +667,190 @@
],
"time": "2016-11-16 00:41:01"
},
{
"name": "symfony/console",
"version": "v3.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "70d2a29b2911cbdc91a7e268046c395278238b2e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/70d2a29b2911cbdc91a7e268046c395278238b2e",
"reference": "70d2a29b2911cbdc91a7e268046c395278238b2e",
"shasum": ""
},
"require": {
"php": ">=5.5.9",
"symfony/debug": "~2.8|~3.0",
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"symfony/dependency-injection": "<3.3"
},
"require-dev": {
"psr/log": "~1.0",
"symfony/config": "~3.3",
"symfony/dependency-injection": "~3.3",
"symfony/event-dispatcher": "~2.8|~3.0",
"symfony/filesystem": "~2.8|~3.0",
"symfony/http-kernel": "~2.8|~3.0",
"symfony/process": "~2.8|~3.0"
},
"suggest": {
"psr/log": "For using the console logger",
"symfony/event-dispatcher": "",
"symfony/filesystem": "",
"symfony/process": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.3-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Component\\Console\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
"time": "2017-06-02 19:24:58"
},
{
"name": "symfony/debug",
"version": "v3.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
"reference": "e9c50482841ef696e8fa1470d950a79c8921f45d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/debug/zipball/e9c50482841ef696e8fa1470d950a79c8921f45d",
"reference": "e9c50482841ef696e8fa1470d950a79c8921f45d",
"shasum": ""
},
"require": {
"php": ">=5.5.9",
"psr/log": "~1.0"
},
"conflict": {
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
},
"require-dev": {
"symfony/http-kernel": "~2.8|~3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.3-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Component\\Debug\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
"time": "2017-06-01 21:01:25"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "f29dca382a6485c3cbe6379f0c61230167681937"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937",
"reference": "f29dca382a6485c3cbe6379f0c61230167681937",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"suggest": {
"ext-mbstring": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Polyfill\\Mbstring\\": ""
},
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for the Mbstring extension",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"mbstring",
"polyfill",
"portable",
"shim"
],
"time": "2017-06-09 14:24:12"
},
{
"name": "symfony/yaml",
"version": "v3.2.8",
@ -607,6 +905,98 @@
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
"time": "2017-05-01 14:55:58"
},
{
"name": "zonuexe/mastodon-api",
"version": "0.0.6",
"source": {
"type": "git",
"url": "https://github.com/BaguettePHP/mastodon-api.git",
"reference": "ee030a06d5018b54b55352deb988582b30f1dca1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/BaguettePHP/mastodon-api/zipball/ee030a06d5018b54b55352deb988582b30f1dca1",
"reference": "ee030a06d5018b54b55352deb988582b30f1dca1",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.2",
"respect/validation": "^1.1",
"zonuexe/objectsystem": "^0.6.0"
},
"require-dev": {
"filp/whoops": "^2.1",
"monolog/monolog": "^1.22",
"paragonie/random_compat": "^2.0",
"phpmd/phpmd": "^2.6",
"phpunit/phpunit": "^4.8",
"symfony/polyfill-php70": "^1.3",
"symfony/var-dumper": "^3.2",
"vlucas/phpdotenv": "^2.4",
"zonuexe/simple-routing": "^0.5.3"
},
"suggest": {
"vlucas/phpdotenv": "Load .env format config file"
},
"type": "library",
"autoload": {
"files": [
"src/functions.php",
"src/Entity/helpers.php"
],
"psr-4": {
"Baguette\\Mastodon\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-3.0"
],
"description": "A PHP interface for Mastodon.",
"time": "2017-05-29 16:21:47"
},
{
"name": "zonuexe/objectsystem",
"version": "0.6.0",
"source": {
"type": "git",
"url": "https://github.com/BaguettePHP/objectsystem.git",
"reference": "9a5f4413b82ea394c1018d40098269c86ac232c1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/BaguettePHP/objectsystem/zipball/9a5f4413b82ea394c1018d40098269c86ac232c1",
"reference": "9a5f4413b82ea394c1018d40098269c86ac232c1",
"shasum": ""
},
"require": {
"php": ">=5.5|>=7.0"
},
"require-dev": {
"phploc/phploc": "*",
"phpmd/phpmd": "@stable",
"phpunit/phpunit": "^5.5|^4.8",
"theseer/phpdox": "^0.8"
},
"type": "library",
"autoload": {
"psr-4": {
"Teto\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "USAMI Kenta",
"email": "tadsan@zonu.me"
}
],
"description": "Object system for PHP",
"time": "2016-10-08 15:52:57"
}
],
"packages-dev": [],

View File

@ -1,4 +1,12 @@
DRY_RUN: true
API_KEY: some-key-here
BOT_NAME: bot name
CHAT_ID: id
TELEGRAM: true
MASTODON: true
MASTODON_CLIENT_ID: some-id
MASTODON_SECRET: oauth_secret
MASTODON_ACCESS_TOKEN: token
MASTODON_SERVER: https://botsin.space
MASTODON_USER: user
TELEGRAM_API_KEY: some-key-here
TELEGRAM_BOT_NAME: bot name
TELEGRAM_CHAT_ID: id
BITLY_TOKEN: token