diff --git a/MastodonBotPHP/Mastodon.php b/MastodonBotPHP/Mastodon.php new file mode 100644 index 0000000..09b442e --- /dev/null +++ b/MastodonBotPHP/Mastodon.php @@ -0,0 +1,46 @@ +token = $token; + $this->instance_url = $instance_url; + } + + public function postStatus($status) + { + return $this->callAPI('/api/v1/statuses', 'POST', $status); + } + + public function uploadMedia($media) + { + return $this->callAPI('/api/v1/media', 'POST', $media); + } + + public function callAPI($endpoint, $method, $data) + { + $headers = [ + 'Authorization: Bearer '.$this->token, + 'Content-Type: multipart/form-data', + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->instance_url.$endpoint); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $reply = curl_exec($ch); + + if (!$reply) { + return json_encode(['ok'=>false, 'curl_error_code' => curl_errno($ch_status), 'curl_error' => curl_error(ch_status)]); + } + curl_close($ch); + + return json_decode($reply, true); + } + } diff --git a/MastodonBotPHP/examples/media_bot.php b/MastodonBotPHP/examples/media_bot.php new file mode 100644 index 0000000..e660721 --- /dev/null +++ b/MastodonBotPHP/examples/media_bot.php @@ -0,0 +1,30 @@ + $curl_file, + ]; + + $response = $mastodon->uploadMedia($body); + + $file_id = $response['id']; + + $statusText = 'This is a status'; + + $status_data = [ + 'status' => $statusText, + 'visibility' => $visibility, + 'language' => $language, + 'media_ids[]' => $file_id, + ]; + + $mastodon->postStatus($status_data); diff --git a/MastodonBotPHP/examples/reddit_bot.php b/MastodonBotPHP/examples/reddit_bot.php new file mode 100644 index 0000000..2d1e889 --- /dev/null +++ b/MastodonBotPHP/examples/reddit_bot.php @@ -0,0 +1,77 @@ + $lastDate) && !$itemData['is_self']) { + $post = new BlogPost(); + $post->link = $itemData['url']; + $post->title = $itemData['title']; + $post->category = $itemData['subreddit']; + $post->nsfw = $itemData['over_18']; + + array_push($statuses, $post); + if (!$first_article) { + $myfile = fopen($file, 'w') or die('Unable to open file!'); + fwrite($myfile, $ts); + fclose($myfile); + $first_article = true; + } + } + } + + $statuses = array_reverse($statuses); + $mastodon = new MastodonAPI($token, $base_url); + + foreach ($statuses as $s) { + $status_data = [ + 'visibility' => $visibility, + 'language' => $language, + ]; + + $statusText = $s->title.$tagline.$s->link.' '; + + if ($s->nsfw) { + $status_data['status'] = 'NSFW'; + $status_data['spoiler_text'] = $statusText; + } else { + $status_data['status'] = $statusText; + } + + $mastodon->postStatus($status_data); + } + + class BlogPost + { + public $ts; + public $link; + public $category; + public $title; + public $nsfw; + } diff --git a/MastodonBotPHP/examples/rss_bot.php b/MastodonBotPHP/examples/rss_bot.php new file mode 100644 index 0000000..6165583 --- /dev/null +++ b/MastodonBotPHP/examples/rss_bot.php @@ -0,0 +1,79 @@ +channel->item as $item) { + $ts = strtotime($item->pubDate); + if ($lastDate == '' || $ts > $lastDate) { + $post = new BlogPost(); + $post->link = (string) $item->link; + $post->title = (string) $item->title; + + $post->category = $item->category; + + array_push($statuses, $post); + if (!$first_article) { + $myfile = fopen($file, 'w') or die('Unable to open file!'); + fwrite($myfile, $ts); + fclose($myfile); + $first_article = true; + } + } + } + + $statuses = array_reverse($statuses); + $mastodon = new MastodonAPI($token, $base_url); + + foreach ($statuses as $s) { + $statusText = $s->title.' leggi su '.$s->link.' '; + + foreach ($s->category as $c) { + $statusText = $statusText.'#'.formatHashTag($c).' '; + } + + $status_data = [ + 'status' => $statusText, + 'visibility' => $visibility, + 'language' => $language, + ]; + + $mastodon->postStatus($status_data); + } + + function formatHashTag($category) + { + $filtered = str_replace('/', ' ', $category); + $upper = ucwords($filtered); + + return str_replace(' ', '', $upper); + } + + class BlogPost + { + public $ts; + public $link; + public $category; + public $title; + }